Åtkomst fungerar inte laddning i 1s. Källkoden för funktionen för att skapa en databasfil

Särdrag:

  1. Databasfilen kan skapas separat från data.
  2. Tabellen i databasfilen kan skapas separat från data.
  3. Datatyper konverteras för att vara kompatibla med åtkomst.
  4. Värden som är lika med tom datumsträng konverteras till null.
  5. Icke-primitiva och icke-stränga datatyper (referens) avkortas till 255 tecken.
  6. Strängdatatyper anpassar sig efter strängens längd för att spara utrymme.
  7. Det enda citattecknet 'kommer att skrivas till databasen med char () -frågefunktionen.
  8. Automatisk tillägg av primärindex (radantal).

Begränsningar:

  1. Fungerar endast med en tabell med värden som en datakälla.
  2. Mekanismen fungerar bara i tjockt klientläge. Detta beror på användningen av ADO -biblioteket och värdetabellen samtidigt.
  3. Arbete är endast möjligt på Windows -system.

Själva mekanismen består av tre block:

  1. Databasfilskapande funktion.
  2. Databas tabell skapande funktion.
  3. Funktionen att skriva data till databastabellen.

Schematiskt ser mekanismens funktion ut så här:

Källkoden för funktionen för att skapa en databasfil:

// funktion skapar ny fil DB med möjlighet att skriva över det gamla// Parameter // Parameter 2: booleskt - skriv över flaggan om databasfilen redan finns // returnerar 0 vid framgång och inte 0 om funktionen misslyckas Funktion CreateFileAxes (Value FileName, Value OverwriteFile = True) // Kontrollera om filnamnet är giltigt Om EmptyString (FileName) Returnera sedan - 2; Annat // analysera platsen för filen på disken If OverwriteFile Then File = New File (FileName); If File. Finns () Då File = Odefinierad; DeleteFiles (FileName); EndIf; EndIf; EndIf; Stat(" Åtkomstfilen skapas:"+ Filnamn); // skapa ett databasskal Försök ADOX = Nytt COMObject ("ADOX ... Katalog"); Undantagsrapport (" " + Symboler. PS + DescriptionErrors ()); EndTry; // Anslut till den nyskapade databasen ConnectionString = "Provider" "" + Filnamn + "" "" "; // anslut Försök ADOH. Skapa (ConnectionString); Undantagsrapport (" Det gick inte att skapa datafilen. När du skapar ett ADOX -objekt. Katalog ett fel har uppstått!" + Symboler. PS + Felbeskrivning ()); Retur - 1; Avsluta försök; ADOC. ActiveConnection. Stäng (); ADOC = Odefinierad; Retur 0; EndFunction

Funktionen tar emot 2 parametrar:

  1. Namnet på den framtida databasfilen är en sträng. Detta är den fullständiga sökvägen till filen. Om du inte klarar den avslutas proceduren.
  2. Skriv över fil - booleskt. Detta är en boolsk flagga som använder filöverskrivningsmekanismen.

Hela filnamnet kontrolleras först. Vidare är mekanismen för att skriva över filen utarbetad. Den befintliga filen raderas vid behov. Därefter går proceduren vidare till skapandet tom fil DB. Detta görs med hjälp av ADOX.Catalog -objektet. För att analysera det komplexa med ADOX.Catalog -arbete rekommenderar jag att du letar efter relevant information på Microsofts webbplats.

Den andra "växeln" i lossningsmekanismen vid åtkomst implementerar skapandet av en tabell i en databasfil. För att skapa tabeller används samma ADOX.Catalog -objekt.

Källkoden för proceduren för att skapa en ny tabell i databasen:

//Parameter 1: sträng - fullständiga namn databasfil//Parameter 2: Värdeförteckning- Tabell med data som ska laddas ner//Parameter 3: struktur - en beskrivning av tabellen som skapas (du kan skapa den med funktionen: ComposingStructureDescriptionFields) // Returnerar 0 på framgång och inte 0 om funktionen misslyckas Funktion EnterDataTable (Value FileName, ValueDataTable, ValueDescriptionTable) ConnectionString = "Provider = Microsoft. Jet. OLEDB. 4. 0; Datakälla ="" " + Filnamn +" "" ; Jet OLEDB: Motortyp = 5;"; Connector = Nytt COMObject (" ADODB ... Förbindelse"); Connector. ConnectionString = ConnectionString; // Connection Attempt Connector. Open (); Undantagsrapport (" Det gick inte att öppna DB -filen!"); Rapport (ErrorDescription ()); Return - 1; Avsluta försök; Status (" Jag fyller tabellen med data:"+ DescriptionTable .NameTable); // DB -kommandobjekt Com = Nytt COMObject ("ADODB ... Kommando"); Com. ActiveConnection = Connector; // konstant 1 betyder "fråga", det finns också vyer och lagrade procedurer Com. CommandType = 1; LineCount = 1; För varje rad TZ från datatabell Cykel UserUser InterruptProcessing (); // gå igenom datakolumnerna FieldList = Format (LineCounter, "ChG = " ) + " , " + Symboler. PS; LineCounter = LineCount + 1; ColumnCount = 0; För varje ColumnTZ från datatabellen. Columns Cycle TekValue = StringTZ [ColumnTZ. Name]; Field Description = Table Description. Field Description. Get (ColumnCounter); // analysera datatypen Om fältbeskrivning. Typ = " 3 "Då // heltal nummer TekValue =? (TekValue = null, 0, TekValue); FieldList = FieldList + Format (TekValue," CHN = null; ChG =" ) + " , 5 "Då // är siffran bråkdelad // konvertera null till 0 eftersom ytterligare funktion Format () inte konverterar det korrekt TekValue =? (TekValue = null, 0, TekValue); FieldList = FieldList + Format (TekValue, "RHD =. ; CHN = null; ChG =" ) + " , "+ Symboler. PS; ElseIf FieldDescription. Type =" 7 "Då // datum TekValue =? (TekValue = null," 00010101 " , TekValue); Om TekValue = " 00010101 " Sedan ModValue = " null"; Annars ModValue =" "" + Format (TekValue, "DLF = DT") +" ""; EndIf; FieldList = FieldList + ModValue + " , "+ Symboler. PS; ElseIf FieldDescription. Type =" 11 "Då // boolean TekValue =? (TekValue = null, False, TekValue); FieldList = FieldList + Format (TekValue," BL = falskt; BI = sant" ) + " , "+ Symboler. PS; ElseIf FieldDescription. Type =" 202 "Då // string TekValue =? (TekValue = null," ", TekValue); ValueString = Leo (TekValue, 255); If EmptyString (ValueString) Then FieldList = FieldList +" null,"+ Symboler. PS; Annars ModValue = StrReplace (ValueString," "", "" + chr () + " "); ListFields = ListFields +" "" + Förkortning (Leo (ModValue, 255)) + "" , "+ Tecken. PS EndIf; ElseIf FieldDescription. Type =" 203 "Then // string If EmptyString (ValueString) Then FieldList = FieldList +" null,"+ Symboler. PS; Annars ModValue = StrReplace (TekValue," "", "" + chr (" + CharacterCode (" "") + " ) + " "); ListFields = ListFields +" "" + ModValue + "" , " + Symboler. PS EndIf; EndIf; ColumnCounter = ColumnCount + 1; EndCycle; // trimma det sista komma FieldList = Leo (FieldList, StrLength (FieldList) - 2); QueryText = "INSERT INTO" + TableDescription. Tabellnamn + "VÄRDEN ( " + FieldList +" ) "; Command. CommandText = Begär text; Försök. Kommando. Utför (); Undantagsrapport (" Dataskrivfel!" + Symbols. PS +" Request Text: " + Request Text + Symbols. PS + Error Description ()); Return - 2; EndTry; EndCycle; // stäng anslutningen Com. ActiveConnection. Stänga (); Klump = Odefinierad; Anslutning = Odefinierad; Returnera 0; EndFunction

Funktionen tar emot tre parametrar:

  1. StructureDescriptionTables - en struktur som innehåller en beskrivning av själva tabellen och dess fält. Bildas av en hjälpfunktion, som jag kommer att ge nedan.
  2. Filnamn - databasfilens strängnamn.
  3. DeleteExistingTable är en kryssruta som bestämmer funktionens beteende med avseende på befintliga tabeller med samma namn.

Efter att ha fått kontroll öppnar funktionen databasfilen. Om anslutningen lyckas skapas ett objekt "ADOX.Catalog" (tabellkatalog), som först kontrollerar tabellens existens i enlighet med parametern för funktion # 3. Nästa åtgärd skapar nytt bord... Ett nyckelfält (index) läggs till i tabellen. Baserat på parametern för funktion # 2 skapas vidare tabellfälten för motsvarande typer. Efter avslutad katalogiseras det nyskapade bordet och anslutningen stängs.

Naturligtvis är det ganska tidskrävande att manuellt samla in parametern för funktion # 2; för enkel användning skrev jag en funktion som, baserat på tabellen över värden med data, utgör strukturen för beskrivningen av tabellen.

Källkoden för funktionen som består av strukturen för beskrivningen av fälten:

// hjälpfunktion för att dela upp strukturen i fältbeskrivningen//Parameter 1: Värdeförteckning- Tabell med data som ska laddas ner//Parameter 2: string - fullständigt tabellnamn (får inte innehålla ogiltiga tecken: ",.) // Returnerar strukturen för tabellbeskrivningen Funktion ComposeFieldDescriptionStructure (ValDataTable, ValueTableName) DescriptionStructure = Ny struktur ("TableName , BeskrivningFält"); DescriptionStructure. TableName = TableName; DescriptionStructure .FieldsDescription = New Array; // gå igenom kolumnerna i tabellen över värden För varje kolumn TZ från datatabell. Kolumner Loop StructureFieldProperty = Ny struktur ("Namn , Typ, Längd, Synonym"); ColumnValueType = ColumnTZ .ValueType; StringLength = ColumnValueType .StringQualifiers. Length; // kontrollera typerna i kolumnen // någon sammansatt typ kommer att vara en sträng Om ValueType är kolumn. Typer (). Count ()> 2 Sedan FieldPropertyStructure. Namn = Kolumn TK. Namn; StructurePropertyField. Typ = " 202 "; // adVarWChar, skriv FieldPropertyStructure. Length = 255; FieldPropertyStructure. Synonym = TK Column. Header; AnnarsIf ColumnValueType. ContainsType (Type (" Linje")) Sedan FieldPropertyStructure. Name = TKColumn. Name; IfStringLength = 0 Sedan FieldPropertyStructure. Type =" 203 " ; // adLongVarWChar ("memo"), typ 203 [Unicode text stream (DT_NTEXT)]202 "; // adVarWChar, typ 202 [255 tecken Unicode -sträng (DT_WSTR)] //StructureFieldProperty.Length =? (StringLength 0 Då // fel hos redaktören av artikeln när du klistrade in koden, kunde inte fixa det, se bearbetning StructurePropertyField. Typ = " 5 "; // adDouble, skriv 5 Annars FieldPropertyStructure. Typ = " 3 "; // adInteger, typ 3 EndIf; ElseIfColumnValueType. ContainsType (Type ("Boolean")) ThenStructureFieldProperty. Namn = Kolumn TK. Namn; StructurePropertyField. Typ = " 11 "; // adBoolean, typ 11 StructurePropertyField. Längd = Odefinierad; StructurePropertyField. Synonym = Kolumn TK. Titel; ElseIfColumnValueType. ContainsType (Type ("Date")) Sedan FieldPropertyStructure. Namn = Kolumn TK. Namn; StructurePropertyField. Typ = " 7 "; // adDate, typ 7 StructurePropertyField. Längd = Odefinierad; StructurePropertyField. Synonym = Kolumn TK. Titel; Annars FieldPropertyStructure. Namn = Kolumn TK. Namn; StructurePropertyField. Typ = " 202 "; // adVarWChar, typ 202 [255 tecken Unicode -sträng (DT_WSTR)] StructurePropertyField. Längd = 255; StructurePropertyField. Synonym = Kolumn TK. Titel; EndIf; Struktur Beskrivning. Beskrivning av fält. Lägg till (FieldPropertyStructure); Slut på cykel; Returstruktur Beskrivning; EndFunction

Funktionen tar emot 2 parametrar:

  1. DataTable är en värdetabell med data. Från denna parameter bildar funktionen en beskrivning av datatyperna för framtida fält. Jag rekommenderar att du skapar denna tabell med värden genom en fråga, eftersom i detta fall alla TK -fält skrivs in.
  2. TableName - strängnamn framtida bord tillgång.

Inledningsvis skapas en struktur med en beskrivning av själva databasen, varefter en matris läggs till, som kommer att innehålla andra strukturer med en beskrivning av fälten. I processen att gå igenom kolumnerna i tabellen med värden fylls matrisen med fältbeskrivningar. Fältbeskrivningsstrukturen innehåller fyra huvudegenskaper:

  1. Namn - strängen för namnet på det framtida fältet. Får inte innehålla mellanslag eller inkompatibla tecken. Om du bildar en tabell med värderingar med en fråga bör det inte vara några problem, men när du själv fyller i tabellen med värden ligger ansvaret helt och hållet på dig.
  2. Typen är sträng, det är en Microsoft -konstant. I vårt fall används endast: heltal, bråknummer, sträng (av olika längder), booleskt och datum.
  3. Längd är ett tal, för strängtyper.
  4. Synonym - sträng, textbeskrivning av fältet.

Efter att ha avslutat konstruktionen av strukturen återvänder hon.

Slutligen kan du gå till funktionen som skriver data till databastabellen. I denna funktion kan man säga att kärnan i funktionaliteten för hela mekanismen är koncentrerad. Således, denna funktionär det svåraste, men det borde inte skrämma dig. En programmerare är en programmerare eftersom han utvecklar ett analytiskt tänkesätt.

Källkoden för funktionen som matar in data i tabellen:

// funktion matar in data i tabellen //Parameter 1 : string - fullständigt namn på databasfilen //Parameter 2 : Värdebord - Tabell med data som ska laddas ner //Parameter 3 : struktur - beskrivning av tabellen som skapas (du kan skapa den med funktionen: ComposingStructureDescriptionFields) // Returnerar 0 vid framgångsrikt slutfört arbete och inte 0 om funktionen misslyckas Fungera Data EntryTable (Menande Filnamn , Menande Datatabell , Menande Beskrivning Tabeller ) StringConnection = " Leverantör = Microsoft . Jet . OLEDB . 4 . 0 ; Datakälla = " " " + Filnamn + " " " ; Jet OLEDB: Motortyp = 5 ; " ; // objekt som ansvarar för kommunikation med databasen Anslutning = Ny COM -objekt (" ADODB . Förbindelse" ) ; Anslutning . ConnectionString = StringConnection ; // anslut Försök Anslutning . Öppen () ; Undantag Att rapportera (" Inte lyckades öppna db -filen!" ) ; Att rapportera ( BeskrivningFel () ) ; Lämna tillbaka - 1 ; Avsluta försök; stat (" Jag fyller tabellen med data:" + Beskrivning Tabeller . NameTable ) ; // DB -kommandobjekt Klump = Ny COM -objekt (" ADODB . Kommando" ) ; Klump . ActiveConnection = Anslutning ; //konstant 1 betyder "fråga", det finns också vyer och lagrade procedurer Klump . CommandType = 1 ; CounterStrings = 1 ; För Varje rad TK Från Datatabell Cykel Användaravbrottshantering () ; // gå igenom datakolumnerna ListFields = Formatera ( CounterStrings , " ChG = " ) + " , " + Symboler . PS ; CounterStrings = CounterStrings + 1 ; Kolumnräknare = 0 ; // loop för att bilda listan över fält För Varje kolumn Från Datatabell . Högtalare Cykel TekValue = Sträng TZ [ Kolumn TZ . namn ] ; BeskrivningFält = Beskrivning Tabeller . BeskrivningFält . Motta ( Kolumnräknare ) ; // analysera datatypen Om BeskrivningFält . Sorts = " 3 " Sedan // heltal ListFields = ListFields + Formatera ( TekValue , " CHN = null; ChG = " ) + " , " + Symboler . PS ; Annars, om BeskrivningFält . Sorts = " 5 " Sedan // bråknummer ListFields = ListFields + Formatera ( TekValue , " CRD = . ; CHN = null; ChG = " ) + " , " + Symboler . PS ; Annars, om BeskrivningFält . Sorts = " 7 " Sedan //datum Om TekValue = "00010101 " Sedan Mod -värde = " null" ; Annat Mod -värde = " " " + Formatera ( TekValue , " DLF = DT" ) + " " " ; EndIf; ListFields = ListFields + Mod -värde + " , " + Symboler . PS ; Annars, om BeskrivningFält . Sorts = " 11 " Sedan // booleskt ListFields = ListFields + Formatera ( TekValue , " BL = falsk; BI = Sann" ) + " , " + Symboler . PS ; Annars, om BeskrivningFält . Sorts = " 202 " Sedan //linje ValueString = ett lejon ( TekValue , 255 ) ; Om Tom rad ( ValueString ) Sedan ListFields = ListFields + " null, " + Symboler . PS ; Annat // Enstaka citat är ett specialtecken i sql // förvandla denna karaktär genom kod Mod -värde = Sidbyte ( ValueString , " " " , " " + chr (" + Symbolkod (" " " ) + " ) + " " ) ; ListFields = ListFields + " " " + SokrLP ( ett lejon ( Mod -värde , 255 ) ) + " ", " + Symboler . PS EndIf; Annars, om BeskrivningFält . Sorts = " 203 " Sedan //linje Om Tom rad ( ValueString ) Sedan ListFields = ListFields + " null, " + Symboler . PS ; Annat Mod -värde = Sidbyte ( TekValue , " " " , " " + chr (" + Symbolkod (" " " ) + " ) + " " ) ; ListFields = ListFields + " " " + Mod -värde + " ", " + Symboler . PS EndIf; EndIf; Kolumnräknare = Kolumnräknare + 1 ; Slut på cykel; // För varje ColumnTZ från DataTable.Columns Loop // trimma det sista komma ListFields = ett lejon ( ListFields , Str Längd ( ListFields ) - 2 ) ; // slutlig bildning av förfrågningstestet Begär text = " SÄTT IN I" + Beskrivning Tabeller . NameTable + " VÄRDEN (" + ListFields + " ) " ; Klump . CommandText = Begär text ; // skriva data till databasen (frågekörning) Försök Klump . Kör() ; Undantag Att rapportera (" Dataskrivfel!" + Symboler . PS + " Begär text:" + Begär text + Symboler . PS + BeskrivningFel () ) ; Lämna tillbaka - 2 ; Avsluta försök; Slut på cykel; // För varje rad TZ från dataslinga // stäng anslutningen Klump . ActiveConnection . Stänga () ; Klump = Odefinierad; Anslutning = Odefinierad; Lämna tillbaka 0 ; EndFunction

Funktionen tar emot tre parametrar:

  1. Filnamn - sträng är namnet på databasfilen.
  2. DataTable är en tabell med värden som innehåller data.
  3. DescriptionTables är en struktur som beskriver tabellens fält och namnet.

För att arbeta med databasen skapas en anslutning som vi redan känner till. Efter att ha anslutit skapar vi ett objekt som ansvarar för att köra SQL -instruktioner. Därefter organiserar vi en slinga genom raderna i tabellen med värden (parameter för funktionen # 2) och en kapslad slinga genom tabellernas kolumner. Radräkningen används för att indexera raderna. Kolumnräknaren används för att söka efter fältbeskrivningen i tabellbeskrivningsstrukturen (parameter 3). Genom att gå igenom kolumnerna i nästa rad analyserar vi deras typer (enligt beskrivningen av tabellen) och utför lämpliga transformationer. Som ett resultat har vi ett färdigt sql-kommando för att skriva en rad till databasen. Vi tillämpar den mottagna sql -satsen med hjälp av ADODB.Command -objektet. I slutet av processen, stäng anslutningarna och rensa minnet.

Tyvärr på den här webbplatsen kunde jag inte bifoga bearbetning för en tjock klient, som kan ladda upp kataloger till åtkomstdatabasen. Men du kan ladda ner den på Yandex -disken: http://yadi.sk/d/UzK_PAsJ3vjTS... Denna bearbetning omfattar alla detaljer i den universella lossningsmekanismen. Naturligtvis är denna behandling inte begränsad till denna mekanism. Det kan säkert kopieras som i separat modul, och i deras bearbetning. Jag utesluter inte felaktiga situationer som kan leda till att uppladdningen kraschar, men det här är inte ett kommersiellt projekt. Du är fri att ändra denna mekanism för att passa dina behov. Nedan finns 2 bilagor som beskriver adoxkonstanter. Jag hoppas att du tycker att den här mekanismen är användbar. Jag önskar dig framgång inom ditt yrkesområde!

Bilaga 1 lista över ytterligare egenskaper för åtkomsttabellfältet:

AutoIncrement

Anger fälttypen Räknare som ska ökas automatiskt när en post läggs till.

Standard

Standardfältvärde.

Beskrivning

Beskrivning av fältet.

Bestämd längd

Avgör om fältet kommer att vara av fast längd eller variabel.

Ökning

Värdet med vilket fältet av "räknaren" -typen kommer att ökas.

Nullable

Avgör om fältet inte får innehålla något värde, med andra ord, om detta fält ska krävas.

Utsäde

Värdet från vilket man ska börja räkna i den första posten för ett fält av typen "räknare".

Jet OLEDB: Tillåt nollängd

Avgör om textfält kan innehålla strängar med noll längd. Ignoreras för icke-teckenfält.

Jet OLEDB: AutoGenerate

Avgör om ett nytt GUID -värde genereras automatiskt för fält av typen adGUID.

Jet OLEDB: Kolumnvalideringsregel

Ett uttryck som bestämmer riktigheten av värdet som skrivs i fältet måste skrivas i SQL WHERE -formatet, men utan nyckelord VAR.

Jet OLEDB: Kolumnvalideringstext

Texten som visas om värdet som anges i fältet inte matchar regeln som definierats för detta fält (regel).

Jet OLEDB: Komprimerade UNICODE -strängar

Avgör om Microsoft Jet kommer att komprimera UNICODE -strängar när den skrivs till hårddisken. Ignoreras om databasen inte finns Microsoft -format Jet version 4.0.

Jet OLEDB: Hyperlänk

Anger att data i fältet är en hyperlänk. Ignoreras för andra fält än adLongVarWChar.

Jet OLEDB: IISAM Not Last Column

För installerbara ISAM informerar den här egenskapen I-ISAM om att det finns fler kolumner som kommer att läggas till i tabellen efter den här. Om du använder ITableDefinition :: AddColumn eller ITableDefintion :: CreateTable krävs att du anger den här egenskapen för varje.

Jet OLEDB: En BLOB per sida

Avgör om data ska lagras på separata sidor (True) eller kan använda delade databassidor för att spara diskutrymme. Fungerar endast med fält av typen adLongVarBinary.

Bilaga 2 lista över värdetyper som används i ADOX

adDouble, typ 5 - bråknummer

adDate, typ 7 - datum / tid

adCurrency, skriv 6 - heltal

adInteger, typ 3 - osignerat heltal

adBoolean, typ 11 - boolean

adVarWChar, typ 202 - en unicode -sträng med 255 tecken

adLongVarWChar ("memo"), typ 203 - unicode sträng obegränsad sträng

Nyligen behövde jag ladda ur all data från en enkel Access-databas till en självskriven konfiguration (1C: Enterprise. Det fanns inte mycket information att överföra och i princip var det möjligt att ladda ner denna fascinerande process till användaren, men jag bestämde sig för att hjälpa de redan hektiska medarbetarna.

Hjälpen bestod i den fullständiga automatiseringen av denna process. Jag var tvungen att skriva en enkel bearbetning som gjorde allt på några sekunder. Innan den här uppgiften behövde jag inte arbeta med ett gäng 1C + Access, så innan jag tog tag i tangentbordet och började slå koden bestämde jag mig för att läsa manualen.

Jag visste redan från början att all interaktion skulle vara att använda lämpliga leverantörer, men bestämde mig ändå för att gräva i exemplen.

Jag tänkte länge på vilket sätt jag skulle skriva den här lappen. Till slut bestämde jag mig för det enklaste alternativet - att ge koden till min lösning. Det är kanske inte särskilt optimalt, men för de flesta uppgifter är det mer än tillräckligt.

Så, låt oss börja titta på allt i ordning. Vi skapar en ny bearbetning och kastar en enda komponent på den - "TableField". Jag har sträckt ut denna komponent över hela formen. Som ett resultat fick min form formen som i figur 1.


Figur 1. Bearbetningsform

På detta kan vi anta att formen är klar. Vi kommer inte att skapa kolumner manuellt, utan kommer att utföra denna procedur dynamiskt. Lyckligtvis är det inte svårt. Skapa en OnClick -händelsehanterare för Kör -knappen och skriv följande kod i den:

// Rensa vårt tabellfält TableField1.Clear (); TabularField1.Columns.Clear (); // Förbered anslutningssträngen MS Access // Sökvägen till databasen anges i slutet ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Datakälla =" + "C: \ mydb.mdb"; ConnectionWithBase = Nytt COMObject ("ADODB.Connection"); // ConnectConnectionWithBase.Open (ConnectionString); // Få en uppsättning poster från tabellen demo_table RecordsCollection = Nytt COMObject ("ADODB.Recordset"); CollectionRecords.Open ("välj * från demo_table", ConnectWithBase, 1); // läs strukturen för tabellens fält // I tabellen med värden skapar du alla kolumner som finns i tabellen Access. .Fields.Item (сч) .Name)); End of the Loop; // Flytta markören till den första posten i Records Collection.MoveFirst (); // läs data från tabellen // och lägg till dem i TOR NOT RECORD -samlingen ännu. EOF Loop NewRow = TableField1. Add (); För antal = 0 med RecordsCollection.Fields.Count - 1 loop NewRow ["Column" + nt] = RecordsCollection.fields (TabularField1.Columns [nr] .Header) .Value; EndCycle; RecordsCollection.MoveNext (); End of the Loop; // Visa data från TK i TabularFieldForm Elements.TableField1.Value = TabularField1; Form Elements.TableField1.Create Columns ();

Koden visade sig inte vara för stor, men tillräckligt användbar. Jag binder mig inte till en specifik struktur. Koden fungerar utmärkt på en mängd olika bord. Jag har inget mer att tillägga, så jag säger hejdå

Kort sagt ingenting. I allt som rör interaktion med statliga myndigheter (oavsett om det är skatt, bokföring, alla typer av punktskatter etc.) kan 1C inte ersättas av någonting och det är åtminstone okonstruktivt att försöka göra detta.

Men sluta inte läsa den här artikeln, detta är inte huvudidén ännu. Det viktigaste är att inte falla i en logisk fälla och inte betrakta 1C som helt oumbärlig i någon del av automatiseringen av alla processer i företaget. Här finns det något att argumentera med och något att erbjuda. Jag vill berätta om en framgångsrik erfarenhet av att automatisera olika aspekter av affärsverksamheten hos ett datorföretag och naturligtvis om integrationen av denna lösning med 1C. Arbetet växte fram ur behovet av att koppla ihop ett egenutvecklat system med 1C-programmet, men detta tillvägagångssätt (uppdelning i 2 mjukvarublock) kan utvecklas till en fullfjädrad filosofi om att bygga ett informationssystem i allmänhet.

Inledningsvis var uppgiften följande. Det var företagssystem automatisering skriven in Microsoft Access... Under de långa utvecklingsåren har den absorberat nästan alla dagliga uppgifter - underhåll av en bank, fakturering, upprättande av redovisningsdokument för leverans, underhåll av ett lager, redovisning av komponenter för serie nummer, utarbeta tekniska kartor för produktion etc. Nyligen har systemets funktioner lagts till: skapandet av bankbetalningar direkt på grundval av inkommande fakturor, automatisk generation prislistor i olika format för publicering på webbresurser, uppdatering av företagets webbplats och upprättande av kontrakt baserat på befintliga mallar (så kallad kontorsautomatisering). Plus närvaron av en stor mängd analyser och all förvaltningsredovisning. Allt detta gjorde systemet helt oersättligt - att överföra all denna funktionalitet till 1C skulle ta mycket tid och pengar.

Å andra sidan tillgodosåg 1C-Enterprise-programmet endast redovisningsavdelningens behov för att underhålla BU och NU och skicka rapporter. Således "frikopplades" 1C från företagets dagliga funktion och de utförda dokumenten infördes i databasen i efterhand.

Varför är ett sådant schema bra? Det finns flera fördelar:
- att chefer och andra (utan) ansvariga personer inte får tillträde till "heligheten" - bokföringsbasen, som endast bör bildas av anställda som har förståelse för ämnet; korrekt underhåll av referensböcker,
- ta ur 1C allt som inte har med det att göra: från ledningsuppgifter som inte kräver reflektion i redovisning, till andra punkter som är specifika för företaget och som inte bör nås av utomstående,
- besparingar på licenser: 1C -jobb kostar mycket pengar,
- viktig poäng: när man introducerar all den extra funktionalitet som beskrivs ovan direkt "inuti" 1C, finns det ett ständigt behov av att förfina den när produktuppdateringar släpps. Detta garanterar naturligtvis nästan konstant anställning av 1C -programmerare, men det här är en plats där du kan spara pengar avsevärt.

Jo, det feta minuset är naturligtvis behovet av att dubbelkolla alla dokument och fylla i referensböckerna.

Egentligen var detta huvuduppgiften - att komma bort från dubbelarbete.

Först måste du hantera alla slags kataloger - först och främst är detta en katalog över entreprenörer och nomenklatur. Problemet med att synkronisera kataloger, som så ofta uppstår i sådana här program, är tillräckligt utvecklat och begripligt vid genomförandet. Men i det här fallet fattades ett frivilligt beslut att inte använda 2 kataloger med ömsesidig synkronisering, utan att ha en originalversion - den som ingår i MS Access, och helt enkelt replikera den i 1C ( Responsär bara ett märke i MS Access att denna position redan har laddats ur).
Detta tillvägagångssätt förenklar uppgiften avsevärt. För rent redovisningsbehov behövs väldigt få positioner i sådana kataloger - och de är också inrättade i ett externt program för att inte bryta mot den formulerade principen. Således kan du ta bort en till ofta problem- enorm inflation i referensboken för den använda nomenklaturen. Nedan finns produktgruppen "Bildskärmar"

Att ladda upp sådan skräck till 1C -katalogen (och nya bildskärmsmodeller dyker upp nästan varje vecka) kan konfigureras på ett sådant sätt att de alla hamnar i samma position, eftersom nyanserna i bildens färg runt skärmen och antalet pixlar är helt obetydliga för redovisning! Och storleken på diagonalen, om jag ska vara ärlig, ännu mer om den skiljer sig med en halv tum.

I det externa programmet är det dessutom möjligt med mycket mindre förluster att räkna ut sammanslagningen av dubblerade positioner i kataloger, särskilt i katalogen av motparter, eftersom det i 1C kräver mycket ansträngning.

I 1C laddas alltså endast "raffinerade", rengjorda och presenterade i rätt form data. Avlastning kan utföras med viss frekvens - portionering gör att du kan felsöka bokföringsavdelningens arbete och undvika onödigt arbete, om något under dagen (eller en längre period) avbröts, ändrades, genomfördes igen - alla dessa saker händer i MS Access arbetsbas, och bara "etablerad" Läget går till 1C. Dessutom kan denna typ av lossning synkroniseras med backupoperationer och alltid vara säker på att det aktuella tillståndet för 1C -basen är korrekt.

Uppenbarligen tas dokument emot utan automatisk bokföring (även om detta också kan konfigureras). Förresten, MS Access -databasen kontrollerar själv tillgången på nödvändiga varor på lagret - för avskrivning för leverans (dilemmat - för att säkerställa att fakturan kan utfärdas före det aktuella datumet, att alla artiklar som är nödvändiga för att skriva utanför är på lagret - det vill säga köpt eller producerat - du måste ... för att skicka dokumentet i 1C. Det verkar som att det inte är värt att lita på cheferna - annars borde det alltid finnas en redovisningsanställd bakom chefen)

Nu om genomförandet. 1C -program stöder datautbytesgränssnittet via ADO -mekanismen. På 1C -sidan används en vanlig. programvarugränssnitt att skapa element i kataloger och dokument, så att denna mekanism inte fungerar beror på de interna detaljerna i 1C -implementeringen, som kan ändras från version till version och från uppdatering till uppdatering. Å andra sidan var utvecklingens främsta slogan "att använda kapaciteten hos 1C maximalt, där det är möjligt". Därför, i den slutliga implementeringen av paketet från MS Access, laddades endast namnet och TIN på motparten - uppgifterna "hämtades" från Unified State Register of Legal Entities och Individual Entrepreneurs med hjälp av mekanismen inbyggd i 1C (samma gäller för bankuppgifter- de uppdateras av BIK).

I den externa MS Access -databasen skapades frågor (Query) som förbereder all nödvändig data för att kunna laddas till 1C - ta den och lägg den i dokument och fält.

Avlastningssystemet består av två steg. Först laddas nya positioner i motpartskataloger och nomenklatur. GUID: erna som tilldelats av 1C returneras till MS Access så att när du laddar ur alla dokument i det andra steget ställer du in rätt länkar till referensböcker. Det ser ut så här

Vi tror att en sådan ideologi att bygga informationssystem kan läggas till grund inte bara i de företag där det finns äldre icke-1C-system, utan också när man organiserar arbetet med nya juridiska personer, eftersom vi har mycket erfarenhet av MS Access. Fördelarna med denna metod beskrivs ovan.

Denna artikel kommer att fokusera på att ställa in användaråtkomsträttigheter för objekt i 1C -systemet.

I 1C 8 används ett separat metadataobjekt för att hantera användaråtkomst, som kallas Roller.

Notera! Denna artikel är skriven för att hjälpa programmerare. Konfigurera rättigheter i användarläge med exemplet 1C Accounting diskuteras i.

En roll definierar den uppsättning rättigheter som en användare har. Rollmekanismen liknar mycket Windows rättighetsmekanismer Active Directory... För vart och ett av objekten (referensböcker, dokument) anger utvecklaren sin egen uppsättning rättigheter - läs / skriv / lägg till / ändra / ...

Uppsättningen av tillgängliga rättigheter - samling av alla behörigheter i användarroller.

Om vi ​​öppnar rollmetadataobjektet kan vi se följande bild:

Objektet har två flikar - Rättigheter och begränsningsmallar. Rättigheter - huvudfliken, mallar - en flik för att ställa in rättigheter på postnivå i 1C ( RLS). Detta är ett mycket viktigt ämne, jag ska försöka beskriva det i framtida artiklar.

Vi kommer bara att överväga fliken Rättigheter.

  • Objekt- listan för vilken rättigheterna kommer att anges.
  • Rättigheter- en lista över rättigheter som kan ställas in.
  • Begränsa åtkomst till data- rollfält för anpassning

Var uppmärksam på bockarna längst ner:

  • Ange rättigheter för nya objekt- om flaggan är inställd för en roll kommer tillåtande rättigheter automatiskt att ställas in på nya metadataobjekt. Jag rekommenderar att du installerar om du ofta glömmer att ställa in rättigheterna för nya objekt.
  • Ange rättigheter för detaljer och tabellavsnitt standard- en flagga, när de är inställda, kommer attributen och tabellavsnitten att ärva ägarens rättigheter (referensbok, dokument, etc.)
  • Oberoende rättigheter för underordnade objekt- om flaggan är inställd, kommer systemet, när man bestämmer rätten till konfigurationsobjektet, att ta hänsyn till rättigheterna till det överordnade objektet

Inställningsrättigheter för hela konfigurationen

Om vi ​​öppnar rollen och klickar på konfigurationsroten ser vi följande inställningar:

Mer om var och en av rättigheter till hela konfigurationen:

Få 267 1C -videohandledning gratis:

  • Administrering- administrering informationsbas(kräver "Datahantering" rätt)
  • Datahantering- rätten till administrativa åtgärder med uppgifterna
  • Uppdaterar databaskonfiguration- rätt till
  • Exklusivt läge- användning av exklusivt läge
  • Aktiva användare- visa listan över aktiva användare
  • - registreringslogg
  • - rätten att starta tunn klient
  • - rätten att starta webbklienten
  • Fet klient- rätten att köra den feta klientrollen
  • Extern anslutning- rätten att starta en extern anslutning
  • Automatisering- rätten att använda automatisering
  • Alla funktioner läge- i hanterat applikationsläge
  • Sparar användardata- tillstånd eller förbud att spara användardata (inställningar, favoriter, historik). Speciellt relevant för 1C -hanterade formulär.
  • Interaktiv upptäckt externa behandlingar - öppna externa behandlingar
  • Öppna externa rapporter interaktivt- öppna externa rapporter
  • Produktion- skriva ut, skriva och kopiera till Urklipp

Ange 1C 8.2 -rättigheter till andra metadataobjekt

För resten av huvudobjekten (kataloger, konstanter, dokument, register ...) är uppsättningen rättigheter för rollen ganska standard:

  • Läsning- läsning (programvara)
  • Lägger till- tillägg (programvara)
  • Ändringen- ändra (programvara)
  • Tar bort- radering (programvara)
  • Se- tittar
  • Interaktiv tillägg- interaktiv tillägg
  • Redigerar- redigering
  • Online flagga för radering- interaktivt märke för radering
  • Avmarkera borttagning interaktivt- avmarkering för radering
  • Interaktiv radering av markerade- radering av markerade objekt
  • Inmatning per rad- med linjeinmatningsläge
  • Avinstallera online- direkt radering (skift + del)

Rättigheter endast för dokument:

  • Interaktivt beteende- innehav
  • Annullering- annullering av handlingar
  • Interaktiv icke-operativ- genomföra (med standardkommandon för formulär) ett dokument i icke-operativt läge
  • Interaktiv avbokning- interaktiv avbokning
  • Interaktiv modifiering av genomförd- redigering av det publicerade dokumentet. Om rollen inte har någon rättighet kan användaren inte ta bort det publicerade dokumentet, markera borttagningen, posta om eller göra det oupplagt. Formen för ett sådant dokument öppnas i visningsläge

P.S. Om du fortfarande inte lyckades förstå användarnas roller kan du beställa.
Video med ett exempel på inställningsrättigheter i 1C bokföring 3.0:

Dela detta