1c extern datakälla anslutningssträng. Externa datakällor. Exempel på anslutningssträng

Från och med version 8.3.5 har plattformen implementerat möjligheten att skriva data till tabeller över externa datakällor. Artikeln diskuterar denna funktionalitet, som utökar de befintliga funktionerna för att integrera konfiguration med tredjepartssystem.

Tillämplighet

Artikeln diskuterar 1C 8.3.5-plattformen. Materialet är även relevant för aktuella plattformssläpp.

Inspelning till externa datakällor i 1C:Enterprise 8

I plattform 8.2.14 lades ett nytt objekt till i metadataträdet - externa datakällor. Syftet med denna mekanism är att hämta data från externa databaser i relation till 1C.

I och med lanseringen av nya plattformsreleaser har externa datakällor utvecklats, till exempel har det blivit möjligt att placera dem i temporära tabeller och utföra kopplingar med vanliga tabeller.

I den här artikeln kommer vi att titta på vilka verktyg en utvecklare har för att registrera till externa datakällor.

Alla åtgärder utfördes på Microsoft SQL Server 2008 R2 DBMS.

Plattform 8.3.4 introducerade möjligheten att använda funktioner som beskrivs i externa datakällor.

Den här funktionen låter dig köra lagrade procedurer på SQL Server-sidan och med deras hjälp komma åt data från externa källor, inklusive skrivning.

Låt oss titta på ett exempel. Med hjälp av SQL Management Studio, låt oss skapa en ny databas med namnet kursy_test. Alla ytterligare experiment kommer att utföras på den.

I denna databas kommer vi att skapa en tabell nomenklatura, för detta kommer vi att skriva ett skript med följande innehåll:

ANVÄND [kursy_test]

SKAPA TABELL [dbo]. [nomenklatur](
[id] [int] INTE NULL,
[ beskrivning ] [ nvarchar ](150) INTE NULL,
[pris] [numerisk](15, 2) NULL,
BEGRÄNSNING [ PK_id ] PRIMÄRNYCKEL ([ id ])

Som ett resultat av körningen kommer en tabell med följande struktur att skapas:

Nu måste vi skapa två lagrade procedurer, med hjälp av vilka datamodifiering kommer att utföras.

Låt oss kalla den första proceduren insert_nomenklatura. Den kommer att utformas för att lägga till en ny rad i tabellen. Skriptet för att skapa det kommer att se ut så här:

ANVÄND [kursy_test]

SKAPA PROCEDUR insert_nomenklatura
@id int
@beskrivning nvarchar(150),
@pris numerisk (15, 2)
SOM
BÖRJA
INFOGA I [kursy_test].dbo. [nomenklatura] ([ id ], [ beskrivning ],[ pris ])
VÄRDEN (@id, @beskrivning, @pris)
SLUTET

Den andra proceduren, som heter update_nomenklatura, kommer att uppdatera en befintlig post i tabellen. För att skapa det lanserades följande skript:

I Object Browser ser den skapade tabellen och två lagrade procedurer ut så här:

Vi har slutfört alla förberedande steg på Microsoft SQL Server-sidan, nu går vi till 1C:Enterprise 8-konfiguratorn.

Skapa en ny extern datakälla med namnet Nomenklatura. När du skapar en ny tabell i den här datakällan anger vi följande parametrar för att ansluta till datakällan:

Vi anger följande anslutningssträng:

Drivrutin = (SQL-server) ; Server =(lokal); Databas = kursy_test ; Användar-ID = sa ; Lösenord =;

Om sa-användaren har ett lösenord måste det anges i parametern Lösenord på anslutningsraden.

Om alla anslutningsparametrar är korrekt angivna, när du klickar på OK, öppnas ett fönster som innehåller de tabeller som är tillgängliga i datakällan:

Vi kryssar i de tabellfält som intresserar oss. När knappen trycks ned Redo tabellen dbo_nomenklatura kommer att skapas i den externa datakällan Nomenklatura:

Nu byter vi till fliken "Funktioner" i vår datakälla.

Med hjälp av en liknande guide lägger vi till två lagrade procedurer:

Vi får följande utseende på fliken "Funktioner":

Låt oss nu programmera användargränssnittet för att fungera med en extern datakälla.

I listformuläret på kommandopanelen kommer vi att placera knappen "Lägg till" med följande hanterare:

&OnClient
Procedur Add()
Varning = Ny BeskrivningAlerts(“OpenTableComplete”, ThisObject );
OpenForm (
"ExternalDataSource.Nomenklatura.Table.dbo_nomenklatura.ObjectForm"
, , , , , ,
Varna, FormWindowOpenMode.LockEntireInterface);
Slutprocedur

&OnClient
Procedur Spara (kommando)
SaveOnServer();
Slut på procedur &På server
Procedur SaveOnServer()
Om Object.Link.Empty() Då
ExternalDataSources.Nomenklatura.dbo_insert_nomenklatura
Annat
ExternalDataSources.Nomenklatura.dbo_update_nomenklatura
(Object.id, Object.description, Object.price);
EndIf ;
Slutprocedur

I företagsläge ser listformuläret ut så här:

Formen på föremålet visas nedan:

För att förstora, klicka på bilden.

Med hjälp av lagrade procedurer implementerade vi således inspelning till externa datakällor.

I plattform 8.3.5 har en ny funktion dykt upp - att skriva till externa datakällor direkt, förbi mekanismen för lagrad procedur som diskuterats ovan.

Data kan redigeras antingen programmatiskt eller interaktivt. Och för vårt exempel finns det inget behov av att tillgripa konfiguration.

I kommandopanelerna och i menyn "Mer" kan du se standardknappar som "Skapa", "Kopiera", "Redigera" etc.

För att förstora, klicka på bilden.

Och knapparna "Spara" och "Spara och stäng" dök upp i objektformuläret:

Som du kan se liknar arbetet med externa källor att arbeta med referensböcker, dokument osv.

Låt oss titta på vilka ändringar som gjordes på metadatanivå för att göra det möjligt att skriva till externa datakällor.

En ny egenskap har lagts till i datatabellen Bara läsning(typ – boolean).

Om den här egenskapen är inställd på True är det omöjligt att skriva data till den här tabellen med plattformsverktyg.

Datatabellfältet har nu följande egenskaper:

  • Bara läsning(typ – boolean) – är det möjligt att ändra data i detta fält;
  • AllowNull(typ – boolean) – om det är möjligt att lagra ett NULL-värde i detta fält.

Fast egendom Bara läsning bör ställas in på Sann för databasfält med automatiska ändringar, automatiskt genererade nyckelfält, beräknade fält osv.

Du kan lägga till, ändra och ta bort data i externa källor med hjälp av det inbyggda språket.

För att göra detta, objekt ExternalDataSourceTableRecordSet Och ExternalDataSourceTableObject nya metoder implementerades Skriva() Och Radera().

Låt oss titta på exemplet på att programmässigt lägga till en ny post för en extern datakälla som diskuterats ovan.

&OnClient
Procedur Skapa Programmatiskt(Team)
SkapaProgrammaticallyOnServer();
Slut på procedur &På server

Procedur SkapaProgrammaticallyOnServer()
Skrivbart objekt=
ExternalDataSources.Nomenklatura.Tables.dbo_nomenklatura.CreateObject();
WriteableObject.id= 5 ;
WriteableObject.description= "Garderob" ;
WritableObject.price= 5000 ;
WriteableObject.Write();
Slutprocedur

I den externa datakällans tabellobjektmodul kan du nu ange skrivhändelsehanterare, som t.ex BeforeWrite(), OnWrite() etc.:

Den här artikeln undersökte två alternativ för att skriva data till externa datakällor - med hjälp av lagrade procedurer och med de nya mekanismerna för 8.3.5-plattformen.

Således implementerar plattformen nu mekanismer för full integration med externa applikationer.

I version 8.3.6 utökades funktionaliteten som beskrivs ovan med hjälp av nya specialmetoder GetModifiableFields() och SetModifiableFields(). Genom att använda dem är det möjligt att utföra en skrivoperation i de fält i VIEW-tabellen som är markerade i konfiguratorn som skrivskyddade. Tack vare detta blev det möjligt att implementera ett scenario där det bara är möjligt att skriva till enskilda fält i VIEW-tabellen i de fall där det är nödvändigt i enlighet med applikationens affärslogik.

I version 8.3.7 förbättrades mekanismen för att avgöra vilka specifika fält i VIEW-tabellerna som kan innehålla NULL-värden. Fram till denna punkt kunde alla VIEW-tabeller acceptera detta värde. Denna förändring beror på en ökning av hastigheten för sortering i dynamiska listor efter dessa fält.

I version 8.3.8 blev det äntligen möjligt att upptäcka att en extern datakälla är i transaktionstillstånd. Denna funktionalitet tillhandahålls av den nya metoden ExternalDataSourceManager.TransactionActive()

Sammanfattningsvis noterar vi att för externa datakällor, som visas ovan, beskrivs datatabeller från den klassiska relationsmodellen. Plattformen använder ett annat paradigm för att arbeta med data, och erbjuder utvecklaren en viss uppsättning typer av applikationsobjekt (kataloger, dokument, register, etc.). Det är därför som systemet, när det arbetar med tabeller över externa datakällor, inte stöder det mesta av den funktionalitet som är inneboende i dess "inhemska" objekt. Därför rekommenderas det att avstå från att utveckla någon affärslogik, med hänsyn till användningen av VID-tabeller, om detta inte är relaterat till integrationsuppgifterna med befintliga system. Eller, för att uttrycka det enkelt, du bör försöka undvika att lagra data som aktivt används i din applikation i någon annan tabell i det externa systemet, om den inte används av detta system.

I nästa artikel kommer vi att titta på den logiska fortsättningen av att använda tekniken för externa datakällor i 1C:Enterprise-systemet.

Varför är denna möjlighet av sådant intresse? Varje person som har programmerat i 1C och är ganska bekant med SQL och är åtminstone allmänt bekant med arkitekturen och principerna för utveckling av andra teknologiplattformar för affärsapplikationer kommer att berätta med fast tillförsikt vad han gillar mest med 1C. Naturligtvis är frågebyggaren den mest bekväma och genomtänkta mekanismen för att skriva frågor för att hämta data från relationsstrukturer som jag personligen någonsin har stött på. Och nu har 1C gett oss en sådan underbar möjlighet att använda den inte bara med 1C, utan även med andra bord. Det är bara det att det här "honungstunnan" har många "flugor i glädje". Första saker först:

1) Installation och användning- utan att "dansa med en tamburin" fungerar det inte
a) Lägg till en extern datakälla - det verkar inte komplicerat
b) markera kryssrutan "Välj från lista" - obligatoriskt - detta är nödvändigt för att kontrollera funktionaliteten i början och kommer att rädda dig från onödiga problem
c) - se till att klicka på "..." - anslutningen är ODBC. Inte OLEDB som vi alla är vana vid, utan en nivå lägre

D) Men var VÄLDIGT FÖRSIKTIG här.

Detta är en ODBC-drivrutin - om du använder klient-serverversionen måste den finnas på servern. Om du utvecklar på ett system och arbetar på ett annat (som vanligtvis är fallet), se till att det inte finns några överraskningar som väntar på dig. En märklig rekommendation, men välj den äldsta eller vanligaste drivrutinen om du inte är särskilt orolig för hastigheten och inte tänker gå längre än SQL92-standardens möjligheter. Detta kommer att ge dig bättre kompatibilitet. Till exempel, för SQL Server 2008 kommer den bästa drivrutinen att vara SQL Server Native Client 11, men jag rekommenderar att du bara väljer SQL Server, annars måste den här inbyggda klienten installeras antingen på servern eller på alla klientdatorer (om du använder filversion), och fördelen är speciell för enkel han kommer inte att ge dig några uppgifter.
e) Standardservervalsdialoger

och DB

f) Jag rekommenderar att du svarar "ja" på frågan om att spara lösenordet, annars kommer du inte att kunna starta den här verksamheten.
g) Välj tabellen och detaljerna... en underbar möjlighet - du kan omedelbart byta namn på den som du vill (och detaljerna också), och i egenskaperna kommer du att se namnen på fälten i datakällan


h) Nu startar du den, öppnar frågedesignern - välj dumt alla poster från tabellen och OPA - ett fel. Vad ska man göra? Om du har ett hanterat gränssnitt, titta på servicemenyn, och om ett vanligt...
Jag använde personligen denna kod:
Code 1C v 8.x Parameters = ExternalDataSources.DAX.GetGeneralConnectionParameters();
Parameters.AuthenticationStandard = True;
Parameters.UserName = "sa";
Parameters.Password = "pass";
Parameters.ConnectionString = "DRIVER=(SQL-server);SERVER=servet;UID=sa;PWD=;DATABASE=databas";
Parameters.DBMS = "MSSQLServer";

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

ExternalDataSources.DAX.SetConnection();
Vissa delar kanske inte är nödvändiga, men det fungerar.
Du måste köra koden EN GÅNG. Därefter kommer det att vara normalt att koppla... mystik förstås - varför detta var nödvändigt är inte klart...

2) Skrivskyddade datakällor- Ja, mirakel händer inte... men ibland vill man ha det...

3) DE KAN INTE ANVÄNDAS TILLSAMMANS MED INTERNA DATAKÄLLOR
Personligen dödade detta faktum mig på plats.

Hur kan det här vara... det vi väntade på och redan föreställde oss och slickade oss om läpparna om hur vi nu ska kombinera vår data med 1C i en begäran, kollapsa den - gruppera den, infoga den i rapporten, men så är inte fallet ...
Men det här hindrar naturligtvis inte erfarna människor... vilken tanke kom att tänka på? Det stämmer - tillfälliga tabeller:

4) DE KAN INTE ANVÄNDAS TILLSAMMANS MED TILLFÄLLIGA BORD


Men det här ser inte längre ut som tekniska svårigheter, utan ser mycket ut som vad de vill att vi ska göra "så att livet inte verkar som ett paradis."

5) Kan endast användas i ACS-anslutningar
För de som inte vet, detta finns i ACS på fliken "Data Set Links". Använder du dem ofta? Bekväm? Tydligen vill de tvinga oss att använda dem oftare. Bara det finns en kolumn "Kommunikationsvillkor" och "Kommunikationsparameter". Jag har inte hittat ett exempel på deras användning i någon standardkonfiguration på något sätt är inte allt transparent i dokumentationen och i Khrustalevas arbete heller. Kan någon förklara för mig hur "anslutningsvillkoret" fungerar. Om du skriver Source Attributes = Receiver Attributes där så fungerar det inte. Naturligtvis kan villkoret skrivas i fältet "Uttryck" - i de flesta fall räcker det... men på något sätt fungerar det inte särskilt lätt.

Totalt sett löstes detta problem tidigare någonstans så här:
Kod 1C v 8.x Funktion InitializeDataSource()

DateStart = SettingsComposer.Settings.DataParameters.Items.Value;
DataCon = SettingsBuilder.Settings.DataParameters.Items.Value;
Om DataCon > "20100101" Då
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("Datum"));

//Vi kommer att fylla i redovisningskostnaden i tabellen
TypeNumber = New DescriptionTypes(ArrayNumber, CN);
TypeString = New TypeDescription(ArrayString, KS);
TypeDate = New TypeDescription(ArrayDate);

//tabell för att ladda data från SQL
TZ = New ValueTable();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Antal", TypNumber);
TK.Columns.Add("Period", DateType);

TK.Indices.Add("Period");

//Anslut till SQL
Connection String = "Provider=SQLOLEDB.1;Persist Security Info=True;Användar-ID=sa;Pwd=;Datakälla=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Använd Kryptering för Data=False;Tagg med kolumnkollation när det är möjligt=False;Initial Catalog=Reports";
Connection = New COMObject("ADODB.Connection");
Kommando = Nytt COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
Datum = "";
Försök
Connection.Open(AbbrLP(ConnectionString));
Command.ActiveConnection = Anslutning;
Command.CommandText = "Välj * från PH där punkt >= "" + String(Format(Startdatum, "DF=ååååMMdd")) + "" och punkt<= "" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + """;
RecordSet = Command.Execute();
RecordSet.MoveFirst();
Undantag
Retur av tekniska specifikationer;
Slutförsök;

Medan RecordSet.EOF = Falsk Loop
Rad = TK.Add();
Row.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Row.Qunty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Row.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
EndCycle;

Request = New Request();
VrTable = New TemporaryTableManager();

Query.SetParameter("vrDataTable", TK);
Query.SetParameter("Startdatum", Startdatum);
Request.SetParameter("DataCon", DateCon);
Query.Text = "VÄLJ
| vrDataTable.NomenclatureCode,
| vrDataTable.Qunty,
| vrDataTable.Period
|Placera datatabell
|FRÅN
| &vDataTable AS vrDataTable
| VAR
| vrDataTable.Period >= &DateStart
| Och vrDataTable.Period<= &ДатаКон";
Request.Run();
TZ = Odefinierad;

Request = Ny begäran;
Query.TemporaryTableManager = VrTable;
Query.Text = "Här är en fråga som involverar en variabel tabell";

Result = Query.Run();
Returnera Resultat;

EndFunction

ExternalSet = InitializeDataSource();
DataSet = new Structure();
DataSet.Insert("SQL-tabell", ExternalSet);
TypicalReports.GenerateTypicalReport(ThisObject, Result, Decryption Data, OutputToReportForm, Dataset);

Egentligen finns det inte många rader kod och de är ganska standard... i det här fallet kan du använda den fulla funktionaliteten hos frågedesignern, och bara ge funktionen DATA COMPOSITION till ACS

Men det ser verkligen inte lika snyggt ut... och varje gång du behöver skriva kod för att ladda upp värden till en tabell och kolla om du gjort fel i namnet på detaljerna... och vad vi fick i 1C ser på något sätt halvhjärtad ut. Jag har ännu inte bestämt mig för vilket som är bekvämast att använda. Du bestämmer och skriver om dina beslut och vad som fick dig att fatta dem.
Författare.

Varför är denna möjlighet av sådant intresse? Varje person som har programmerat i 1C och är ganska bekant med SQL och är åtminstone allmänt bekant med arkitekturen och principerna för utveckling av andra teknologiplattformar för affärsapplikationer kommer att berätta med fast tillförsikt vad han gillar mest med 1C. Naturligtvis är frågebyggaren den mest bekväma och genomtänkta mekanismen för att skriva frågor för att hämta data från relationsstrukturer som jag personligen någonsin har stött på. Och nu har 1C gett oss en sådan underbar möjlighet att använda den inte bara med 1C, utan även med andra bord. Det är bara det att det hälls en hel del "flugor i salvan" i denna "honungstunna". Första saker först:

1) Installation och användning- utan att "dansa med en tamburin" fungerar det inte
a) Lägg till en extern datakälla - det verkar inte komplicerat
b) markera kryssrutan "Välj från lista" - obligatoriskt - detta är nödvändigt för att kontrollera funktionaliteten i början och kommer att rädda dig från onödiga problem
c) - se till att klicka på "..." - anslutningen är ODBC. Inte OLEDB som vi alla är vana vid, utan en nivå lägre

D) Men var VÄLDIGT FÖRSIKTIG här.

Detta är en ODBC-drivrutin - om du använder klient-serverversionen måste den finnas på servern. Om du utvecklar på ett system och arbetar på ett annat (som vanligtvis är fallet), se till att det inte finns några överraskningar som väntar på dig. En märklig rekommendation, men välj den äldsta eller vanligaste drivrutinen om du inte är särskilt orolig för hastigheten och inte tänker gå längre än SQL92-standardens möjligheter. Detta kommer att ge dig bättre kompatibilitet. Till exempel, för SQL Server 2008 kommer den bästa drivrutinen att vara SQL Server Native Client 11, men jag rekommenderar att du bara väljer SQL Server, annars måste den här inbyggda klienten installeras antingen på servern eller på alla klientdatorer (om du använder filversion), och fördelen är speciell för enkel han kommer inte att ge dig några uppgifter.
e) Standardservervalsdialoger

E) Jag rekommenderar att du svarar "ja" på frågan om att spara lösenordet, annars kommer du inte att kunna starta den här verksamheten.
g) Välj tabellen och detaljerna... en underbar möjlighet - du kan omedelbart byta namn på den som du vill (och detaljerna också), och i egenskaperna kommer du att se namnen på fälten i datakällan

Z) Och nu startar du den, öppnar frågedesignern - välj dumt alla poster från tabellen och OPA - ett fel. Vad ska man göra? Om du har ett hanterat gränssnitt, titta på servicemenyn, och om ett vanligt...
Jag använde personligen denna kod:
Code 1C v 8.x Parameters = ExternalDataSources.DAX.GetGeneralConnectionParameters();
Parameters.AuthenticationStandard = True;
Parameters.UserName = "sa";
Parameters.Password = "pass";
Parameters.ConnectionString = "DRIVER=(SQL-server);SERVER=servet;UID=sa;PWD=;DATABASE=databas";
Parameters.DBMS = "MSSQLServer";

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

ExternalDataSources.DAX.SetConnection();
Vissa delar kanske inte är nödvändiga, men det fungerar.
Du måste köra koden EN GÅNG. Därefter kommer det att vara normalt att koppla... mystik förstås - varför detta var nödvändigt är inte klart...

2) Skrivskyddade datakällor- Ja, mirakel händer inte... men ibland vill man ha det...

3) DE KAN INTE ANVÄNDAS TILLSAMMANS MED INTERNA DATAKÄLLOR
Personligen dödade detta faktum mig på plats.

Hur kan det här vara... det vi väntade på och redan föreställde oss och slickade oss om läpparna om hur vi nu ska kombinera vår data med 1C i en begäran, kollapsa den - gruppera den, infoga den i rapporten, men så är inte fallet ...
Men det här hindrar naturligtvis inte erfarna människor... vilken tanke kom att tänka på? Det stämmer - tillfälliga tabeller:

4) DE KAN INTE ANVÄNDAS TILLSAMMANS MED TILLFÄLLIGA BORD

Men detta ser inte längre ut som tekniska svårigheter, utan ser mycket ut som vad de vill att vi ska göra "så att livet inte verkar som ett paradis" :).

5) Kan endast användas i ACS-anslutningar
För dem som inte vet, detta finns i ACS på fliken "Data Set Links". Använder du dem ofta? Bekväm? Tydligen vill de tvinga oss att använda dem oftare. Bara det finns en kolumn "Kommunikationsvillkor" och "Kommunikationsparameter". Jag har inte hittat ett exempel på deras användning i någon standardkonfiguration, och på något sätt är allt inte transparent i dokumentationen och i Khrustalevas arbete heller. Kan någon förklara för mig hur "anslutningsvillkoret" fungerar. Om du skriver Source Attributes = Receiver Attributes där så fungerar det inte. Naturligtvis kan villkoret skrivas i fältet "Uttryck" - i de flesta fall räcker det... men på något sätt fungerar det inte särskilt lätt.

Totalt sett löstes detta problem tidigare någonstans så här:
Kod 1C v 8.x Funktion InitializeDataSource()

DateStart = SettingsComposer.Settings.DataParameters.Items.Value;
DataCon = SettingsBuilder.Settings.DataParameters.Items.Value;
Om DataCon > "20100101" Då
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("Datum"));

//Vi kommer att fylla i redovisningskostnaden i tabellen
TypeNumber = New DescriptionTypes(ArrayNumber, CN);
TypeString = New TypeDescription(ArrayString, KS);
TypeDate = New TypeDescription(ArrayDate);

//tabell för att ladda data från SQL
TZ = New ValueTable();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Antal", TypNumber);
TK.Columns.Add("Period", DateType);

TK.Indices.Add("Period");

//Anslut till SQL
Connection String = "Provider=SQLOLEDB.1;Persist Security Info=True;Användar-ID=sa;Pwd=;Datakälla=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Använd Kryptering för Data=False;Tagg med kolumnkollation när det är möjligt=False;Initial Catalog=Reports";
Connection = New COMObject("ADODB.Connection");
Kommando = Nytt COMObject("ADODB.Command");
RecordSet = New COMObject("ADODB.RecordSet");
Datum = "";
Försök
Connection.Open(AbbrLP(ConnectionString));
Command.ActiveConnection = Anslutning;
Command.CommandText = "Välj * från PH där period >= "" + String(Format(DatumStart, "DF=ååååMMdd"))) + "" och punkt<= "" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + """;
RecordSet = Command.Execute();
RecordSet.MoveFirst();
Undantag
Retur av tekniska specifikationer;
Slutförsök;

Medan RecordSet.EOF = Falsk Loop
Rad = TK.Add();
Row.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Row.Qunty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Row.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
EndCycle;

Request = New Request();
VrTable = New TemporaryTableManager();
Query.SetParameter("vrDataTable", TK);
Query.SetParameter("Startdatum", Startdatum);
Request.SetParameter("DataCon", DateCon);
Query.Text = "VÄLJ
| vrDataTable.NomenclatureCode,
| vrDataTable.Qunty,
| vrDataTable.Period
|Placera datatabell
|FRÅN
| &vDataTable AS vrDataTable
| VAR
| vrDataTable.Period >= &DateStart
| Och vrDataTable.Period<= &ДатаКон";
Request.Run();
TZ = Odefinierad;

Request = Ny begäran;
Query.TemporaryTableManager = VrTable;
Query.Text = "Här är en fråga som involverar en variabel tabell";

Result = Query.Run();
Returnera Resultat;

EndFunction

ExternalSet = InitializeDataSource();
DataSet = new Structure();
DataSet.Insert("SQL-tabell", ExternalSet);
TypicalReports.GenerateTypicalReport(ThisObject, Result, Decryption Data, OutputToReportForm, Dataset);

Egentligen finns det inte många rader kod och de är ganska standard... i det här fallet kan du använda den fulla funktionaliteten hos frågedesignern, och bara ge funktionen DATA COMPOSITION till ACS

Men det ser verkligen inte lika snyggt ut... och varje gång du behöver skriva kod för att ladda upp värden till en tabell och kolla om du gjort fel i namnet på detaljerna... och vad vi fick i 1C ser på något sätt halvhjärtad ut. Jag har ännu inte bestämt mig för vilket som är bekvämast att använda. Du bestämmer och skriver om dina beslut och vad som fick dig att fatta dem.

Information hämtad från sajten

Arbeta med dem i listor i 1C Enterprise-läge.

Men i arbetet finns det ofta en situation där en del av datan lagras någon annanstans.

  • Onlinebutik (lagrar vanligtvis data i en extern MySQL/SQL-databas)
  • En annan bas.

För att arbeta med sådan data lagrad i andra databaser behöver särskilda mekanismer utvecklas.

I version 1C 8.2.14 har en ny dykt upp som heter 1C externa datakällor, vilket i hög grad underlättar programmerarens arbete, eftersom:

  • nu finns det inget behov av att skapa speciella mekanismer för att erhålla data
  • sådan information kan nås på vanligt sätt
  • sådan data kan ses i 1C-listor.
    • Extern datakälla 1C – extern SQL-databas

      Låt oss säga att vi har en SQL-databas där den data vi behöver lagras. Låt oss försöka läsa data från den med hjälp av 1C External Data Source-mekanismen.

      Låt oss lägga till en extern 1C-datakälla. Du måste gå till konfiguratorn, externa datakällor finns i konfigurationsfönstret, längst ner i trädet.

      1. Anslutning

      Låt oss lägga till en ny extern datakälla 1C, namnge den godtyckligt.

      Databasen består av tabeller. Vi måste lägga till dem i den tillagda externa datakällan. Högerklicka på den och välj Lägg till tabell.

      Första gången kommer det att uppmana dig att ange en anslutningssträng. Den kan matas in manuellt eller genereras genom att klicka på knappen "...".

      I vårt specifika fall kommer vi att välja "SQL Server" som drivrutin

      Låt oss fylla i de grundläggande parametrarna för att ansluta till SQL. Servernamnet kan anges eller väljas från listan.

      1C kommer att ansluta till SQL och erbjuda sig att välja en specifik databas från listan.

      Efter detta kommer 1C att visa en lista över tabeller i denna databas och deras kolumner. Du måste markera rutorna för att välja önskade tabeller.

      Tabeller och kolumner kommer att läggas till. Namnen kommer att vara desamma som de definieras i fjärrdatabasen. I 1C kan du byta namn på dem (i egenskaper).

      Här är ett exempel på den tillagda tabellen:

      Här är ett exempel på en tillagd kolumn:

      För att 1C-plattformen ska fungera med en extern tabell på samma sätt som den gör med 1C-kataloger, kan du ange ytterligare parametrar i tabellen:

      • I egenskapen Nyckelfält, ange en av kolumnerna som ska ge en unik identifiering av raden; om flera rader ger unikhet, fungerar inte denna metod (analogt med kodfältet)
      • I egenskapen Presentation Field, ange en av kolumnerna som ger en kort representation av raden (analogt med fältet Namn)
      • I egenskapen Tabelldatatyp anger du Objektdata.

      2. Visa

      Anslutningen till fjärrbasen görs inte automatiskt. För att ansluta måste du välja en standardmeny.

      I standardgrenen finns ett speciellt kommando Hantera externa datakällor, som låter dig specificera anslutningsparametrar (specifika för 1C Enterprise-läge) och göra en anslutning.

      Först måste du ange parametrarna för att ansluta till databasen.

      När du gjorde inställningarna i konfiguratorn visade den dig anslutningssträngen som ett resultat. Du kan se det igen genom att klicka på Lägg till tabell i konfiguratorn igen.

      Kopiera anslutningssträngen och ange den i 1C Enterprise-läge.

      Efter detta måste du göra den faktiska anslutningen.

      Efter att kopplingen är gjord är det möjligt att arbeta med listor.

      3. Använd i 1C-språk

      Anslutningen kan även göras från programkod på 1C-språk.

      Anslutningsparametrar specificeras enligt följande:
      ConnectionParameters = ExternalDataSources.SourceNameConfigurator.GetGeneralConnectionParameters();

      ConnectionParameters.AuthenticationStandard = True;
      ConnectionParameters.UserName = "sa";
      ConnectionParameters.Password = "lösenord";
      ConnectionParameters.ConnectionString = "anslutningssträng från konfiguratorn";
      ConnectionParameters.DBMS = "MSSQLServer";

      ExternalDataSources.SourceNameConfigurator.SetGeneralConnectionParameters(ConnectionParameters);
      ExternalDataSources.SourceNameConfigurator.SetUserConnectionParameters(UserName(), Parametrar);
      ExternalDataSources.SourceNameConfigurator.SetSessionConnectionParameters(Parameters);
      ExternalDataSources.SourceNameConfigurator.SetConnection();

      Du kan söka efter data från en databas med en vanlig . Ett exempel på en frågetext för en extern källa OurExternalSource och tabeller ExternalSource Table:

      VÄLJA
      ExternalSourceTable.FieldName
      FRÅN
      ExternalDataSource.OurExternalSource.Table.ExternalSourceTable"

      Extern datakälla 1C - arbetar med Excel-fil

      Låt oss prova ett annat alternativ - att arbeta med en Excel-fil via en extern 1C-datakälla.

      Låt oss skapa en enkel Excel-fil.

      Låt oss lägga till en extern källa, godtyckligt namnge den FileExcel. Låt oss lägga till tabellen "Sheet1$" till den. Som du lätt kan se är detta namnet på arket i Excel med tillägg av symbolen "$".

      Som i fallet med SQL, låt oss lägga till kolumner. Du kan lägga till dem manuellt. Det är viktigt att se till att de typer av kolumner du lägger till matchar, annars kan du senare få ett felmeddelande som "Datatyp missmatchar."

      För kolumnen måste du ange ett namn i 1C och ett namn i datakällan.

      Det finns en funktion för Excel (fel som "För få parametrar. 3 krävs"):

      • Om den första raden i en Excel-tabell innehåller kolumnnamn, måste du helt enkelt ange namnet på denna kolumn, till exempel "Kod".
      • Annars måste du ange det fullständiga namnet med tabellnamnet "Sheet1$.Code", men lägg till "HDR=NO;" i parametrarna.

      Anslutningsparametrarna för Excel-filen ser ut så här:

      • XLSX-filer (Office 2007 och senare)
        Drivrutin=(Microsoft Excel-drivrutin (*.xls, *.xlsx, *.xlsm, *.xlsb));DBQ=D:\FileExcel.xlsx;
      • XLS-filer (tidigare)
        Drivrutin=(Microsoft Excel-drivrutin (*.xls)); DriverID=790; DBQ=D:\FileExcel.xls;
        Du måste ange ditt eget namn och sökväg till filen.

Externa datakällor 1C - ett relativt nytt metadataobjekt 1C 8.3 och 8.2, med vilket det är möjligt att ansluta till 1C externa datakällor: SQL-tabeller, Excel, Access, FoxPro (dbf), ytterligare en 1C-databas, Oracle, Paradox (db) , - och till och med läsa från enkla txt/csv-filer.

Detta ger många möjligheter med andra system. Låt oss ta en närmare titt.

Konfigurera externa datakällor i 1C 8

Att ställa in externa källor är individuellt för varje typ av system. Men som regel är den allmänna delen av installationen densamma - det här ställer in anslutningssträngen:

Få 267 videolektioner på 1C gratis:

Om anslutningssträngen är korrekt specificerad kommer systemet att uppmana dig att välja önskad tabell från databasen. Som ett resultat kommer vi att få en färdig tabell där vi kan specificera nyckelfältet (ett unikt fält) och presentationsfältet (hur posten kommer att återspeglas i 1C):

Använda externa datakällor i 1C 8.3

Externa datakällor i 1C kan användas som andra databastabeller. Plattformen genererar automatiskt ett formulär för dem om ett sådant inte anges. Frågor kan också använda data från externa källor.