Pristup se ne učitava za 1s. Izvorni kod funkcije za kreiranje datoteke baze podataka

Posebnosti:

  1. Datoteka baze podataka može se kreirati odvojeno od podataka.
  2. Tablica u datoteci baze podataka može se kreirati odvojeno od podataka.
  3. Tipovi podataka se konvertuju u kompatibilne sa pristupom.
  4. Vrijednosti jednake praznom datumu ili nizu se pretvaraju u null.
  5. Neprimitivni i nestring tipovi podataka (referenca) su skraćeni na 255 znakova.
  6. Tipovi podataka niza se prilagođavaju dužini stringa radi uštede prostora.
  7. Znak jednostrukog navodnika ' će biti upisan u bazu podataka pomoću funkcije upita char().
  8. Automatsko dodavanje primarnog indeksa (brojača redova).

Ograničenja:

  1. Radi samo s tablicom vrijednosti kao izvorom podataka.
  2. Mehanizam radi samo u načinu debelog klijenta. To je zbog upotrebe ADO biblioteke i tablice vrijednosti u isto vrijeme.
  3. Rad je moguć samo na Windows sistemima.

Sam mehanizam se sastoji od tri bloka:

  1. Funkcija za kreiranje datoteke baze podataka.
  2. Funkcija za kreiranje tabele baze podataka.
  3. Funkcija za pisanje podataka u tablicu baze podataka.

Šematski, mehanizam izgleda ovako:

Izvor Funkcije kreiranja DB datoteke:

//funkcija kreira novi fajl DB sa mogućnošću prepisivanja starog//Parametar //Parametar 2 : boolean - oznaka ponovnog pisanja ako datoteka baze podataka već postoji // vraća 0 ako je funkcija uspješno završena, a ne 0 ako funkcija nije uspjela Funkcija CreateFileAccess(ValueFileName,ValueOverwriteFile = True) //Provjeriti valjanost imena datoteke Ako je EmptyString(FileName) onda Return - 2 ; Inače //analiziramo gdje se datoteka nalazi na disku Ako OverwriteFile onda File = New File(FileName) ; Ako je File. Exists() Tada je datoteka = Nedefinirano; DeleteFiles(FileName) ; EndIf ; EndIf ; EndIf ; država(" Pristupni fajl je kreiran:" + Ime datoteke); //kreiramo ljusku baze podataka Pokušajte ADOX = Novi COMObject(" ADOX . Katalog" ); Izvještaj o izuzetku(" " + Simboli. PS + Opis greške() ) ; Kraj pokušaja ; //Povezivanje na novokreiranu bazu podataka ConnectionString = " Dobavljač " " " + Ime datoteke + " " " " ; //pokušaj povezivanja ADOH. Create(ConnectionString) ; Izvještaj o izuzetku (" Generiranje datoteke podataka nije uspjelo. Prilikom kreiranja ADOX objekta. Došlo je do greške u katalogu!" + Simboli. PS + DescriptionError() ); Povrat - 1 ; Kraj pokušaj ; ADOH. ActiveConnection. Close() ; ADOH = Nedefinirano ; Povratak 0 ; EndFunction

Funkcija prima 2 parametra:

  1. Ime datoteke buduće baze podataka je niz. Ovo je puna putanja do datoteke, ako nije proslijeđena, procedura će se prekinuti.
  2. Prepisati datoteku - boolean. Ovo je logička zastavica koja koristi mehanizam za prepisivanje datoteke.

Prvo se provjerava puno ime datoteke. Tada mehanizam za ponovno pisanje fajla radi. Ako je potrebno, postojeća datoteka se briše. Nakon toga postupak prelazi na kreiranje prazan fajl DB. Ovo se radi pomoću objekta ADOX.Catalog. Da biste razumjeli zamršenost načina na koji ADOX.Catalog radi, preporučujem da potražite relevantne informacije na Microsoft web stranici.

Drugi „zupčanik“ mehanizma za učitavanje u pristupu implementira kreiranje tabele u datoteci baze podataka. Za kreiranje tabela koristi se isti objekat ADOX.Catalog.

Izvorni kod za proceduru kreiranja nove tabele u bazi podataka:

//Parametar 1 : niz - puno ime fajl baze podataka//Parametar 2: Tabela vrijednosti - Tabela sa podacima za učitavanje//Parametar 3: struktura - opis tabele koja se kreira (može se generisati pomoću funkcije: Kreiranje strukture opisa polja) //Vraća 0 ako je funkcija uspješno završena, a ne 0 ako funkcija nije uspjela Funkcija EnterTableData(FileNameValue, DataTableValue, TableDescriptionValue)ConnectionString = " Dobavljač =Microsoft. Jet. OLEDB. 4 . 0 ; Izvor podataka=" " " + Ime datoteke + " " " ; Jet OLEDB:Tip motora= 5 ;" ; Konektor = Novi COMObject(" ADODB . Veza" ) ; Konektor. ConnectionString = Niz veze; //Konektor pokušaja povezivanja. Open() ; Izvještaj o izuzetku(" Otvaranje datoteke baze podataka nije uspjelo!" ) ; Izvještaj(ErrorDescription() ) ; Povratak - 1 ; Kraj pokušaja ; Status(" Tabelu popunjavam podacima:" + TableDescription.TableName); //DB naredbeni objekt Com = Novi COMObject(" ADODB . Zapovjedi" ) ;Com. ActiveConnection = Connector; //konstanta 1 znači "upit", tu su i pogledi i pohranjene procedure Com. CommandType = 1; Brojač redova = 1; Za svaku liniju TK iz tablice podataka Petlja ProcessingUserInterrupt() ; //prelazak kolona podataka FieldList = Format (Broj redova, " CH = " ) + " , " + Simboli. PS; Brojač redaka = Brojač redova + 1 ; Brojač kolone = 0 ; Za svaku kolonu TK iz tabele podataka. Kolone Cycle CurrentValue = Red TK [ Column TK. Name] ; Opis polja = Opis tabele. Opis polja. Get(Broj kolona) ; //analiza tipa podataka Ako DescriptionFields. Tip = " 3 " Zatim // cijeli broj TechValue = ? (TechValue = null , 0 , TechValue); FieldList = FieldList + Format (TechValue, " CHN = null ; CHG=" ) + " , 5 " Onda //broj je razlomak //pretvori null u 0 jer daljnja funkcija Format() to ne pretvara ispravno TechValue = ? (TechValue = null, 0, TechValue) ; Lista polja = Lista polja + Format (Trenutna vrijednost, " BRD = . ; CHN= null; CHG=" ) + " , " + Simboli. PS; Opis ElseIfField. Vrsta = " 7 "Onda //datum CurrentValue = ? (TechValue = null , " 00010101 " , TechValue) ; Ako TechValue = " 00010101 " Tada ModValue = " null" ; Else ModValue = " " " + Format(TechValue, " DLF = DT" ) + " " " ; EndIf ; FieldList = FieldList + ModValue + " , " + Simboli. PS; Opis ElseIfField. Vrsta = " 11 " Zatim //boolean TechValue = ? (TechValue = null , False , TechValue); FieldList = FieldList + Format (TechValue, " BL = false ; BI= istina" ) + " , " + Simboli. PS; Opis ElseIfField. Vrsta = " 202 " Zatim // string TechValue = ? (TechValue = null , " " , TechValue); ; StringValue = Lev(TechValue, 255 ) ; Ako je EmptyString(StringValue) Tada FieldList = FieldList + " null" + Simboli. PS; Inače ModValue = StrReplace(ValueString, " " " , " " +chr() + " " ); FieldList = FieldList + " " " + AbbrL(Lev(ModValue, 255 ) ) + " " , " + Simboli. PS EndIf; Opis ElseIfField. Tip = " 203 " Zatim //string Ako je EmptyString(ValueString) Onda FieldList = FieldList + " null" + Simboli. PS; Else ModValue = StrReplace(TrenutnaValue, " " " , " " +chr(" + SymbolCode(" " " ) + " ) + " " ); FieldList = FieldList + " " " + ModValue + " " , " + Simboli. PS EndIf; EndIf; Brojač kolone = Brojač kolone + 1; EndCycle; //odsjeci zadnji zarez FieldList = Lev(Lista polja, StLength(Lista polja) - 2 ) ; QueryText = "INSERT INTO" + TableDescription. Naziv tabele + " VRIJEDNOSTI ( " +Lista polja+ " ) " ; Com. CommandText = Tekst zahtjeva; Pokušaj Com. Execute () ; Izvještaj o izuzetku(" Greška u pisanju podataka!" + Simboli. PS + " Tekst zahtjeva: " + Tekst zahtjeva + Simboli. PS + Opis greške() ); Povratak - 2 ; EndAttempt ; EndCycle ; //zatvaranje veze Com. ActiveConnection. Close() ; Com = Nedefinirano ; Konektor = Nedefinisano; return 0 ; EndFunction

Funkcija prima 3 parametra:

  1. Struktura opisa tabele - struktura koja sadrži opis same tabele i njenih polja. Formira ga pomoćna funkcija, koju ću dati u nastavku.
  2. Ime datoteke - ime niza datoteke baze podataka.
  3. DeleteExistingTable - oznaka koja određuje ponašanje funkcije u odnosu na postojeće tablice istog imena.

Nakon što je dobila kontrolu, funkcija otvara datoteku baze podataka. Ako je konekcija uspješna, kreira se objekt “ADOX.Catalog” (katalog tablice) koji prvo provjerava postojanje tabele u skladu sa parametrom funkcije br. 3. Sljedeća akcija stvara novi sto. Ključno polje (indeks) se dodaje u tabelu. Zatim se na osnovu parametra funkcije br. 2 kreiraju polja tablice odgovarajućih tipova. Kada se završi, novokreirana tabela se dodaje u katalog i veza se zatvara.

Naravno, ručno prikupljanje parametra funkcije br. 2 je prilično naporno da bi bilo lakše, napisao sam funkciju koja na osnovu tabele vrednosti sa podacima formira strukturu opisa tabele.

Izvorni kod funkcije koja sačinjava strukturu opisa polja:

//pomoćna funkcija za formatiranje strukture opisa polja//Parametar 1: Tabela vrijednosti - Tabela sa podacima za učitavanje//Parametar 2: string - puni naziv tabele (ne smije sadržavati nedozvoljene znakove: " , .) //Vraća strukturu opisa tablice Funkcija ComposeFieldDescriptionStructure(DataTableValue, TableNameValue)DescriptionStructure = Nova struktura("TableName , DescriptionFields" ) ;DescriptionStructure.TableName =TableName;DescriptionStructure.FieldDescription = Novi niz; //prolazimo kroz kolone tablice vrijednosti Za svaku kolonu TK iz tabele podataka. Kolone Ciklus StructurePropertyFields = Nova struktura(" Ime , Vrsta, Dužina, Sinonim" ); ColumnValueType = ColumnTZ.ValueType;StringLength =ColumnValueType.StringQualifiers.Length; //provjera tipova sadržanih u stupcu //bilo koji kompozitni tipće biti niz IfColumnValueType. Tipovi() . Quantity() > 2 Zatim StructurePropertyField. Naziv = KolonaTZ. Ime; 202 " ; //adVarWChar, tip FieldPropertyStructure. Dužina = 255 ;FieldPropertyStructure. Sinonim = ColumnTK. Header; ElseIfColumnValueType. ContainsType(Type(" Linija" ) ) Zatim FieldPropertyStructure. Ime = TK Column. Ime; Ako je LineLength = 0 Tada FieldPropertyStructure. Tip = " 203 " ; //adLongVarWChar("memo"), tip 203 [Unicode tekstualni tok (DT_NTEXT)]202 " ; //adVarWChar, tip 202 [Unicode niz od 255 znakova (DT_WSTR)] //FieldPropertyStructure.Length = ?(LineLength 0 Tada // greška uređivača članaka prilikom umetanja koda, nisam mogao popraviti, pogledajte obradu StructurePropertyFields. Tip = " 5 " ; //adDouble, upišite 5 U suprotnom StructurePropertyFields. Tip = " 3 " ; //adInteger, tip 3 EndIf ; ElseIfColumnValueType. ContainsType(Type(" Boolean ") ) Zatim StructurePropertyField. Naziv = KolonaTZ. Ime; 11 StructurePropertyFields. Tip = " 11 " ; //adBoolean, tip 7 StructurePropertyFields. Dužina = Nedefinirano ; StructurePropertyFields. Sinonim = StupacTZ. Naslov; ElseIfColumnValueType. ContainsType(Type(" Datum ") ) Zatim StructurePropertyField. Naziv = KolonaTZ. Ime; 7 StructurePropertyFields. Tip = " 202 " ; //adVarWChar, tip 202 [Unicode niz od 255 znakova (DT_WSTR)]" ; //adDate, tip

Funkcija prima 2 parametra:

  1. StructurePropertyFields. Dužina = Nedefinirano ; StructurePropertyFields. Sinonim = StupacTZ. Naslov; U suprotnom StructurePropertyFields. Naziv = KolonaTZ. Ime;
  2. StructurePropertyFields. Tip = " StructurePropertyFields. Dužina = 255 ; StructurePropertyFields. Sinonim = KolonaTZ. Naslov; EndIf ; StructureDescription. DescriptionFields. Add(FieldPropertyStructure) ; EndCycle ; returnDescriptionStructure; EndFunction DataTable - tabela vrijednosti sa podacima. Iz ovog parametra, funkcija generiše opis tipova podataka budućih polja. Preporučujem kreiranje ove tablice vrijednosti putem upita, jer će u tom slučaju biti otkucana sva polja tehničkog zadatka.

TableName - ime niza

  1. budući sto
  2. Tip je string, to je Microsoftova konstanta. U našem slučaju koristimo samo: cijeli broj, razlomak, string (različitih dužina), Boolean i datum.
  3. Dužina - broj, za vrste stringova.
  4. Sinonim - niz, tekstualni opis polja.

Po završetku formiranja strukture, vraća se.

Konačno, možete prijeći na funkciju koja upisuje podatke u tablicu baze podataka. U ovoj funkciji, moglo bi se reći, koncentrirana je srž funkcionalnosti cijelog mehanizma. dakle, ovu funkciju je najteže, ali ovo ne bi trebalo da vas plaši. Programer je programer jer razvija analitički način razmišljanja.

Izvorni kod funkcije za unos podataka u tabelu:

//funkcija unosi podatke u tablicu //Parametar 1 : string - puno ime datoteke baze podataka //Parametar 2 : Tabela vrijednosti - Tabela sa podacima za učitavanje //Parametar 3 : struktura - opis tabele koja se kreira (može se generisati pomoću funkcije: Prevođenje StructureDescription of Fields) //Returns 0 u slučaju uspješnog završetka posla a ne 0 ako funkcija nije uspjela Funkcija Unošenje podataka u tabelu (Značenje Ime dokumenta , Značenje DataTable , Značenje Opis Tabele ) Connection string = " Provajder = Microsoft . Jet . OLEDB . 4 . 0 ; Izvor podataka = " " " + Ime dokumenta + " " " ; Jet OLEDB: Tip motora = 5 ; " ; //objekt odgovoran za komunikaciju sa bazom podataka Konektor = Novo COMObject (" ADODB . Veza" ) ; Konektor . ConnectionString = Connection string ; //veza Pokušaj Konektor . Otvori () ; Izuzetak Prijaviti (" Ne uspio otvoriti datoteku baze podataka!" ) ; Prijaviti ( DescriptionErrors () ) ; Povratak - 1 ; EndAttempt; Država (" Tabelu popunjavam podacima:" + Opis Tabele . TableName ) ; //DB naredbeni objekt Com = Novo COMObject (" ADODB . Zapovjedi" ) ; Com . ActiveConnection = Konektor ; //konstantno 1 znači "upit", tu su i pogledi i pohranjene procedure Com . CommandType = 1 ; Brojač redova = 1 ; Za Svaka linija TK Od DataTable Ciklus Rukovanje korisničkim prekidima () ; //prelazak kolona podataka Lista polja = Format ( Brojač redova , " CHG = " ) + " , " + Simboli . PS ; Brojač redova = Brojač redova + 1 ; Column Counter = 0 ; //ciklus za generiranje liste polja Za Svaka kolona TK Od DataTable . Kolone Ciklus TechValue = Linija TK [ ColumnTZ . Ime ] ; DescriptionFields = Opis Tabele . DescriptionFields . Get ( Column Counter ) ; //analiza tipa podataka Ako DescriptionFields . Tip = " 3 " Onda //integer Lista polja = Lista polja + Format ( TechValue , " CHN = null; CHG = " ) + " , " + Simboli . PS ; InačeAko DescriptionFields . Tip = " 5 " Onda //razlomak broj Lista polja = Lista polja + Format ( TechValue , " CHRD = . ; CHN = null; CHG = " ) + " , " + Simboli . PS ; InačeAko DescriptionFields . Tip = " 7 " Onda //datum Ako TechValue = "00010101 " Onda ModValue = " null" ; Inače ModValue = " " " + Format ( TechValue , " DLF = D.T." ) + " " " ; EndIf; Lista polja = Lista polja + ModValue + " , " + Simboli . PS ; InačeAko DescriptionFields . Tip = " 11 " Onda //boolean Lista polja = Lista polja + Format ( TechValue , " BL = false; BI = istinito" ) + " , " + Simboli . PS ; InačeAko DescriptionFields . Tip = " 202 " Onda //line ValueString = lav ( TechValue , 255 ) ; Ako Prazan red ( ValueString ) Onda Lista polja = Lista polja + " null, " + Simboli . PS ; Inače //Pojedinačni navodnik je poseban znak u sql-u //pretvori ovaj simbol kroz kod ModValue = PageReplace ( ValueString , " " " , " " + chr (" + Šifra simbola (" " " ) + " ) + " " ) ; Lista polja = Lista polja + " " " + AbbrLP ( lav ( ModValue , 255 ) ) + " ", " + Simboli . PS EndIf; InačeAko DescriptionFields . Tip = " 203 " Onda //line Ako Prazan red ( ValueString ) Onda Lista polja = Lista polja + " null, " + Simboli . PS ; Inače ModValue = PageReplace ( TechValue , " " " , " " + chr (" + Šifra simbola (" " " ) + " ) + " " ) ; Lista polja = Lista polja + " " " + ModValue + " ", " + Simboli . PS EndIf; EndIf; Column Counter = Column Counter + 1 ; Kraj ciklusa; //Za svaki stupac TK iz ciklusa kolona //odsjeci zadnji zarez Lista polja = lav ( Lista polja , Snaga ( Lista polja ) - 2 ) ; //konačno formiranje testa zahtjeva Tekst upita = " INSERT INTO" + Opis Tabele . TableName + " VRIJEDNOSTI (" + Lista polja + " ) " ; Com . CommandText = Tekst upita ; //upisivanje podataka u bazu podataka (izvršavanje upita) Pokušaj Com . Izvrši() ; Izuzetak Prijaviti (" Greška u pisanju podataka!" + Simboli . PS + " Tekst zahtjeva:" + Tekst upita + Simboli . PS + DescriptionErrors () ) ; Povratak - 2 ; EndAttempt; Kraj ciklusa; //Za svaki LineTK iz ciklusa podataka //zatvaranje veze Com . ActiveConnection . Zatvori () ; Com = Nedefinisano; Konektor = Nedefinisano; Povratak 0 ; EndFunction

Funkcija prima 3 parametra:

  1. FileName - naziv niza datoteke baze podataka.
  2. DataTable - tablica vrijednosti koja sadrži podatke.
  3. Opis tabele - struktura koja opisuje polja i naziv tabele.

Za rad sa bazom podataka kreira se veza koja nam je već poznata. Nakon povezivanja, kreiramo objekat odgovoran za izvršavanje sql instrukcija. Zatim organiziramo petlju kroz redove tablice vrijednosti (parametar funkcije br. 2) i ugniježđenu petlju kroz stupce tablice. Brojač redova će se koristiti za indeksiranje redova. Brojač stupaca će se koristiti za traženje opisa polja u strukturi opisa tablice (parametar br. 3). Prolazeći kroz kolone sljedećeg reda analiziramo njihove tipove (prema opisu tablice) i izvodimo odgovarajuće transformacije. Kao rezultat, imamo gotovu sql komandu za pisanje reda u bazu podataka. Primjenjujemo primljenu sql instrukciju koristeći ADODB.Command objekt. Na kraju procesa zatvorite veze i obrišite memoriju.

Nažalost, na ovoj stranici nisam mogao priložiti obradu za debelog klijenta, koji može učitati bilo koji direktorij u pristupnu bazu podataka. Ali možete ga preuzeti na Yandex disku: http://yadi.sk/d/UzK_PAsJ3vjTS. Ova obrada uključuje sve dijelove univerzalnog mehanizma za istovar. Naravno, ovaj mehanizam nije ograničen na ovu obradu. Može se bezbedno kopirati kao u odvojeni modul, iu vašoj obradi. Ne isključujem pogrešne situacije koje bi mogle dovesti do neuspjeha učitavanja, ali ovo nije komercijalni projekat. Možete slobodno mijenjati ovaj mehanizam da odgovara vašim potrebama. Ispod su 2 dodatka koji opisuju adoks konstante. Nadam se da će vam ovaj mehanizam biti od koristi. Želim vam uspjeh u profesionalnoj karijeri!

Dodatak 1 lista dodatnih svojstava polja pristupne tabele:

AutoIncrement

Postavlja tip polja na "Counter" sa vrijednošću koja se automatski povećava kada se doda zapis.

Default

Zadana vrijednost polja.

Opis

Opis polja.

Fiksna dužina

Određuje da li će polje biti fiksne dužine ili promenljive.

Povećanje

Vrijednost za koju će polje tipa brojača biti povećano.

Nullable

Određuje da li polje ne može sadržavati nikakvu vrijednost, drugim riječima, treba li polje biti obavezno.

Seme

Vrijednost od koje će početi brojanje u prvom zapisu za polje tipa "counter".

Jet OLEDB: Dozvoli nultu dužinu

Određuje mogu li tekstualna polja sadržavati nizove nulte dužine. Ignorirano zbog polja bez znakova.

Jet OLEDB:AutoGenerate

Određuje hoće li se nova GUID vrijednost automatski generirati za polja tipa adGUID.

Jet OLEDB: Pravilo validacije kolone

Izraz koji određuje ispravnost vrijednosti zapisane u polju mora biti napisan u SQL WHERE formatu, ali bez njega ključna riječ GDJE.

Jet OLEDB: Tekst za potvrdu kolone

Tekst koji će se prikazati ako vrijednost unesena u polje ne odgovara pravilu definiranom za ovo polje (Pravilo).

Jet OLEDB: Kompresovani UNICODE nizovi

Određuje hoće li Microsoft Jet komprimirati UNICODE nizove prilikom pisanja na disk. Zanemaruje se ako baza podataka nije unutra Microsoft format Jet verzija 4.0.

Jet OLEDB: Hiperveza

Određuje da su podaci u polju hiperveza. Zanemareno za polja s tipom koji nije adLongVarWChar.

Jet OLEDB:IISAM nije posljednja kolona

Za ISAM-ove koji se mogu instalirati, ovo svojstvo obavještava I-ISAM da postoji još stupaca koji će biti dodati u tablicu nakon ove. Ako koristite ITableDefinition::AddColumn ili ITableDefinition::CreateTable, potrebno je da postavite ovo svojstvo za svaki.

Jet OLEDB: Jedan BLOB po stranici

Određuje da li se podaci trebaju pohraniti na odvojenim stranicama (True) ili mogu koristiti dijeljene stranice baze podataka za uštedu prostora na disku. Radi samo s poljima tipa adLongVarBinary.

Dodatak 2 lista tipova vrijednosti koji se koriste u ADOX-u

adDouble, tip 5 - razlomak

adDate, tip 7 - datum/vrijeme

adCurrency, tip 6 - cijeli broj

adInteger, tip 3 - cijeli broj bez predznaka

adBoolean, tip 11 - boolean

adVarWChar, tip 202 - unikod niz dužine 255 znakova

adLongVarWChar("memo"), tip 203 - unicode niz neograničen niz

Nedavno mi je bilo potrebno da preuzmem sve podatke iz jedne jednostavne Access baze podataka u konfiguraciju koja je sama pisana (1C:Enterprise. Nije bilo puno informacija za prijenos i, u principu, bilo je moguće prenijeti ovaj fascinantan proces na korisnika, ali Odlučio sam pomoći svojim već zauzetim zaposlenima.

Pomoć se sastojala u potpunoj automatizaciji ovog procesa. Morao sam napisati jednostavnu obradu koja je sve obavila za nekoliko sekundi. Prije ovog zadatka nisam morao raditi s kombinacijom 1C + Access, pa sam prije nego što sam zgrabio tastaturu i počeo da udaram po kodu, odlučio da pročitam priručnike.

Znao sam od samog početka da će svaka interakcija uključivati ​​korištenje odgovarajućih provajdera, ali sam ipak odlučio proučiti primjere.

Dugo sam razmišljao na koji način da napišem ovu belešku. Na kraju sam se odlučio na najjednostavniju opciju - dajte kod za moje rješenje. Čak i ako nije baš optimalan, više je nego dovoljan za većinu zadataka.

Dakle, hajde da pogledamo sve po redu. Kreiramo novu obradu i bacamo jednu komponentu na nju - “TableField”. Ovu komponentu sam proširio po cijeloj formi. Kao rezultat, moj obrazac je izgledao kao na slici 1.


Slika 1. Obrazac za obradu

U ovom trenutku možemo pretpostaviti da je dizajn obrasca spreman. Nećemo kreirati kolone ručno, već ćemo ovu proceduru izvoditi dinamički. Srećom, nije teško. Kreirajte obrađivač događaja "On Click" za dugme "Pokreni" i u njega upišite sljedeći kod:

//Obriši polje naše tabele TableField1.Clear(); TableField1.Columns.Clear(); //Priprema niza veze za MS Access //Putanja do baze podataka je naznačena na samom kraju Connection string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"C:\mydb.mdb"; ConnectionWithBase = Novi COMObject("ADODB.Connection"); //Povezivanje ConnectionWithBase.Open(ConnectionString); //Nabavite skup zapisa iz tabele demo_table Zbirka zapisa = New COMObject("ADODB.Recordset"); RecordsCollection.Open("odaberi * iz demo_table", DatabaseConnection, 1); //pročitaj strukturu polja tabele //U tabeli vrednosti kreiraj sve kolone koje se nalaze u Access tabeli Za count = 0 po Records Collection.Fields.Count - 1 Ciklus TableField1.Columns.Add("Column" + count, Row(Records Collection .Fields.Item (count).Name) Za count = 0 by Records Collection.Fields.Count - 1 Cycle NewRow["Column" + count] = Records Collection.fields); (TableField1.Columns[count].Value; EndCycle.MoveNext(); Kraj ciklusa; //Prikaži podatke iz specifikacije u TableFieldFormElements.TableField1.Value = TableFormElements.TableField1.CreateColumns();

Pokazalo se da kod nije prevelik, ali prilično koristan. Nisam napravio nikakve veze za određenu strukturu. Kod odlično funkcionira na velikom broju tablica. Nemam više šta da dodam, pa ću se pozdraviti

Ukratko - nikako. U svemu što se tiče interakcije sa državnim organima (bilo da se radi o porezu, finansijski izvještaji, svakakve akcize itd.), 1C se ne može ničim zamijeniti i pokušavati to učiniti je u najmanju ruku nekonstruktivno.

Ali nemojte prestati čitati ovaj članak, ovo još nije glavna ideja. Glavna stvar je ne upasti u logičku zamku i smatrati 1C potpuno nezamjenjivim u bilo kojem dijelu automatizacije svih procesa u poduzeću. Ovdje se ima o čemu raspravljati i šta ponuditi. Želim da pričam o jednom uspešnom iskustvu u automatizaciji različitih aspekata poslovanja računarske kompanije i, naravno, o povezivanju ovog rešenja sa 1C. Rad je nastao iz potrebe povezivanja samorazvijenog sistema sa 1C programom, ali ovaj pristup (podela na 2 programska bloka) može se razviti u punopravnu filozofiju za izgradnju informacionog sistema uopšte.

U početku je zadatak bio sljedeći. Bilo je korporativni sistem automatizacija upisana Microsoft Access. Tokom dugogodišnjeg razvoja, apsorbovao je gotovo sve svakodnevne poslove - održavanje banke, izdavanje računa, priprema knjigovodstvene dokumentacije za otpremu, održavanje skladišta, računovodstvo komponenti serijski brojevi, kompilacija tehnološke karte za proizvodnju itd. Nedavno su u mogućnosti sistema dodani sljedeći dodaci: kreiranje bankovnih plaćanja direktno na osnovu ulaznih faktura, automatska generacija cjenovnici u različitim formatima za objavljivanje na web resursima, ažuriranje web stranice kompanije i pripremu Ugovora na osnovu postojećih šablona (tzv. office automatizacija). Plus prisustvo velike količine analitike i vođenje cjelokupnog upravljačkog računovodstva. Sve je to učinilo sistem potpuno nezamjenjivim - prijenos svih ovih funkcionalnosti na 1C bi oduzeo mnogo vremena i novca.

S druge strane, program 1C-Enterprise je služio samo za potrebe računovodstva za vođenje računovodstvenih i računovodstvenih evidencija i podnošenje izvještaja. Time je 1C „odvezan“ od svakodnevnog funkcionisanja kompanije, a kompletirani dokumenti su naknadno uneseni u bazu podataka.

Šta je dobro u ovoj šemi? Postoji nekoliko prednosti:
- isključenje rukovodilaca i drugih (ne)odgovornih lica iz „svetinje nad svetinjama“ – računovodstvene baze podataka, koju treba da formiraju samo zaposleni koji se razumeju u materiju; precizno održavanje imenika,
- uklanjanje iz 1C svega što nije povezano s njim: od zadataka upravljanja koji ne zahtijevaju odraz u računovodstvu, do svih drugih tačaka koje su specifične za kompaniju i kojima autsajderi ne bi trebali imati pristup,
- uštede na licencama: 1C radne stanice koštaju značajan novac,
- važna tačka: pri implementaciji svih gore opisanih dodatnih funkcionalnosti direktno "unutar" 1C, postoji stalna potreba za njegovim poboljšanjem kada se objave ažuriranja proizvoda. To, naravno, jamči gotovo stalno zapošljavanje 1C programera, ali ovo je mjesto gdje možete značajno uštedjeti.

Pa, veliki minus, naravno, je potreba da se dvaput provjere svi dokumenti i ažuriraju direktoriji.

Zapravo, ovo je bio glavni zadatak - pobjeći od dvostrukog posla.

Prvo se morate pozabaviti svim vrstama imenika - prije svega, ovo je imenik izvođača i stavki. Problem sinhronizacije imenika, koji se tako često javlja u programima ove vrste, dovoljno je razrađen i razumljiv u implementaciji. Međutim, u ovom slučaju, donesena je čvrsta odluka da se ne koriste 2 direktorija sa međusobnom sinhronizacijom, već da se ima jedna početna verzija - ona unesena u MS Access, i jednostavno je replicirati u 1C ( Povratne informacije- ovo je samo oznaka u MS Accessu da je ova pozicija već rasterećena).
Ovaj pristup uvelike pojednostavljuje zadatak. Za čisto računovodstvene potrebe, potrebno vam je vrlo malo pozicija u takvim imenicima - i one su također uključene eksterni program kako se ne bi narušio formulisani princip. Na ovaj način možete ukloniti još jednu zajednički problem- ogromna naduvanost referentne knjige korištene nomenklature. Ispod je grupa proizvoda "Monitori"

Učitavanje takvog horora u 1C direktorij (a novi modeli monitora se pojavljuju gotovo svake sedmice) može se konfigurirati na takav način da svi padaju u jednu poziciju, budući da su nijanse boje okvira oko ekrana i broja piksela potpuno beznačajno za računovodstvo! I, da budem iskren, veličina dijagonale je još veća ako se razlikuje za pola inča.

Nadalje, u vanjskom programu možete raditi spajanje duplih pozicija u imenicima, posebno u imeniku kontrastranaka, s mnogo manje gubitaka, jer u 1C to zahtijeva mnogo truda.

Dakle, samo "pročišćeni", očišćeni i dovedeni u odgovarajuću formu podaci se učitavaju u 1C. Istovar se može obaviti sa određenom frekvencijom - porcioniranje vam omogućava da otklonite greške u radu računovodstvenog odjela i izbjegnete nepotreban rad ako je u toku dana (ili dužeg perioda) nešto otkazano, promijenjeno, izvršeno ponovo - sve se to dešava u radu MS Access baza podataka, i samo „utvrđeno“ „Stanje se javlja u 1C. Osim toga, ova vrsta istovara može se sinkronizirati s operacijama sigurnosne kopije i uvijek možete biti sigurni da je trenutno stanje 1C baze podataka ispravno.

Jasno je da dokumenti stižu bez automatskog knjiženja (iako se to može konfigurirati). Inače, sama MS Access baza podataka proverava dostupnost potrebne robe u magacinu - za otpis za otpremu (dilema je da se uveri da se račun može izdati trenutni datum da se svi artikli potrebni za otpis nalaze u skladištu - odnosno kupljeni ili proizvedeni - potrebno je... da objavite dokument u 1C. Očigledno, ovo ne biste trebali vjerovati menadžerima - ili bi zaposlenik računovodstva uvijek trebao stajati iza menadžera)

Sada o implementaciji. 1C programi podržavaju sučelje za razmjenu podataka putem ADO mehanizma. Na strani 1C koristi se standardni softverski interfejs za kreiranje elemenata direktorija i dokumenata, tako da rad ovog mehanizma ne ovisi o internim detaljima implementacije 1C, koji se mogu mijenjati od verzije do verzije i od ažuriranja do ažuriranja. S druge strane, glavni razvojni slogan bio je „maksimalno iskoristiti mogućnosti 1C gdje je to moguće“. Stoga su u konačnoj implementaciji paketa samo ime i TIN druge strane učitani iz MS Accessa - podaci su „izvučeni“ iz Jedinstvenog državnog registra pravnih lica i fizičkih preduzetnika pomoću mehanizma ugrađenog u 1C ( isto važi i za bankovni detalji– ažuriraju se pomoću BIC-a).

U eksternoj bazi podataka MS Access kreirani su upiti koji pripremaju sve potrebne podatke za učitavanje u 1C - uzmite ih i rasporedite u dokumente i polja.

Shema istovara sastoji se od dvije faze. Prvo se učitavaju nove pozicije u imenicima ugovornih strana i stavki. GUID-ovi dodijeljeni 1C vraćaju se u MS Access tako da se prilikom učitavanja svih dokumenata u drugoj fazi mogu postaviti ispravne reference na direktorije. To izgleda ovako

Smatramo da je takva ideologija izgradnje informacioni sistemi može se uzeti kao osnova ne samo u onim kompanijama u kojima postoje naslijeđeni ne-1C sistemi, već i pri organizaciji rada novih pravna lica, pošto imamo dosta iskustva sa MS Access-om. Prednosti ovog pristupa su opisane gore.

U ovom članku ćemo govoriti o postavljanju korisničkih prava pristupa objektima 1C sistema.

U 1C 8, za kontrolu pristupa korisnika, koristi se poseban objekt metapodataka, koji se zove Uloge.

Bilješka! Ovaj članak je napisan da pomogne programerima. Postavljanje prava u korisničkom načinu rada na primjeru 1C računovodstva je razmatrano u.

Uloga definira skup prava koja korisnik ima. Mehanizam uloga je vrlo sličan mehanizmima Windows prava Aktivni direktorij. Za svaki od objekata (direktorije, dokumente), programer postavlja svoj skup prava - čitanje / pisanje / dodavanje / promjena / ...

Skup dostupnih prava - zbirka svih dozvola u korisničkim ulogama.

Ako otvorimo objekt metapodataka uloge, možemo vidjeti sljedeću sliku:

Objekt ima dvije kartice - Prava i Predlošci ograničenja. Prava - glavna kartica, Predlošci - kartica za postavljanje prava na nivou zapisa u 1C ( RLS). Ovo je vrlo važna tema, koju ću pokušati opisati u budućim člancima.

Razmotrićemo samo karticu Prava.

  • Objekti— lista za koja će se postaviti prava.
  • Prava— lista mogućih podešavanja prava za podešavanje.
  • Ograničavanje pristupa podacima— polja uloga za prilagođavanje

Obratite pažnju na potvrdne okvire na dnu:

  • Postavite dozvole za nove objekte— ako je zastavica postavljena za ulogu, dopuštena prava će se automatski postaviti na nove objekte metapodataka. Preporučujem da ga instalirate ako često zaboravite postaviti dozvole za nove objekte.
  • Postavite prava za detalje i tabelarni delovi default— zastavica, kada se postavi, detalji i tabelarni dijelovi će naslijediti prava vlasnika (imenik, dokument, itd.)
  • Samostalna prava podređenih objekata— ako je zastavica postavljena, tada će sistem uzeti u obzir prava na roditeljski objekt prilikom određivanja prava na konfiguracijski objekt

Postavke dozvola za cijelu konfiguraciju

Ako otvorimo Role i kliknemo na korijen konfiguracije, vidjet ćemo sljedeće postavke:

Više detalja o svakom prava na cijelu konfiguraciju:

Nabavite 267 video lekcija na 1C besplatno:

  • Administracija— administracija baza informacija(zahteva pravo “Administracije podataka”)
  • Administracija podataka— pravo na administrativne radnje nad podacima
  • Ažuriranje konfiguracije baze podataka- pravo na
  • Monopol mod— korištenje ekskluzivnog načina rada
  • Aktivni korisnici— pogledajte listu aktivnih korisnika
  • — dnevnik
  • - lansiraj desno tanki klijent
  • - pravo na pokretanje web klijenta
  • Debeli klijent— pravo na ulogu pokretanja debelog klijenta
  • Spoljašnji spoj— pravo na pokretanje eksterne veze
  • Automatizacija— pravo na korištenje automatizacije
  • Režim svih funkcija— u režimu upravljane aplikacije
  • Čuvanje korisničkih podataka— dozvola ili zabrana čuvanja korisničkih podataka (podešavanja, favoriti, istorija). Ovo posebno vrijedi za obrasce kojima se upravlja 1C.
  • Interaktivno otkriće eksterni tretmani — otvaranje eksterne obrade
  • Interaktivno otvaranje eksternih izvještaja— otvaranje eksternih izvještaja
  • Zaključak— štampanje, snimanje i kopiranje u međuspremnik

Postavljanje prava 1C 8.2 na druge objekte metapodataka

Za ostale glavne objekte (direktorije, konstante, dokumenti, registri...) skup prava za ulogu je sasvim standardan:

  • Čitanje- čitanje (softver)
  • Dodatak- dodavanje (softvera)
  • Promjena- promijeniti (softver)
  • Odstranjivanje- uklanjanje (softver)
  • Pogled— pogled
  • Interaktivni dodatak- interaktivni dodatak
  • Uređivanje— uređivanje
  • Interaktivna zastavica za brisanje— interaktivna oznaka za brisanje
  • Interaktivno ukloni oznaku brisanja— demarkiranje za brisanje
  • Interaktivno uklanjanje označenih— brisanje označenih objekata
  • Linijski ulaz— koristeći način unosa linije
  • Interaktivno uklanjanje— direktno brisanje (shift +del)

Prava samo za dokumenata:

  • Interaktivno dirigovanje— izvođenje
  • Otkazivanje— poništenje dokumenata
  • Interaktivno vođenje neoperativno— držanje (sa standardnim komandama obrasca) dokumenta u neoperativnom režimu
  • Interaktivno otkazivanje— interaktivno otkazivanje
  • Interaktivna promjena potrošenog— uređivanje objavljenog dokumenta. Ako pravo uloge nije postavljeno, korisnik ne može izbrisati objavljeni dokument, postaviti oznaku za brisanje, ponovo ga poslati ili učiniti neobjavljenim. Forma takvog dokumenta se otvara u režimu pregleda

P.S. Ako još uvijek ne možete shvatiti korisničke uloge, možete naručiti .
Video s primjerom postavljanja prava u 1C Accounting 3.0:

Dijeli