Достъпът не работи при зареждане за 1 сек. Изходен код на функцията за създаване на файл на база данни

Характеристика:

  1. Файлът на базата данни може да бъде създаден отделно от данните.
  2. Таблицата във файла на базата данни може да бъде създадена отделно от данните.
  3. Типовете данни се преобразуват, за да бъдат съвместими с достъпа.
  4. Стойности, равни на празен низ от дата, се преобразуват в нула.
  5. Непримитивните и ненизовите типове данни (справка) се съкращават до 255 знака.
  6. Низовите типове данни се адаптират към дължината на низа, за да спестят място.
  7. Символът с единична кавичка 'ще бъде записан в базата данни с помощта на функцията за заявка char ().
  8. Автоматично добавяне на първичен индекс (брой редове).

Ограничения:

  1. Работи само с таблица със стойности като източник на данни.
  2. Механизмът работи само в дебел клиентски режим. Това се дължи на използването на библиотеката ADO и таблицата със стойности едновременно.
  3. Работата е възможна само на Windows системи.

Самият механизъм се състои от три блока:

  1. Функция за създаване на файл с база данни.
  2. Функция за създаване на таблица на база данни.
  3. Функцията за запис на данни в таблицата на базата данни.

Схематично механизмът изглежда така:

Изходният код на функцията за създаване на файл на база данни:

// функцията създава нов файл DB с възможност за презаписване на старата // Параметър // Параметър 2: boolean - флаг за презапис, ако файлът на базата данни вече съществува // връща 0 при успешно завършване, а не 0, ако функцията се провали Функция CreateFileAxes (ValueName File, Value OverwriteFile \u003d True) // Проверете дали името на файла е валидно Ако EmptyString (FileName) След това се връща - 2; В противен случай // анализираме местоположението на файла на диска Ако OverwriteFile, тогава файл \u003d нов файл (име на файл); Ако файл. Съществува () Тогава Файл \u003d Неопределен; DeleteFiles (FileName); EndIf; EndIf; EndIf; Състояние (" Създава се файлът за достъп:"+ Име на файла); // създаване на черупка на база данни Опит ADOX \u003d Нов COMObject ("ADOX ... Каталог"); Доклад за изключение (" "+ Символи. Подстанция + ОписаниеErrors ()); EndTry; // Свързване към новосъздадената база данни ConnectionString \u003d "Доставчик" "" + Име на файла + "" ""; // свързване на опит за ADOH. Създаване (ConnectionString); Доклад за изключение (" Генерирането на файл с данни не бе успешно. При създаване на ADOX обект. Каталог възникна грешка!"+ Символи. PS + DescriptionErrors ()); Връщане - 1; Край на опита; ADOC. ActiveConnection. Затваряне (); ADOC \u003d Неопределено; Връщане 0; EndFunction

Функцията получава 2 параметъра:

  1. Името на бъдещия файл на базата данни е низ. Това е пълният път към файла, ако не бъде приет, процедурата ще излезе.
  2. Презапис на файл - булево. Това е булев флаг, който използва механизма за презаписване на файлове.

Първо се проверява пълното име на файла. След това се изработва механизмът на презаписване на файла. Ако е необходимо, съществуващият файл се изтрива. След това процедурата продължава да създава празен файл DB. Това се прави с помощта на обекта ADOX.Catalog. За да анализирате тънкостите на работата на ADOX.Catalog, препоръчвам да потърсите съответната информация на уебсайта на Microsoft.

Втората „предавка“ на механизма за разтоварване в достъпа реализира създаването на таблица във файл на база данни. За създаване на таблици се използва същият обект ADOX.Catalog.

Изходен код на процедурата за създаване на нова таблица в базата данни:

// Параметър 1: низ - пълно име файл на базата данни // Параметър 2: Таблица на стойностите - Таблица с данни за изтегляне // Параметър 3: структура - описание на създаваната таблица (можете да я формирате с помощта на функцията: CompositeStructureDescriptionFields) // Връща 0 при успешно завършване, а не 0, ако функцията е неуспешна Функция EnterDataTable (ValueName File, ValueDataTable, ValueDescriptionTable) ConnectionString \u003d "Доставчик \u003d Microsoft. Jet. OLEDB. 4. 0; Източник на данни \u003d"" "+ Име на файла +" "" ; Jet OLEDB: Тип двигател \u003d 5;"; Connector \u003d Нов COMObject (" ADODB ... Връзка"); Connector. ConnectionString \u003d ConnectionString; // Съединител за опит за свързване. Open (); Отчет за изключение (" Неуспешно отваряне на DB файл!"); Доклад (Описание на грешка ()); Връщане - 1; Краен опит; Състояние (" Попълвам таблицата с данни:"+ DescriptionTable .NameTable); // DB команден обект Com \u003d Нов COMObject ("ADODB ... Команда"); Com. ActiveConnection \u003d Съединител; // константа 1 означава "заявка", има също изгледи и съхранени процедури Com. CommandType \u003d 1; LineCount \u003d 1; За всеки ред TZ от таблицата с данни Цикъл UserUser InterruptProcessing (); // цикъл през колоните с данни FieldList \u003d Формат (LineCounter, "CH = " ) + " , "+ Символи. PS; LineCounter \u003d LineCount + 1; ColumnCount \u003d 0; За всяка колонаTZ от таблицата с данни. Цикъл на колони TekValue \u003d StringTZ [ColumnTZ. Име]; Описание на полето \u003d Описание на таблицата. Описание на полето. Вземете (ColumnCounter); // анализираме типа данни Ако поле Описание. Тип \u003d " 3 "Тогава // цяло число TekValue \u003d? (TekValue \u003d , 0, TekValue); FieldList \u003d FieldList + Format (TekValue," CHN \u003d нула; ChG \u003d" ) + " , 5 "Тогава // числото е дробно // преобразуване на null в 0, тъй като по-нататъшната функция Format () не го преобразува правилно TekValue \u003d? (TekValue \u003d , 0, TekValue); FieldList \u003d FieldList + Формат (TekValue, "RHD \u003d. ; CHN \u003d нула; ChG \u003d" ) + " , "+ Символи. PS; Описание на полето ElseIf. Тип \u003d" 7 "Тогава // дата TekValue \u003d? (TekValue \u003d ," 00010101 " , TekValue); Ако TekValue \u003d " 00010101 " Тогава ModValue \u003d " нула"; В противен случай ModValue \u003d" "" + Формат (TekValue, "DLF \u003d DT") +" ""; EndIf; FieldList \u003d FieldList + ModValue + " , "+ Символи. PS; Описание на полето ElseIf. Тип \u003d" 11 "Тогава // логически TekValue \u003d? (TekValue \u003d , False, TekValue); FieldList \u003d FieldList + Format (TekValue," BL \u003d невярно; BI \u003d вярно" ) + " , "+ Символи. PS; Описание на полето ElseIf. Тип \u003d" 202 "Тогава // низ TekValue \u003d? (TekValue \u003d ," ", TekValue); ValueString \u003d Leo (TekValue, 255); Ако EmptyString (ValueString) Тогава FieldList \u003d FieldList +" нула,"+ Символи. PS; В противен случай ModValue \u003d StrReplace (ValueString," "", "" + chr () + " "); ListFields \u003d ListFields +" "" + Съкращение (Leo (ModValue, 255)) + "" , "+ Символи. PS EndIf; ElseIf FieldDescription. Type \u003d" 203 "Тогава // низ Ако EmptyString (ValueString) Тогава FieldList \u003d FieldList +" нула,"+ Символи. PS; В противен случай ModValue \u003d StrReplace (TekValue," "", "" + chr ("+ CharacterCode (" "") + " ) + " "); ListFields \u003d ListFields +" "" + ModValue + "" , "+ Символи. PS EndIf; EndIf; ColumnCounter \u003d ColumnCount + 1; EndCycle; // отрязвам последната запетая FieldList \u003d Leo (FieldList, StrLength (FieldList) - 2); QueryText \u003d "INSERT INTO" + TableDescription. TableName + "СТОЙНОСТИ ( "+ FieldList +" ) "; Command. CommandText \u003d Текст на заявката; Опит. Команда. Изпълнение (); Отчет за изключение (" Грешка при запис на данни!"+ Символи. ПС +" Текст на заявката: "+ Текст на заявката + Символи. ПС + Описание на грешката ()); Връщане - 2; EndTry; EndCycle; // затваряне на връзката Com. ActiveConnection. Близо (); Бучка \u003d Неопределено; Конектор \u003d Неопределен; Връщане 0; EndFunction

Функцията получава 3 параметъра:

  1. StructureDescriptionTables - структура, съдържаща описание на самата таблица и нейните полета. Образувано от помощна функция, която ще предоставя по-долу.
  2. FileName - име на низа на файла на базата данни.
  3. DeleteExistingTable е отметка, която определя поведението на функцията по отношение на съществуващите таблици със същото име.

След като получи контрол, функцията отваря файла на базата данни. Ако връзката е успешна, се създава обектът "ADOX.Catalog" (каталог на таблица), който преди всичко проверява съществуването на таблицата в съответствие с параметъра на функция # 3. Следващото действие създава нова таблица... Към таблицата се добавя ключово поле (индекс). Освен това, въз основа на параметъра на функция # 2, се създават полетата на таблицата на съответните типове. След завършване новосъздадената таблица се каталогизира и връзката се затваря.

Разбира се, ръчното събиране на параметъра на функция # 2 отнема доста време, за улеснение на използването написах функция, която въз основа на таблицата със стойности с данни формира структурата на описанието на таблицата.

Изходният код на функцията, съставяща структурата на описанието на полето:

// помощна функция за разделяне на структурата на описанието на полето // Параметър 1: Таблица на стойностите - Таблица с данни за разтоварване // Параметър 2: низ - пълно име на таблица (не трябва да съдържа незаконни символи: ",.) // Връща структурата на описанието на таблицата Функция ComposeFieldDescriptionStructure (ValDataTable, ValueTableName) DescriptionStructure \u003d Нова структура ("TableName , Описание Полета"); StructureDescription. TableName \u003d Име на таблица; StructureDescription .FieldsDescription \u003d Нов масив; // преминете през колоните на таблицата със стойности За всяка колона TZ от таблица с данни. Цикли на колони StructureFieldProperty \u003d Нова структура ("Име , Тип, дължина, синоним"); ColumnValueType \u003d TKColumn .ValueType; StringLength \u003d ColumnValueType. Квалификатори на низове. Дължина; // проверка на типовете, съдържащи се в колоната // всеки композитен тип ще бъде низ Ако ValueType е Column. Видове (). Count ()\u003e 2 Тогава FieldPropertyStructure. Име \u003d Колона TK. Име; StructureFieldProperty. Тип \u003d " 202 "; // adVarWChar, тип FieldPropertyStructure. Дължина \u003d 255; FieldPropertyStructure. Синоним \u003d TK колона. Заглавка; В противен случай Ако ColumnValueType. ContainsType (Тип (" Линия")) Тогава FieldPropertyStructure. Name \u003d TK Column. Name; IfStringLength \u003d 0 Тогава FieldPropertyStructure. Type \u003d" 203 " ; // adLongVarWChar ("бележка"), тип 203 [Unicode текстов поток (DT_NTEXT)]202 "; // adVarWChar, тип 202 [255 символни Unicode низ (DT_WSTR)] //StructureFieldProperty.Length \u003d? (StringLength 0 Тогава // грешка в редактора на статии при поставяне на кода, не можа да го поправи, вижте обработката StructureFieldProperty. Тип \u003d " 5 "; // adDouble, тип 5 В противен случай FieldPropertyStructure. Тип \u003d " 3 "; // adInteger, тип 3 EndIf; ElseIfColumnValueType. ContainsType (Type ("Boolean")) ThenStructureFieldProperty. Име \u003d Колона TK. Име; StructurePropertyField. Тип \u003d " 11 "; // adBoolean, тип 11 StructurePropertyField. Дължина \u003d Неопределено; StructureFieldProperty. Синоним \u003d колона TK. Заглавие; ElseIfColumnValueType. ContainsType (Тип ("Дата")) Тогава FieldPropertyStructure. Име \u003d Колона TK. Име; StructureFieldProperty. Тип \u003d " 7 "; // adDate, тип 7 StructureFieldProperty. Дължина \u003d Неопределено; StructureFieldProperty. Синоним \u003d колона TK. Заглавие; В противен случай FieldPropertyStructure. Име \u003d Колона TK. Име; StructurePropertyField. Тип \u003d " 202 "; // adVarWChar, тип 202 [255 символни Unicode низ (DT_WSTR)] StructureFieldProperty. Дължина \u003d 255; StructureFieldProperty. Синоним \u003d колона TK. Заглавие; EndIf; Описание на структурата. Описание на полетата. Добавяне (FieldPropertyStructure); Край на цикъла; Описание на структурата на връщане; EndFunction

Функцията получава 2 параметъра:

  1. DataTable е таблица със стойности с данни. От този параметър функцията формира описание на типовете данни за бъдещи полета. Препоръчвам да създадете тази таблица със стойности чрез заявка, тъй като в този случай всички TK полета ще бъдат въведени.
  2. TableName - име на низ бъдеща маса достъп.

Първоначално се създава структура с описание на самата база данни, след което се добавя масив, който ще съдържа други структури с описание на полетата. По време на цикъла през колоните на таблицата със стойности се попълва масивът с описания на полета. Структурата на описанието на полето съдържа 4 основни свойства:

  1. Име - низът от името на бъдещото поле. Не трябва да съдържа интервали или несъвместими символи. Ако формирате таблица със стойности с заявка, тогава не би трябвало да има проблеми, но в случай на самостоятелно попълване на таблицата със стойности, отговорността е изцяло на вас.
  2. Типът е низ, това е константа на Microsoft. В нашия случай се използват само: цяло число, дробно число, низ (с различна дължина), булева стойност и дата.
  3. Дължината е число за типовете низове.
  4. Синоним - низ, текстово описание на полето.

След като завърши формирането на структурата, тя се връща.

И накрая, можете да отидете на функцията, която записва данни в таблицата на базата данни. В тази функция, може да се каже, се концентрира ядрото на функционалността на целия механизъм. По този начин, тази функция е най-трудното, но това не бива да ви плаши. Програмистът е програмист, защото развива аналитичен начин на мислене.

Изходният код на функцията, въвеждаща данни в таблицата:

// функцията вмъква данни в таблицата // Параметър 1 : string - пълно име на файла на базата данни // Параметър 2 : Таблица със стойности - Таблица с данни за разтоварване // Параметър 3 : структура - описание на създаваната таблица (можете да я създадете с помощта на функцията: CompositeStructureDescriptionFields) // Се завръща 0 в случай на успешно завършване на работата и не 0 ако функцията не успее Функция Таблица за въвеждане на данни (Значение Име на файл , Значение Таблица с данни , Значение Таблици с описание ) StringConnection = " Доставчик = Microsoft . Jet . OLEDB . 4 . 0 ; Източник на данни = " " " + Име на файл + " " " ; Jet OLEDB: Тип двигател = 5 ; " ; // обект, отговорен за комуникацията с базата данни Съединител = Ново COM обект (" ADODB . Връзка" ) ; Съединител . ConnectionString = StringConnection ; // свързване Опит Съединител . Отворете () ; Изключение Докладвам (" Не успя да отвори файла на базата данни!" ) ; Докладвам (Описание Грешки () ) ; Връщане - 1 ; Край на опитите; състояние (" Попълвам таблицата с данни:" + Таблици с описание . Име на таблицата ) ; // DB команден обект Бучка = Ново COM обект (" ADODB . Команда" ) ; Бучка . ActiveConnection = Съединител ; // постоянен 1 означава "заявка", има и изгледи и съхранени процедури Бучка . CommandType = 1 ; CounterSringings = 1 ; За Всеки ред TK На Таблица с данни Цикъл Обработка на потребителски прекъсвания () ; // цикъл през колоните с данни ListFields = Формат (CounterSringings , " ChG = " ) + " , " + Символи . PS ; CounterSringings = CounterSringings + 1 ; Брояч на колони = 0 ; // цикъл за формиране на списъка с полета За Всяка колона На Таблица с данни . Високоговорители Цикъл TekValue = String TK [ Колона TZ . Име ] ; Описание Полета = Таблици с описание . Описание Полета . Вземете (Брояч на колони ) ; // анализираме типа данни Ако Описание Полета . Тип = " 3 " Тогава // цяло число ListFields = ListFields + Формат (TekValue , " CHN = нула; ChG = " ) + " , " + Символи . PS ; В противен случай, ако Описание Полета . Тип = " 5 " Тогава // дробно число ListFields = ListFields + Формат (TekValue , " CRD = . ; CHN = нула; ChG = " ) + " , " + Символи . PS ; В противен случай, ако Описание Полета . Тип = " 7 " Тогава //дата Ако TekValue = "00010101 " Тогава Мод Стойност = " нула" ; В противен случай Мод Стойност = " " " + Формат (TekValue , " DLF = DT" ) + " " " ; Край ако; ListFields = ListFields + Мод Стойност + " , " + Символи . PS ; В противен случай, ако Описание Полета . Тип = " 11 " Тогава // булево ListFields = ListFields + Формат (TekValue , " BL = невярно; BI = вярно" ) + " , " + Символи . PS ; В противен случай, ако Описание Полета . Тип = " 202 " Тогава // линия ValueString = лъв (TekValue , 255 ) ; Ако Празен ред (ValueString ) Тогава ListFields = ListFields + " нула, " + Символи . PS ; В противен случай // Единичната кавичка е специален символ в sql // трансформираме този символ чрез код Мод Стойност = PageReplace (ValueString , " " " , " " + chr (" + Код на символа (" " " ) + " ) + " " ) ; ListFields = ListFields + " " " + SokrLP (лъв (Мод Стойност , 255 ) ) + " ", " + Символи . PS Край ако; В противен случай, ако Описание Полета . Тип = " 203 " Тогава // линия Ако Празен ред (ValueString ) Тогава ListFields = ListFields + " нула, " + Символи . PS ; В противен случай Мод Стойност = PageReplace (TekValue , " " " , " " + chr (" + Код на символа (" " " ) + " ) + " " ) ; ListFields = ListFields + " " " + Мод Стойност + " ", " + Символи . PS Край ако; Край ако; Брояч на колони = Брояч на колони + 1 ; Край на цикъла; // За всяка колона TZ от таблица с данни. Цикъл на колони // отрязвам последната запетая ListFields = лъв (ListFields , Дължина на Str (ListFields ) - 2 ) ; // окончателно формиране на теста на заявката Текст на заявката = " ПОСТАВЕТЕ В" + Таблици с описание . Таблица с имена + " СТОЙНОСТИ (" + ListFields + " ) " ; Бучка . CommandText = Текст на заявката ; // запис на данни в базата данни (изпълнение на заявка) Опит Бучка . Изпълни() ; Изключение Докладвам (" Грешка при запис на данни!" + Символи . PS + " Текст на заявката:" + Текст на заявката + Символи . PS + Описание Грешки () ) ; Връщане - 2 ; Край на опитите; Край на цикъла; // За всеки низ от TZ от контур за данни // затваряне на връзката Бучка . ActiveConnection . Близо () ; Бучка = Неопределено; Съединител = Неопределено; Връщане 0 ; EndFunction

Функцията получава 3 параметъра:

  1. FileName - низът е името на файла на базата данни.
  2. DataTable - Таблица със стойности, съдържащи данни.
  3. DescriptionTables е структура, която описва полетата на таблицата и името.

За работа с базата данни се създава вече позната ни връзка. След като се свържем, ние създаваме обект, отговорен за изпълнението на SQL инструкции. След това организираме цикъл през редовете на таблицата със стойности (параметър на функцията # 2) и вложен цикъл през колоните на таблицата. Броят на редовете ще се използва за индексиране на редовете. Броячът на колони ще се използва за търсене на описанието на полето в структурата на описанието на таблицата (параметър 3). Преминавайки през колоните на следващия ред, ние анализираме техните типове (според описанието на таблицата) и извършваме съответните трансформации. В резултат на това имаме готова команда sql за запис на ред в базата данни. Прилагаме получения оператор sql с помощта на обекта ADODB.Command. В края на процеса затворете връзките и изчистете паметта.

За съжаление, на този сайт не можах да прикача обработка за дебел клиент, който може да качи директории в базата данни за достъп. Но можете да го изтеглите на диска на Yandex: http://yadi.sk/d/UzK_PAsJ3vjTS ... Тази обработка включва всички детайли на универсалния механизъм за разтоварване. Разбира се, тази обработка не се ограничава само до този механизъм. Той може безопасно да бъде копиран както в отделен модул, така и във вашите собствени лечения. Не изключвам грешни ситуации, които могат да доведат до срив на качването, но това не е търговски проект. Можете да модифицирате този механизъм за да отговарят на вашите нужди. По-долу има 2 приложения, описващи adox константите. Надявам се този механизъм да ви бъде полезен. Желая ви успех във вашата професионална област!

Приложение 1 списък на допълнителните свойства на полето на таблицата за достъп:

Автоматично увеличаване

Задава типа поле на брояч, който автоматично да се увеличава при добавяне на запис.

По подразбиране

Стойност на полето по подразбиране.

Описание

Описание на полето.

Фиксирана дължина

Определя дали полето е с фиксирана дължина или променлива.

Прирастване

Стойността, с която полето от типа "брояч" ще бъде увеличено.

Ниулируемо

Определя дали полето не може да съдържа стойност, с други думи дали това поле трябва да се изисква.

Семе

Стойността, от която да започне броенето в първия запис за поле от тип "брояч".

Jet OLEDB: Позволява нулева дължина

Определя дали текстовите полета могат да съдържат низове с нулева дължина. Пренебрегва се за несимволни полета.

Jet OLEDB: Автогенериране

Определя дали нова стойност на GUID се генерира автоматично за полета от тип adGUID.

Jet OLEDB: Правило за проверка на колона

Израз, който определя коректността на стойността, записана в полето, трябва да бъде написан във формата SQL WHERE, но без ключова дума КЪДЕТО.

Jet OLEDB: Текст за проверка на колона

Текстът, който ще бъде показан, ако стойността, въведена в полето, не съответства на правилото, дефинирано за това поле (правило).

Jet OLEDB: Компресирани UNICODE струни

Определя дали Microsoft Jet ще компресира UNICODE низове при запис на диск. Игнорира се, ако базата данни не е в формат на Microsoft Jet версия 4.0.

Jet OLEDB: Хипервръзка

Посочва, че данните в полето са хипервръзка. Игнориран за полета, различни от adLongVarWChar.

Jet OLEDB: IISAM не последна колона

За Installable-ISAMs, това свойство информира I-ISAM, че има повече колони, които ще бъдат добавени към таблицата след тази. Ако използвате ITableDefinition :: AddColumn или ITableDefintion :: CreateTable, се изисква да зададете това свойство за всеки.

Jet OLEDB: Един BLOB на страница

Определя дали данните трябва да се съхраняват в отделни страници (True) или може да използва споделени страници на база данни, за да спести дисково пространство. Работи само с полета от тип adLongVarBinary.

Приложение 2 списък на типовете стойности, използвани в ADOX

adDouble, тип 5 - дробно число

adDate, тип 7 \u200b\u200b- дата / час

adCurrency, тип 6 - цяло число

adInteger, тип 3 - неподписано цяло число

adBoolean, тип 11 - boolean

adVarWChar, тип 202 - unicode низ от 255 знака

adLongVarWChar ("бележка"), тип 203 - unicode низ неограничен низ

Наскоро имах нужда да разтоваря всички данни от една проста база данни на Access в самостоятелно написана конфигурация (1С: Предприятие. Нямаше много информация за прехвърляне и по принцип беше възможно да изтеглите този завладяващ процес на потребителя, но реших да помогна на вече заетите служители.

Помощта се състоеше в пълната автоматизация на този процес. Трябваше да напиша проста обработка, която направи всичко за няколко секунди. Преди тази задача не ми се наложи да работя с куп 1C + Access, така че преди да хвана клавиатурата и да започна да разбивам кода, реших да прочета ръководствата.

Още в самото начало знаех, че всяко взаимодействие ще бъде да използвам подходящите доставчици, но все пак реших да разгледам примерите.

Дълго се замислях в какъв ключ да напиша тази бележка. В резултат се спрях на най-простия вариант - да дам кода на моето решение. Може да не е много оптимално, но за повечето задачи е повече от достатъчно.

И така, нека започнем да разглеждаме всичко по ред. Създаваме нова обработка и хвърляме върху нея един компонент - "TableField". Разпънах този компонент по цялата форма. В резултат моята форма прие формата, както е показано на фигура 1.


Фигура 1. Форма на обработка

По този въпрос можем да приемем, че дизайнът на формуляра е готов. Няма да създаваме колони ръчно, но ще изпълняваме динамично тази процедура. За щастие не е трудно. Създайте манипулатор на събития OnClick за бутона Run и напишете следния код в него:

// Изчистване на полето на таблицата TableField1.Clear (); TabularField1.Columns.Clear (); // Подгответе низ за връзка с MS Access // Пътят до базата данни е посочен в самия край ConnectionString \u003d "Provider \u003d Microsoft.Jet.OLEDB.4.0; Data Source \u003d" + "C: \\ mydb.mdb"; ConnectionWithBase \u003d Нов COMObject ("ADODB.Connection"); // ConnectConnectionWithBase.Open (ConnectionString); // Вземете набор от записи от таблицата demo_table RecordsCollection \u003d Нов COMObject ("ADODB.Recordset"); CollectionRecords.Open ("select * from demo_table", ConnectWithBase, 1); // четем структурата на полетата на таблицата // В таблицата на стойностите създайте всички колони, които са в таблицата "Access". За count \u003d 0 от Records Collection.Fields.Count - 1 Loop TableField1.Columns. Добавяне ("Column" + nr, Line (Record Collection) .Fields.Item (сч. .Name)); End of Loop; // Преместете маркера в първия запис от колекцията Records.MoveFirst (); // прочетете данните от таблицата // и ги добавете към колекцията TK NOT RECORD все още.EOF Loop NewRow \u003d TableField1. Add (); For count \u003d 0 by RecordsCollection.Fields.Count - 1 Loop NewRow ["Column" + nt] \u003d RecordsCollection.fields (TabularField1.Columns [nr] .Header) .Value; End of Loop; Record Collection.MoveNext (); EndCycle; // Показване на данните от TK в TabularFieldFormElements.TableField1.Value \u003d TabularField1; FormFields.TableField1.CreateColumns ();

Кодът не е твърде голям, но достатъчно полезен. Не съм се свързвал с конкретна структура. Кодът работи чудесно на голямо разнообразие от таблици. Нямам какво повече да добавя, затова се сбогувам

Накратко - нищо. Във всичко, свързано с взаимодействие с държавни агенции (независимо дали става въпрос за данъци, счетоводство, всякакви видове акцизни плащания и т.н.), 1C не може да бъде заменен с нищо и опитите за това са поне неконструктивни.

Но не спирайте да четете тази статия, това все още не е основната идея. Основната е да не попаднете в логически капан и да не смятате 1С за напълно необходим в която и да е част от автоматизацията на всички процеси в предприятието. Тук има с какво да спорите и какво да предложите. Искам да ви разкажа за един успешен опит в автоматизирането на различни аспекти от бизнес дейността на компютърна компания и, разбира се, за интеграцията на това решение с 1С. Работата произтича от необходимостта да се свързва самостоятелно разработена система с програмата 1С, но този подход (разделяне на 2 софтуерни блока) може да се развие до пълноценна философия на изграждането на информационна система като цяло.

Първоначално задачата беше следната. Имаше написана система за корпоративна автоматизация Microsoft Access... През дългите години на своето развитие той е поел почти всички ежедневни задачи - поддържане на банка, фактуриране, съставяне на счетоводни документи за експедиция, поддържане на склад, отчитане на компоненти за серийни номера, съставяне технологични карти за производство и др. Наскоро бяха добавени възможностите на системата: създаване на банкови плащания директно въз основа на входящи фактури, автоматично генериране ценоразписи в различни формати за публикуване в уеб ресурси, актуализиране на уебсайта на компанията и изготвяне на договори въз основа на съществуващи шаблони (т.нар. офис автоматизация). Плюс наличието на голямо количество анализи и поддържането на цялото управленско счетоводство. Всичко това направи системата абсолютно незаменима - прехвърлянето на цялата тази функционалност към 1С би отнело много време и пари.

От друга страна, програмата 1C-Enterprise обслужва само нуждите на счетоводния отдел за поддържане на BU и NU и подаване на отчети. По този начин 1С беше „отделен“ от ежедневното функциониране на компанията и извършените документи бяха внесени в базата данни a posteriori.

Защо подобна схема е добра? Има няколко предимства:
- недопускане на мениджъри и други (без) отговорни лица до „светинята“ - счетоводната база, която трябва да се формира само от служители, които имат представа за предмета; точна поддръжка на справочни книги,
- изваждане от 1С на всичко, което няма нищо общо: от управленски задачи, които не изискват отразяване в счетоводството, до други моменти, които са специфични за компанията и които не трябва да бъдат достъпни от външни лица,
- спестявания от лицензи: 1С работни места струват много пари,
- важен момент: при внедряването на цялата допълнителна функционалност, описана по-горе директно „вътре“ в 1С, постоянно се налага да се усъвършенства, когато се пускат актуализации на продукти. Това, разбира се, гарантира почти постоянна заетост на 1С програмисти, но това е място, където можете значително да спестите пари.

Е, смелият минус, разбира се, е необходимостта от повторна проверка на всички документи и попълване на директории.

Всъщност това беше основната задача - да се избяга от двойната работа.

Първо трябва да се справите с всякакви справочници - на първо място, това е справочник на изпълнителите и номенклатурата. Проблемът със синхронизирането на директории, който толкова често възниква при програми от този вид, е достатъчно разработен и разбран при изпълнението. В този случай обаче беше взето волево решение да не се използват 2 директории с взаимна синхронизация, а да има една оригинална версия - тази, която е включена в MS Access, и просто да я репликира в 1С ( обратна връзка е само знак в MS Access, че тази позиция вече е разтоварена).
Този подход значително опростява задачата. За чисто счетоводни нужди са необходими много малко позиции в такива директории - и те също са създадени във външна програма, за да не нарушават формулирания принцип. По този начин можете да премахнете още един чест проблем - огромна инфлация на справочника на използваната номенклатура. По-долу е продуктовата група "Монитори"

Качването на такъв ужас в директорията 1С (и новите модели монитори се появяват почти всяка седмица) може да бъде конфигурирано по такъв начин, че всички да попаднат в една и съща позиция, тъй като нюансите на цвета на рамката около екрана и броя на пикселите са напълно незначителни за отчитане! А размерът на диагонала, честно казано, още повече, ако се различава с половин инч.

Освен това във външната програма е възможно с много по-малко загуби да се изработи обединяването на дублирани позиции в директориите, особено в директорията на контрагентите, тъй като в 1С това изисква много усилия.

По този начин в 1С се качват само „прецизирани“, почистени и дадени в правилната форма данни. Разтоварването може да се извърши с известна честота - порционирането ви позволява да отстранявате грешки в работата на счетоводния отдел и да избягвате ненужната работа, ако през деня (или по-дълъг период) нещо е било отменено, променено, извършено отново - всички тези неща се случват в работната база данни на MS Access и само "установени »Състоянието на нещата е 1C. Освен това този вид разтоварване може да бъде синхронизиран с операции по архивиране и винаги да сте сигурни в коректността на текущото състояние на 1С базата.

Очевидно документите се получават без автоматично публикуване (въпреки че това може да бъде конфигурирано). Между другото, самата база данни на MS Access проверява наличността на необходимите стоки в склада - за отписване за експедиция (дилемата - да се увери, че фактурата може да бъде издадена до текущата дата, че всички елементи, необходими за отписване, са в склада - тоест закупени или произведени - имате нужда ... да предаде документа в 1С. Изглежда, че не си струва да се доверявате на мениджърите - или иначе зад мениджъра винаги трябва да има счетоводител)

Сега за изпълнението. Програмите 1С поддържат интерфейса за обмен на данни чрез механизма ADO. От страна на 1С, редовен софтуерен интерфейс за създаване на елементи от директории и документи, така че работата на този механизъм да не зависи от вътрешните детайли на изпълнението на 1С, които могат да се променят от версия на версия и от актуализация до актуализация. От друга страна, основният лозунг на разработката беше „да се възползваме максимално от възможностите на 1С, където е възможно“. Следователно при окончателното внедряване на пакета от MS Access бяха заредени само името и ИНН на контрагента - данните бяха „изтеглени“ от Единния държавен регистър на юридическите лица и индивидуалните предприемачи с помощта на механизма, вграден в 1С (същото важи и за банкова информация - те се актуализират от BIK).

Във външната база данни на MS Access бяха създадени заявки (Query), които подготвят всички необходими данни за зареждане в 1С - вземете ги и ги поставете в документи и полета.

Схемата за разтоварване се състои от два етапа. Първо се зареждат нови позиции на контрагенти и номенклатурни референции. GUID, присвоени от 1С, се връщат в MS Access, така че при разтоварване на всички документи на втория етап да зададете правилните препратки към справочни книги. Изглежда така

Ние вярваме, че такава идеология на изграждане информационни системи може да се вземе за основа не само в онези фирми, в които има наследени не-1С системи, но и при организиране на работата на нови юридически лица, тъй като имаме много опит в MS Access. Предимствата на този подход са посочени по-горе.

Тази статия ще се съсредоточи върху настройването на правата на потребителски достъп до обекти в системата 1С.

В 1С 8 се използва отделен обект на метаданни за управление на потребителския достъп, който се нарича Роли.

Забележка! Тази статия е написана в помощ на програмистите. Настройването на права в потребителски режим, като се използва примера на 1С Счетоводство, е обсъдено в.

Ролята определя набора от права, които има потребителят. Механизмът за роли е много подобен на механизмите за права на Windows Active Directory... За всеки от обектите (справочници, документи) разработчикът задава свой собствен набор от права - четене / писане / добавяне / промяна / ...

Наборът от налични права - събиране на всички разрешения в потребителски роли.

Ако отворим обекта с метаданни Роля, можем да видим следната картина:

Обектът има два раздела - Шаблони за права и ограничения. Права - основен раздел, Шаблони - раздел за задаване на права на ниво запис в 1С ( RLS). Това е много важна тема, ще се опитам да я опиша в бъдещи статии.

Ще разгледаме само раздела Права.

  • Обекти - списъкът, към който ще бъдат зададени правата.
  • Права - списък с права, които могат да бъдат създадени.
  • Ограничаване на достъпа до данни - ролеви полета за персонализиране

Обърнете внимание на отметките отдолу:

  • Задайте права за нови обекти - ако флагът е зададен за роля, разрешенията ще бъдат автоматично зададени за нови обекти на метаданни. Препоръчвам да инсталирате, ако често забравяте да зададете правата за нови обекти.
  • Задайте права за реквизити и таблични раздели по подразбиране- флаг, когато е зададен, атрибутите и табличните раздели ще наследят правата на собственика (справочник, документ и т.н.)
  • Независими права на подчинени обекти - ако флагът е зададен, тогава системата, когато определя правата върху обекта за конфигуриране, ще вземе предвид правата върху родителския обект

Задаване на права за цялата конфигурация

Ако отворим ролята и щракнем върху корена на конфигурацията, ще видим следните настройки:

Повече за всеки от права върху цялата конфигурация:

Вземете 267 1C видео уроци безплатно:

  • Администрация - администрация информационна база (изисква право „Администриране на данни“)
  • Администриране на данни - правото на административни действия с данни
  • Актуализиране на конфигурацията на базата данни - надясно, за да
  • Изключителен режим - използване на изключителен режим
  • Активни потребители - преглед на списъка с активни потребители
  • - регистрационен дневник
  • - правото на стартиране тънък клиент
  • - правото за стартиране на уеб клиента
  • Дебел клиент - правото да изпълнява ролята на дебел клиент
  • Външна връзка - правото за стартиране на външна връзка
  • Автоматизация - правото да се използва автоматизация
  • Режим на всички функции - в режим на управлявано приложение
  • Запазване на потребителски данни - разрешение или забрана за запазване на потребителски данни (настройки, любими, история). Особено подходящо за 1C управлявани формуляри.
  • Интерактивно откритие външни лечения - отваряне на външни лечения
  • Отваряне на външни отчети интерактивно - отваряне на външни доклади
  • Изход - отпечатване, писане и копиране в клипборда

Задаване на права 1C 8.2 на други обекти на метаданни

За останалите основни обекти (директории, константи, документи, регистри ...) наборът от права за ролята е съвсем стандартен:

  • Четене - четене (софтуер)
  • Добавяне - добавяне (софтуер)
  • Промяната - промяна (софтуер)
  • Изтриване - изтриване (софтуер)
  • Изглед - гледане
  • Интерактивно добавяне - интерактивно добавяне
  • Редактиране - редактиране
  • Изтриване на онлайн флаг - интерактивна марка за изтриване
  • Премахване на сигнала онлайн - премахване на маркировката за изтриване
  • Интерактивно изтриване на маркирани- премахване на маркирани обекти
  • Въвеждане по ред - като се използва режим на линеен вход
  • Деинсталиране онлайн - директно изтриване (shift + del)

Права само за документи:

  • Интерактивно поведение - държане
  • Отмяна - анулиране на документи
  • Интерактивно неоперативно - задържане (стандартни команди на формуляри) на документ в неоперативен режим
  • Интерактивно анулиране - интерактивно анулиране
  • Интерактивна модификация на проведена - редактиране на публикувания документ. Ако ролята няма право, тогава потребителят не може да изтрие публикувания документ, да маркира изтриване, да публикува повторно или да го отправи. Формата на такъв документ се отваря в режим на преглед

P.S. Ако все още не сте успели да разберете ролите на потребителите, можете да поръчате.
Видео с пример за задаване на права в 1С счетоводство 3.0:

Споделя това