Internet Windows Android

Conectarea la o sursă de date externă 1s 8.3. Surse de date externe

Versiunea 8.2.14.533 este în sfârșit o versiune mai mult sau mai puțin stabilă a celei de-a 14-a lansări a platformei. În cele din urmă, s-a prezentat oportunitatea de a încerca o oportunitate minunată - „surse de date externe”.

De ce este această oportunitate atât de interesantă? Orice persoană care a programat în 1C și este destul de familiarizată cu SQL și este cel puțin în general familiarizată cu arhitectura și principiile dezvoltării altor platforme tehnologice pentru aplicații de afaceri vă va spune cu fermitate ce îi place cel mai mult la 1C. Desigur, generatorul de interogări este cel mai convenabil și mai atent mecanism pentru scrierea de interogări pentru preluarea datelor din structuri relaționale pe care le-am întâlnit personal vreodată. Și acum 1C ne-a oferit o oportunitate atât de minunată de a-l folosi nu numai cu 1C, ci și cu orice alte mese. Doar că există o mulțime de „muște în unguent” turnate în acest „butoi de miere”. Să începem cu începutul:

1) Configurare și utilizare - nu va funcționa fără „dans cu o tamburină”

A) Adăugați o sursă de date externă - nu pare complicat
b) bifați caseta de selectare „Selectați din listă” - obligatoriu - acest lucru este necesar pentru a verifica funcționalitatea la început și vă va salva de probleme inutile
V)
(IMG:http://pics.livejournal.com/comol/pic/0000cr1r.png)
- asigurați-vă că faceți clic pe „...” - conexiunea este ODBC. Nu OLEDB cum suntem toți obișnuiți, ci cu un nivel mai jos

Dar fii aici FOARTE ATENT.

Acesta este un driver ODBC - dacă utilizați versiunea client-server, acesta trebuie să fie pe server. Dacă dezvoltați pe un sistem și lucrați pe altul (cum este de obicei cazul), asigurați-vă că nu vă așteaptă nicio surpriză. O recomandare ciudată, dar alegeți cel mai vechi sau cel mai comun driver dacă nu vă îngrijorează în mod deosebit viteza și nu intenționați să depășiți capacitățile standardului SQL92. Acest lucru vă va oferi o compatibilitate mai bună. De exemplu, pentru SQL Server 2008, cel mai bun driver va fi SQL Server Native Client 11, dar recomand să alegeți doar SQL Server, altfel acest client foarte nativ va trebui instalat fie pe server, fie pe toate mașinile client (dacă se utilizează versiunea fișierului), iar beneficiul este special pentru simplu, el nu vă va oferi nicio sarcină.

E) Casete de dialog pentru selectarea serverului standard

G) Selectați tabelul și detaliile... o oportunitate minunată - îl puteți redenumi imediat după bunul plac (și detaliile de asemenea), iar în proprietăți veți vedea numele câmpurilor sursei de date

Z) Și acum îl lansați, deschideți designerul de interogări - selectați prostește toate înregistrările din tabel și OPA - o eroare. Ce să fac? Dacă aveți o interfață gestionată, uitați-vă la meniul de service, iar dacă una obișnuită...
Eu personal am folosit acest cod:

Parametri = ExternalDataSources.DAX.GetGeneralConnectionParameters();
Parameters.AuthenticationStandard = Adevărat;
Parameters.UserName = "sa";
Parametri.Parola = "pas";
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=database";
Parameters.DBMS = "MSSQLServer";

ExternalDataSources.DAX.SetCommonConnectionParameters(Parameters);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parameters);
ExternalDataSources.DAX.SetSessionConnectionParameters(Parameters);

ExternalDataSources.DAX.SetConnection();

Este posibil ca unele piese să nu fie necesare, dar funcționează. Trebuie să rulați codul O SINGURA DATA. După care va fi normal să ne conectăm... misticism desigur - de ce a fost necesar acest lucru nu este clar...

2) Surse de date numai pentru citire
Da, miracolele nu se întâmplă... dar uneori vrei așa...

3) NU POT FI UTILIZATE ÎMPREUNĂ CU SURSE INTERNE DE DATE
Personal, acest fapt m-a ucis pe loc.

Cum poate fi asta... ceea ce așteptam și deja ne-am imaginat și ne-am lins buzele despre cum ne vom combina acum datele cu 1C într-o singură solicitare, îl vom restrânge - grupați-l, inserați-l în raport, dar nu este cazul ...

Dar, desigur, acest lucru nu îi oprește pe oamenii experimentați... ce gând mi-a venit în minte? Așa este - tabele temporare:

4) NU POT FI UTILIZATE IMPREUNA CU TABELE TEMPORARE

Dar asta nu mai arată ca dificultăți tehnologice, ci seamănă foarte mult cu ceea ce vor ei să facem „pentru ca viața să nu pară paradis” (IMG:).

5) Poate fi utilizat numai în conexiuni ACS

Pentru cei care nu știu, acesta se află în ACS în fila „Linkuri seturi de date”. Le folosesti des? Confortabil? Se pare că vor să ne oblige să le folosim mai des. Numai că există o coloană „Condiție de comunicare” și „Parametru de comunicare”. Nu am găsit un exemplu de utilizare a acestora în nicio configurație standard și, cumva, totul nu este transparent nici în documentație, nici în munca lui Khrustaleva. Poate cineva să-mi explice cum funcționează „condiția de conectare”. Dacă scrieți Atribute sursă = Atribute receptor acolo, nu funcționează. Desigur, condiția poate fi scrisă în câmpul „Expresie” - în cele mai multe cazuri este suficient... dar cumva nu funcționează foarte ușor.

În total, această problemă a fost rezolvată anterior undeva astfel:

Funcția InitializeDataSource()

DateStart = SettingsComposer.Settings.DataParameters.Items.Value;
DataCon = SettingsBuilder.Settings.DataParameters.Items.Value;
Dacă DataCon > „20100101” Atunci
DataCon = "20100101";
endIf;

CN = New QualifiersNumbers(15,2);
KS = NewStringQualifiers(255);

ArrayNumber = New Array();
ArrayNumber.Add(Type("Number");

ArrayString = New Array();
ArrayString.Add(Type(„String”));

ArrayData = New Array();
ArrayDate.Add(Type ("Data"));

//Vom completa costul contabil în tabel
TypeNumber = New DescriptionTypes(ArrayNumber, CN);
TypeString = New TypeDescription(ArrayString, KS);
TypeDate = New TypeDescription(ArrayDate);

//tabel pentru încărcarea datelor din SQL
TZ = New ValueTable();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Qnty", TypeNumber);
TK.Columns.Add(„Perioada”, DataType);

TK.Indici.Add(„Perioada”);

//Conectează-te la SQL
Șir de conexiune = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Utilizați procedura pentru Pregătire=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Criptare pentru date=False;Etichetă cu colaţionarea coloanelor atunci când este posibil=Fals;Catalog iniţial=Rapoarte";
Conexiune = New COMObject("ADODB.Connection");
Comanda = New COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
Data = "";
Atentat, încercare
Connection.Open(AbbrLP(ConnectionString));
Command.ActiveConnection = Conexiune;
Command.CommandText = "Selectați * din PH unde punct >= "" + String(Format(DateStart, "DF=aaaaMMzz")) + "" și punct RecordSet = Command.Execute();
RecordSet.MoveFirst();
Excepție
Returnarea specificațiilor tehnice;
EndTempt;

În timp ce RecordSet.EOF = Buclă falsă
Linie = TZ.Add();
Row.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Row.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Row.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
EndCycle;

Solicitare = Solicitare nouă();
VrTable = New TemporaryTableManager();
Query.SetParameter("vrDataTable", TK);
Query.SetParameter("Data de începere", Data de începere);
Request.SetParameter("DataCon", DateCon);
Query.Text = „SELECT
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Period
|Plasați DataTable
|DIN
| &vDataTable AS vrDataTable
|UNDE
| vrDataTable.Period >= &DateStart
| Și vrDataTable.Period Query.Execute();
TZ = nedefinit;

Solicitare = Solicitare nouă;
Query.TemporaryTableManager = VrTable;
Query.Text = "Iată o interogare care implică un tabel variabil";

Rezultat = Query.Run();
Rezultatul returnat;

EndFunction

ExternalSet = InitializeDataSource();
DataSet = Structură nouă();
DataSet.Insert ("Tabel SQL", ExternalSet);
TypicalReports.GenerateTypicalReport(ThisObject, Result, Decryption Data, OutputToReportForm, DataSet);

De fapt, nu există multe linii de cod și sunt destul de standard... în acest caz, puteți utiliza întreaga funcționalitate a designerului de interogări și puteți oferi doar funcția DATA COMPOSITION la ACS

Dar cu siguranță nu arată la fel de frumos... și de fiecare dată trebuie să scrieți cod pentru a încărca valori într-un tabel și a verifica dacă ați greșit în numele detaliilor... și ce ni s-a dat în 1C pare cumva cu jumătate de inimă. Încă nu m-am hotărât care este mai convenabil de utilizat. Tu decizi și scrie despre deciziile tale și despre ce te-a determinat să le faci.

[trebuie să vă înregistrați pentru a vedea linkul]

De ce este această oportunitate atât de interesantă? Orice persoană care a programat în 1C și este destul de familiarizată cu SQL și este cel puțin în general familiarizată cu arhitectura și principiile dezvoltării altor platforme tehnologice pentru aplicații de afaceri vă va spune cu fermitate ce îi place cel mai mult la 1C. Desigur, generatorul de interogări este cel mai convenabil și mai atent mecanism pentru scrierea de interogări pentru preluarea datelor din structuri relaționale pe care le-am întâlnit personal vreodată. Și acum 1C ne-a oferit o oportunitate atât de minunată de a-l folosi nu numai cu 1C, ci și cu orice alte mese. Doar că există o mulțime de „muște în unguent” turnate în acest „butoi de miere”. Să începem cu începutul:

1) Configurare și utilizare- fără „dans cu o tamburină” nu va funcționa
a) Adăugați o sursă de date externă - nu pare complicat
b) bifați caseta de selectare „Selectați din listă” - obligatoriu - acest lucru este necesar pentru a verifica funcționalitatea la început și vă va salva de probleme inutile
c) - asigurați-vă că faceți clic pe „...” - conexiunea este ODBC. Nu OLEDB cum suntem toți obișnuiți, ci cu un nivel mai jos

D) Dar aici fiți FOARTE ATENȚI.

Acesta este un driver ODBC - dacă utilizați versiunea client-server, acesta trebuie să fie pe server. Dacă dezvoltați pe un sistem și lucrați pe altul (cum este de obicei cazul), asigurați-vă că nu vă așteaptă nicio surpriză. O recomandare ciudată, dar alegeți cel mai vechi sau cel mai comun driver dacă nu vă preocupă în mod deosebit viteza și nu intenționați să depășiți capacitățile standardului SQL92. Acest lucru vă va oferi o compatibilitate mai bună. De exemplu, pentru SQL Server 2008, cel mai bun driver va fi SQL Server Native Client 11, dar recomand să alegeți doar SQL Server, altfel acest client foarte nativ va trebui instalat fie pe server, fie pe toate mașinile client (dacă se utilizează versiunea fișierului), iar beneficiul este special pentru simplu, el nu vă va oferi nicio sarcină.
e) Dialogurile de selectare a serverului standard

și DB

f) Vă recomand să răspundeți „da” la întrebarea despre salvarea parolei, altfel nu veți putea începe această afacere.
g) Selectați tabelul și detaliile... o oportunitate minunată - îl puteți redenumi imediat după bunul plac (și detaliile de asemenea), iar în proprietăți veți vedea numele câmpurilor sursei de date


h) Acum îl lansați, deschideți designerul de interogări - selectați prost toate înregistrările din tabel și OPA - o eroare. Ce să fac? Dacă aveți o interfață gestionată, uitați-vă la meniul de service, iar dacă una obișnuită...
Eu personal am folosit acest cod:
Cod 1C v 8.x Parametri = ExternalDataSources.DAX.GetGeneralConnectionParameters();
Parameters.AuthenticationStandard = Adevărat;
Parameters.UserName = "sa";
Parametri.Parola = "pas";
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=database";
Parameters.DBMS = "MSSQLServer";

ExternalDataSources.DAX.SetCommonConnectionParameters(Parameters);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parameters);
ExternalDataSources.DAX.SetSessionConnectionParameters(Parameters);

ExternalDataSources.DAX.SetConnection();
Este posibil ca unele piese să nu fie necesare, dar funcționează.
Trebuie să rulați codul O dată. După care va fi normal să ne conectăm... misticism desigur - de ce a fost necesar acest lucru nu este clar...

2) Surse de date numai pentru citire- Da, miracolele nu se întâmplă... dar uneori vrei...

3) NU POT FI UTILIZATE ÎMPREUNĂ CU SURSE INTERNE DE DATE
Personal, acest fapt m-a ucis pe loc.

Cum poate fi asta... ceea ce așteptam și deja ne-am imaginat și ne-am lins buzele despre cum ne vom combina acum datele cu 1C într-o singură solicitare, îl vom restrânge - grupați-l, inserați-l în raport, dar nu este cazul ...
Dar, desigur, acest lucru nu îi oprește pe oamenii experimentați... ce gând mi-a venit în minte? Așa este - tabele temporare:

4) NU POT FI UTILIZATE IMPREUNA CU TABELE TEMPORARE


Dar asta nu mai arată ca dificultăți tehnologice, ci seamănă foarte mult cu ceea ce vor ei să facem „pentru ca viața să nu pară un paradis”.

5) Poate fi utilizat numai în conexiuni ACS
Pentru cei care nu știu, acesta se află în ACS în fila „Linkuri seturi de date”. Le folosesti des? Confortabil? Se pare că vor să ne oblige să le folosim mai des. Numai că există o coloană „Condiție de comunicare” și „Parametru de comunicare”. Nu am găsit un exemplu de utilizare a acestora în nicio configurație standard și, cumva, totul nu este transparent nici în documentație, nici în munca lui Khrustaleva. Poate cineva să-mi explice cum funcționează „condiția de conectare”. Dacă scrieți Atribute sursă = Atribute receptor acolo, nu funcționează. Desigur, condiția poate fi scrisă în câmpul „Expresie” - în majoritatea cazurilor este suficient... dar cumva nu funcționează foarte ușor.

În total, această problemă a fost rezolvată anterior undeva astfel:
Cod 1C v 8.x Funcția InitializeDataSource()

DateStart = SettingsComposer.Settings.DataParameters.Items.Value;
DataCon = SettingsBuilder.Settings.DataParameters.Items.Value;
Dacă DataCon > „20100101” Atunci
DataCon = "20100101";
endIf;

CN = New QualifiersNumbers(15,2);
KS = NewStringQualifiers(255);

ArrayNumber = New Array();
ArrayNumber.Add(Type("Number");

ArrayString = New Array();
ArrayString.Add(Type(„String”));

ArrayData = New Array();
ArrayDate.Add(Type ("Data"));

//Vom completa costul contabil în tabel
TypeNumber = New DescriptionTypes(ArrayNumber, CN);
TypeString = New TypeDescription(ArrayString, KS);
TypeDate = New TypeDescription(ArrayDate);

//tabel pentru încărcarea datelor din SQL
TZ = New ValueTable();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Qnty", TypeNumber);
TK.Columns.Add(„Perioada”, DataType);

TK.Indici.Add(„Perioada”);

//Conectează-te la SQL
Șir de conexiune = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Utilizați procedura pentru Pregătire=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Criptare pentru date=False;Etichetă cu colaţionarea coloanelor atunci când este posibil=Fals;Catalog iniţial=Rapoarte";
Conexiune = New COMObject("ADODB.Connection");
Comanda = New COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
Data = "";
Atentat, încercare
Connection.Open(AbbrLP(ConnectionString));
Command.ActiveConnection = Conexiune;
Command.CommandText = "S_elect * din PH unde punct >= "" + String(Format(StartDate, "DF=aaaaMMzz")) + "" și punct<= "" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + """;
RecordSet = Command.Execute();
RecordSet.MoveFirst();
Excepție
Returnarea specificațiilor tehnice;
EndTempt;

În timp ce RecordSet.EOF = Buclă falsă
Linie = TZ.Add();
Row.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Row.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Row.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
EndCycle;

Solicitare = Solicitare nouă();
VrTable = New TemporaryTableManager();

Query.SetParameter("vrDataTable", TK);
Query.SetParameter("Data de începere", Data de începere);
Request.SetParameter("DataCon", DateCon);
Query.Text = „SELECT
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Period
|Plasați DataTable
|DIN
| &vDataTable AS vrDataTable
|UNDE
| vrDataTable.Period >= &DateStart
| Și vrDataTable.Period<= &ДатаКон";
Request.Run();
TZ = nedefinit;

Solicitare = Solicitare nouă;
Query.TemporaryTableManager = VrTable;
Query.Text = "Iată o interogare care implică un tabel variabil";

Rezultat = Query.Run();
Rezultatul returnat;

EndFunction

ExternalSet = InitializeDataSource();
DataSet = Structură nouă();
DataSet.Insert ("Tabel SQL", ExternalSet);
TypicalReports.GenerateTypicalReport(ThisObject, Result, Decryption Data, OutputToReportForm, DataSet);

De fapt, nu există multe linii de cod și sunt destul de standard... în acest caz, puteți utiliza întreaga funcționalitate a designerului de interogări și puteți oferi doar funcția DATA COMPOSITION la ACS

Dar cu siguranță nu arată la fel de frumos... și de fiecare dată trebuie să scrieți cod pentru a încărca valori într-un tabel și a verifica dacă ați greșit în numele detaliilor... și ce ni s-a dat în 1C pare cumva cu jumătate de inimă. Încă nu m-am hotărât care este mai convenabil de utilizat. Tu decizi și scrie despre deciziile tale și despre ce te-a determinat să le faci.
Autor.

Începând cu versiunea 8.3.5, platforma a implementat capacitatea de a scrie date în tabelele surselor de date externe. Articolul discută această funcționalitate, care extinde capacitățile existente pentru integrarea configurației cu sisteme terțe.

Aplicabilitate

Articolul discută platforma 1C 8.3.5. Materialul este, de asemenea, relevant pentru lansările actuale ale platformei.

Înregistrarea către surse de date externe în 1C:Enterprise 8

În platforma 8.2.14, un nou obiect a fost adăugat la arborele de metadate - surse de date externe. Scopul acestui mecanism este de a obține date din baze de date externe în legătură cu 1C.

Odată cu lansarea noilor versiuni de platformă, sursele de date externe au evoluat, de exemplu, a devenit posibilă plasarea lor în tabele temporare și realizarea conexiunilor cu tabele obișnuite.

În acest articol ne vom uita la ce instrumente are un dezvoltator pentru a înregistra în surse externe de date.

Toate acțiunile au fost efectuate pe SGBD-ul Microsoft SQL Server 2008 R2.

Platforma 8.3.4 a introdus capacitatea de a utiliza funcții descrise în sursele de date externe.

Această caracteristică vă permite să rulați proceduri stocate pe partea SQL Server și, cu ajutorul lor, să accesați date din surse externe, inclusiv scrierea.

Să ne uităm la un exemplu. Folosind SQL Management Studio, să creăm o nouă bază de date numită kursy_test. Toate experimentele ulterioare vor fi efectuate pe el.

În această bază de date vom crea o nomenclatură de tabel, pentru aceasta vom scrie un script cu următorul conținut:

USE [kursy_test]
MERGE
CREATE TABLE [dbo]. [nomenclatura](
[id] [int] NOT NULL,
[ descriere ] [ nvarchar ](150) NOT NULL,
[preț] [numeric](15, 2) NULL,
CONSTRAINT [ PK_id ] CHEIE PRIMARĂ ([ id ])
MERGE

În urma execuției, va fi creat un tabel cu următoarea structură:

Acum trebuie să creăm două proceduri stocate, cu ajutorul cărora se va efectua modificarea datelor.

Să numim prima procedură insert_nomenklatura. Acesta va fi conceput pentru a adăuga un nou rând la tabel. Scriptul pentru a-l crea va arăta astfel:

USE [kursy_test]
MERGE
CREATE PROCEDURE insert_nomenklatura
@id int
@description nvarchar(150),
@preț numeric (15, 2)
LA FEL DE
ÎNCEPE
INSERT INTO [kursy_test].dbo. [nomenklatura] ([ id ], [ descriere ],[ preț ])
VALUES (@id, @description, @price)
Sfârşit
MERGE

A doua procedură, numită update_nomenklatura, va actualiza o înregistrare existentă în tabel. Pentru a-l crea, a fost lansat următorul script:

În Object Browser, tabelul creat și două proceduri stocate arată astfel:

Am finalizat toți pașii pregătitori pe partea Microsoft SQL Server, acum trecem la configuratorul 1C:Enterprise 8.

Creați o nouă sursă de date externă numită Nomenklatura. Când creăm un tabel nou în această sursă de date, specificăm următorii parametri pentru conectarea la sursa de date:

Specificăm următorul șir de conexiune:

Driver = (SQL Server) ; Server =(local); Baza de date = kursy_test ; User Id = sa ; Parola =;

Dacă utilizatorul sa are o parolă, aceasta trebuie specificată în parametrul Parolă al liniei de conectare.

Dacă toți parametrii de conexiune sunt specificați corect, când faceți clic pe OK, se va deschide o fereastră care conține tabelele disponibile în sursa de date:

Bifăm câmpurile din tabel care ne interesează. Când butonul este apăsat Gata tabelul dbo_nomenklatura va fi creat în sursa externă de date Nomenklatura:

Acum trecem la fila „Funcții” a sursei noastre de date.

Folosind un expert similar, adăugăm două proceduri stocate:

Primim următorul aspect al filei „Funcții”:

Acum să programăm interfața cu utilizatorul să funcționeze cu o sursă de date externă.

În formularul de listă din panoul de comandă, vom plasa butonul „Adăugați” cu următorul handler:

&OnClient
Procedura Add()
Alertă = Nou DescriereAlerte(„OpenTableComplete”, ThisObject );
OpenForm (
„ExternalDataSource.Nomenklatura.Table.dbo_nomenklatura.ObjectForm”
, , , , , ,
Alerta, FormWindowOpenMode.LockEntireInterface);
Sfârșitul procedurii

&OnClient
Salvare procedură (comandă)
SaveOnServer();
Sfârșitul procedurii &pe server
Procedură SaveOnServer()
Dacă Object.Link.Empty() Apoi
ExternalDataSources.Nomenklatura.dbo_insert_nomenklatura
In caz contrar
ExternalDataSources.Nomenklatura.dbo_update_nomenklatura
(Object.id, Object.description, Object.price);
EndIf ;
Sfârșitul procedurii

În modul Enterprise, formularul de listă arată astfel:

Forma obiectului este prezentată mai jos:

Pentru marire, click pe imagine.

Astfel, folosind proceduri stocate, am implementat înregistrarea către surse externe de date.

În platforma 8.3.5, a apărut o nouă caracteristică - scrierea directă către surse de date externe, ocolind mecanismul procedurii stocate discutat mai sus.

Datele pot fi editate fie programatic, fie interactiv. Și pentru exemplul nostru nu este nevoie să recurgem la configurare.

În panourile de comandă și în meniul „Mai multe” puteți vedea butoane standard precum „Creare”, „Copiere”, „Editare”, etc.

Pentru marire, click pe imagine.

Și butoanele „Salvare” și „Salvare și închidere” au apărut sub forma obiectului:

După cum puteți vedea, acum lucrul cu surse externe este similar cu lucrul cu cărți de referință, documente etc.

Să ne uităm la ce modificări au fost făcute la nivel de metadate pentru a face posibilă scrierea în surse de date externe.

O nouă proprietate a fost adăugată la tabelul de date Doar lectură(tip – boolean).

Dacă această proprietate este setată la True, scrierea datelor în acest tabel utilizând instrumentele platformei este imposibilă.

Câmpul tabelului de date are acum următoarele proprietăți:

  • Doar lectură(tip – boolean) – este posibilă modificarea datelor din acest câmp;
  • AllowNull(tip – boolean) – dacă este posibilă stocarea unei valori NULL în acest câmp.

Proprietate Doar lectură ar trebui setat la Adevărat pentru câmpurile bazei de date cu modificări automate, câmpuri cheie generate automat, câmpuri calculate etc.

Puteți adăuga, modifica și șterge date din surse externe folosind limbajul încorporat.

Pentru a face acest lucru, obiecte ExternalDataSourceTableRecordSetȘi ExternalDataSourceTableObject au fost implementate noi metode Scrie()Și Șterge().

Să ne uităm la exemplul de adăugare programatică a unei noi înregistrări pentru o sursă de date externă discutat mai sus.

&OnClient
Procedură Creați programatic(Echipa)
CreateProgrammaticalOnServer();
Sfârșitul procedurii &pe server

Procedură CreateProgrammaticalOnServer()
WritableObject=
ExternalDataSources.Nomenklatura.Tables.dbo_nomenklatura.CreateObject();
WriteableObject.id= 5 ;
WriteableObject.descriere= „Dulap” ;
WritableObject.price= 5000 ;
WriteableObject.Write();
Sfârșitul procedurii

În modulul obiect tabel sursă de date externă, acum puteți specifica handlere de evenimente de scriere, cum ar fi Înainte de a scrie (), OnWrite() etc.:

Acest articol a examinat două opțiuni pentru scrierea datelor în surse externe de date - folosind proceduri stocate și utilizarea noilor mecanisme ale platformei 8.3.5.

Astfel, platforma implementează acum mecanisme de integrare deplină cu aplicațiile externe.

În versiunea 8.3.6, funcționalitatea descrisă mai sus a fost extinsă cu ajutorul noilor metode speciale GetModifiableFields() și SetModifiableFields(). Folosind ele, este posibil să se efectueze o operație de scriere în acele câmpuri din tabelul VIEW care sunt marcate în configurator ca doar pentru citire. Datorită acestui fapt, a devenit posibilă implementarea unui scenariu în care scrierea în câmpurile individuale ale tabelului VIEW este posibilă numai în cazurile în care este necesară în conformitate cu logica de afaceri a aplicației.

În versiunea 8.3.7, mecanismul a fost îmbunătățit pentru a determina ce câmpuri specifice din tabelele VIEW pot conține valori NULL. Până în acest moment, toate tabelele VIEW ar putea accepta această valoare. Această modificare se datorează unei creșteri a vitezei de sortare a listelor dinamice după aceste câmpuri.

În versiunea 8.3.8, a devenit în sfârșit posibil să se detecteze faptul că o sursă de date externă se află într-o stare de tranzacție. Această funcționalitate este oferită de noua metodă ExternalDataSourceManager.TransactionActive()

În concluzie, observăm că pentru sursele de date externe, așa cum se arată mai sus, sunt descrise tabele de date din modelul relațional clasic. Platforma folosește o paradigmă diferită pentru lucrul cu date, oferind dezvoltatorului un anumit set de tipuri de obiecte de aplicație (directoare, documente, registre etc.). Acesta este motivul pentru care sistemul, atunci când lucrează cu tabele de surse de date externe, nu acceptă majoritatea funcționalității care sunt inerente obiectelor sale „native”. Prin urmare, se recomandă să se abțină de la dezvoltarea oricărei logici de afaceri, ținând cont de utilizarea tabelelor VID, dacă aceasta nu are legătură cu sarcinile de integrare cu sistemele existente. Sau, pentru a spune simplu, ar trebui să încercați să evitați stocarea datelor care sunt utilizate în mod activ în aplicația dvs. într-un alt tabel al sistemului extern, dacă nu este utilizat de acest sistem.

În articolul următor ne vom uita la continuarea logică a utilizării tehnologiei surselor de date externe în sistemul 1C:Enterprise.

În versiunea 8 a programului 1C, dezvoltatorii au adăugat la funcționalitate posibilitatea de a conecta baze de date terțe și de a obține informații de la acestea direct din configurator, fără a utiliza conexiuni COM și obiecte OLE. Această caracteristică este implementată folosind un obiect nou - „Surse de date externe”

Sursele de date externe din 1C pot fi utilizate în același mod ca și alte tabele din sistem:

  1. Când se creează rapoarte și calcule folosind un sistem de compoziție a datelor (DCS);
  2. Pentru a obține link-uri către informații stocate în surse terțe;
  3. Pentru a modifica datele stocate în tabele;
  4. La generarea cererilor.

Este important de știut că acest mecanism nu este conceput pentru a funcționa cu alte baze de date 1C, deoarece modelul de operare 1C.Enterprise în sine nu implică interferențe cu datele la nivelul tabelelor fizice.

Crearea unei noi surse

Adăugarea unei noi surse externe la program are loc în modul „Configurator”. Există o ramură corespunzătoare în arborele de configurare (Fig. 1)

Va trebui să munciți din greu atunci când creați o nouă sursă, în ciuda faptului că forma noului obiect are doar patru file:

  1. De bază;
  2. Date;
  3. Funcții;
  4. Drepturi.

Prima filă are un singur parametru interesant - modul de control al blocării. Dacă nu aveți întrebări despre blocarea datelor în tranzacții sau despre complexitatea paralelizării fluxurilor de informații, puteți lăsa această opțiune în modul de blocare automată. Cu toate acestea, o astfel de abordare poate duce la restricții excesive (de exemplu, atunci când, în loc de o înregistrare separată, programul blochează întregul tabel fizic, privând alți utilizatori de capacitatea de a lucra cu acesta).

Blocările gestionate, spre deosebire de cele automate, folosesc mecanismul de tranzacție inerent programului în sine, și nu DBMS, care permite transferarea captărilor de tabel la un nivel mult mai scăzut.

Setând acest parametru la „Automat și gestionat”, oferim sistemului abilitatea de a determina ce mod să folosească accesând direct o proprietate similară pentru fiecare tabel specific.

Fila „Date” din formularul proprietăților sursei externe

Forma filei „Date” este prezentată în Fig. 2

Orez. 2

Aici putem adăuga tabele și cuburi surse externe. Există două moduri de a adăuga un tabel:

  1. Manual, apoi formularul pentru adăugarea unui tabel se va deschide în fața noastră (Fig. 3);

Orez. 3

  1. Sau selectați din lista tabelelor sursă fizice (Fig. 4), caz în care un constructor special se deschide în fața noastră.

Orez. 4

Să aruncăm o privire mai atentă la formularul pentru adăugarea unui tabel. Proprietatea „Nume” este utilizată pentru a identifica unic un obiect din configurație.

Comparația dintre obiectul de metadate și tabelul fizic final are loc prin proprietatea „Nume în sursa de date” situată în fila „Avansat” (Fig. 5)

Orez. 5

În continuare trebuie să stabilim tipul mesei, sau mai degrabă obiectivitatea acestuia. Dacă datele stocate într-o structură pot fi identificate în mod unic prin orice câmp, tabelul poate fi unul obiect. Dacă individualitatea unei înregistrări este determinată de un set de câmpuri cheie, tabelul trebuie să aibă un tip non-obiect.

Comparând astfel de tabele cu alte obiecte de metadate, se poate da următoarea analogie:

  • Tabelele cu obiecte sunt cărți de referință;
  • Cele non-obiecte sunt registrele de informații.

Setul de câmpuri cheie este definit în următorul parametru de formular („Câmpuri cheie”). Acest câmp este obligatoriu dacă îl lăsați necompletat, salvarea configurației va eșua.

După cum se poate observa din Fig. 5, unele câmpuri și butoane ale formularului nu sunt editabile:

  • Exprimarea în sursa de date;
  • Tipul de date din tabel;
  • Câmp de prezentare;
  • Vizualizați manipulatorii.

Ele pot fi folosite numai după ce completăm câmpurile din tabel, definim tipul lor și atribuim identificatori (Fig. 6)

Orez. 6

Aici ar trebui să acordați atenție parametrului „Allow Null” dacă această casetă de selectare este bifată, nu este recomandabil să utilizați un astfel de câmp ca cheie.

Constructor de mese

Poate cel mai important și interesant punct în lucrul cu surse externe este crearea unui șir de conexiune. Constructorul său se deschide dacă faceți clic pe butonul cu trei puncte de lângă parametrul „Șir de conexiune”.

În primul rând, ni se va cere să decidem asupra driverului care va fi folosit pentru conectare (Fig. 7)

Orez. 7

Definirea incorectă a acestui parametru nu vă va permite să vă conectați la o bază de informații terță parte. De asemenea, ar trebui să înțelegeți că nu toate driverele specificate în lista derulantă pot fi folosite pentru a genera automat un șir de conexiune. Dacă platforma generează o eroare (Fig. 8), atunci șirul de conexiune va trebui introdus manual.

Fig.8

Orez. 9

Linia în sine este o construcție strict reglementată.

Exemplu de șir de conexiune

Să luăm în considerare o bază de date terță parte creată în Microsoft Access și situată în rădăcina unității D. Pentru a conecta această bază de date, trebuie să folosim driverul corespunzător, dar selectând-o în constructorul de rânduri rezultă eroarea Fig. 8.

Vom configura singuri parametrii de conectare.

Driver=(Microsoft Access Driver (*.mdb)) – așa arată prima parte a liniei. În bretele am definit șoferul.

Pentru fișierele Excel va arăta ca (Microsoft Excel Driver (*.xls)), pentru fișierele Excel create într-un birou mai vechi de 2003, linia de driver va arăta ca (Microsoft Excel Driver (*.xls, *.xlsx, *. xlsm, *.xlsb)).

Separând acest parametru de următorul prin virgulă, trebuie să introducem adresa stocării noastre (în cazul nostru DBQ=D:\Database1.mdb).

Adăugând acești doi parametri, obținem Driver=(Microsoft Access Driver (*.mdb));DBQ=D:\Database1.mdb Prin scrierea acestui parametru, obținem acces la structurile interne ale acestei baze de date.

Pentru obiectul „Sursă externă”, nu este suficient doar să îl creați în configurație, trebuie să fie conectat și în modul „Enterprise”. Acest lucru se poate face din meniul „Toate funcțiile”->Surse externe. Când intrăm prima dată în tabelul nostru, trebuie să introducem același șir de conexiune în modul „Enterprise”.