Access не працює завантаження в 1с. Вихідний код функції створення файлу БД

особливості:

  1. Файл бази даних можна створювати окремо від даних.
  2. Таблиця в БД файлі можна створювати окремо від даних.
  3. Типи даних перетворюються в сумісні з access.
  4. Значення рівні порожній датою, рядку перетворюються в null.
  5. Чи не примітивні і не рядкові типи даних (посилальні) обрізаються по довжині до 255 символів.
  6. Строкові типи даних адаптуються по довжині рядка для економії обсягів.
  7. Символ одинарної лапки 'запишеться в базу за допомогою функції запиту char ().
  8. Автоматичне додавання первинного індексу (лічильник рядків).

обмеження:

  1. Працює тільки з таблицею значень в якості джерела даних.
  2. Механізм працює тільки в режимі товстого клієнта. Це пов'язано з використанням бібліотеки ADO і таблиці значень одночасно.
  3. Робота можлива тільки на windows системах.

Сам механізм складається з трьох блоків:

  1. Функція створення файлу БД.
  2. Функція створення таблиці БД.
  3. Функція запису даних в таблицю БД.

Схематично робота механізму виглядає так:

Вихідний код функції створення файлу БД:

// функція створює новий файл БД з можливістю перезапису старого // Параметр // Параметр 2: булево - прапор перезапису в разі якщо файл БД вже існує // повертає 0 у разі вдалого завершення роботи і не 0 якщо функція зазнала невдачі Функція СоздатьФайлАксес (Знач имяфайла, Знач ПерезапісиватьФайл \u003d Істина) // Перевіримо валідність імені файлу Якщо ПустаяСтрока (имяфайла) Тоді Повернення - 2; інакше // аналіз знаходження файлу на диску Якщо ПерезапісиватьФайл Тоді Файл \u003d Новий Файл (имяфайла); Якщо Файл. Існує () Тоді Файл \u003d Не визначено; УдалітьФайли (имяфайла); КонецЕсли; КонецЕсли; КонецЕсли; Стан ( " Створюється файл access:"+ Имяфайла); // створюємо оболонку БД Спроба Адохам \u003d Новий COMОб'ект ( "ADOX . Catalog"); Виняток Повідомити (" "+ Символи. ПС + ОпісаніеОшібкі ()); КонецПопиткі; // Підключення до щойно створеної БД СтрокаПодключенія \u003d "Provider" "" + имяфайла + "" ""; // підключаємося Спроба Адохам. Create (СтрокаПодключенія); Виняток Повідомити ( " Чи не вдалося сформувати файл з даними. При створенні об'єкта ADOX. Catalog сталася помилка!"+ Символи. ПС + ОпісаніеОшібкі ()); Повернення - 1; КонецПопиткі; Адохам. ActiveConnection. Close (); Адохам \u003d Не визначено; Повернення 0; КонецФункціі

Функція отримує 2 параметра:

  1. Файл майбутньої БД - рядок. Це повний шлях до файлу, якщо його не передати, процедура завершить роботу.
  2. Перезаписувати файл - булево. Це логічне прапорець, який використовує механізм перезапису файлу.

Спочатку виконується перевірка повного імені файлу. Далі відпрацьовує механізм перезапису файлу. У разі необхідності існуючий файл видаляється. Після чого процедура переходить до створення порожнього файлу БД. Робиться це за допомогою об'єкта ADOX.Catalog. Для розбору тонкощів роботи ADOX.Catalog рекомендую пошукати відповідну інформацію на сайті Microsoft.

Друга «шестерня» механізму вивантаження в access реалізує створення таблиці у файлі БД. Для створення таблиць використовується все той же об'єкт ADOX.Catalog.

Вихідний код процедури створення нової таблиці в БД:

// Параметр 1: рядок - повне ім'я файлу бази даних // Параметр 2: ТабліцаЗначеній - Таблиця з даними до вивантаження // Параметр 3: структура - опис створюваної таблиці (сформувати можна за допомогою функції: СоставленіеСтруктуриОпісаніяПолей) // Повертає 0 в разі вдалого завершення роботи і не 0 якщо функція зазнала невдачі Функція ВнесеніеДаннихТабліцу (Знач имяфайла, Знач ТабліцаДанних, Знач ОпісаніеТабліци) СтрокаПодключенія \u003d "Provider \u003d Microsoft. Jet. OLEDB. 4. 0; Data Source \u003d"" "+ Имяфайла +" "" ; Jet OLEDB: Engine Type \u003d 5;"; Конектор \u003d Новий COMОб'ект (" ADODB . Connection"); Конектор. ConnectionString \u003d СтрокаПодключенія; // підключення Спроба Конектор. Open (); Виняток Повідомити (" Не вдалося відкрити файл БД!"); Повідомити (ОпісаніеОшібкі ()); Повернення - 1; КонецПопиткі; Стан (" Заповнюю даними таблицю:"+ ОпісаніеТабліци. ІмяТабліци); // командний об'єкт БД Ком \u003d Новий COMОб'ект ( "ADODB . Command"); Ком. ActiveConnection \u003d Конектор; // константа 1 означає "запит", бувають ще уявлення і процедури Ком. CommandType \u003d 1; СчётчікСтрок \u003d 1; Для Кожного СтрокаТЗ З ТабліцаДанних Цикл ОбработкаПрериваніяПользователя (); // обходимо колонки даних СпісокПолей \u003d Формат (СчётчікСтрок, "ЧГ = " ) + " , "+ Символи. ПС; СчётчікСтрок \u003d СчётчікСтрок + 1; СчётчікКолонок \u003d 0; Для Кожного КолонкаТЗ З ТабліцаДанних. Колонки Цикл ТекЗначеніе \u003d СтрокаТЗ [КолонкаТЗ. Ім'я]; ОпісаніеПоля \u003d ОпісаніеТабліци. ОпісаніеПолей. Отримати (СчётчікКолонок); // аналіз типу даних Якщо ОпісаніеПоля. Тип \u003d " 3 "Тоді // число ціле ТекЗначеніе \u003d? (ТекЗначеніе \u003d , 0, ТекЗначеніе); СпісокПолей \u003d СпісокПолей + Формат (ТекЗначеніе," ЧН \u003d Null; ЧГ \u003d" ) + " , 5 "Тоді // число дробове // перетворимо null до 0 тому як подальша функція Формат () НЕ перетворює його правильно ТекЗначеніе \u003d? (ТекЗначеніе \u003d , 0, ТекЗначеніе); СпісокПолей \u003d СпісокПолей + Формат (ТекЗначеніе, "ЧРД \u003d. ; ЧН \u003d null; ЧГ \u003d" ) + " , "+ Символи. ПС; ІначеЕслі ОпісаніеПоля. Тип \u003d" 7 "Тоді // дата ТекЗначеніе \u003d? (ТекЗначеніе \u003d ," 00010101 " , ТекЗначеніе); Якщо ТекЗначеніе \u003d " 00010101 " Тоді МодЗначеніе \u003d " null"; Інакше МодЗначеніе \u003d" "" + Формат (ТекЗначеніе, "ДЛФ \u003d DT") +" ""; КонецЕсли; СпісокПолей \u003d СпісокПолей + МодЗначеніе + " , "+ Символи. ПС; ІначеЕслі ОпісаніеПоля. Тип \u003d" 11 "Тоді // булево ТекЗначеніе \u003d? (ТекЗначеніе \u003d , Брехня, ТекЗначеніе); СпісокПолей \u003d СпісокПолей + Формат (ТекЗначеніе," БЛ \u003d False; БІ \u003d true" ) + " , "+ Символи. ПС; ІначеЕслі ОпісаніеПоля. Тип \u003d" 202 "Тоді // рядок ТекЗначеніе \u003d? (ТекЗначеніе \u003d ," ", ТекЗначеніе); ЗначеніеСтрокой \u003d Лев (ТекЗначеніе, 255); Якщо ПустаяСтрока (ЗначеніеСтрокой) Тоді СпісокПолей \u003d СпісокПолей +" ,"+ Символи. ПС; Інакше МодЗначеніе \u003d СтрЗаменіть (ЗначеніеСтрокой," "", "" + Chr () + " "); СпісокПолей \u003d СпісокПолей +" "" + СокрЛП (Лев (МодЗначеніе, 255)) + "" , "+ Символи. ПС КонецЕсли; ІначеЕслі ОпісаніеПоля. Тип \u003d" 203 "Тоді // рядок Якщо ПустаяСтрока (ЗначеніеСтрокой) Тоді СпісокПолей \u003d СпісокПолей +" ,"+ Символи. ПС; Інакше МодЗначеніе \u003d СтрЗаменіть (ТекЗначеніе," "", "" + Chr ("+ КодСімвола (" "") + " ) + " "); СпісокПолей \u003d СпісокПолей +" "" + МодЗначеніе + "" , "+ Символи. ПС КонецЕсли; КонецЕсли; СчётчікКолонок \u003d СчётчікКолонок + 1; КонецЦікла; // обрізаємо останню кому СпісокПолей \u003d Лев (СпісокПолей, СтрДліна (СпісокПолей) - 2); ТекстЗапроса \u003d "INSERT INTO" + ОпісаніеТабліци. ІмяТабліци + "VALUES ( "+ СпісокПолей +" ) "; Ком. CommandText \u003d ТекстЗапроса; Спроба Ком. Execute (); Виняток Повідомити (" Помилка запису даних!"+ Символи. ПС +" Текст запиту: "+ ТекстЗапроса + Символи. ПС + ОпісаніеОшібкі ()); Повернення - 2; КонецПопиткі; КонецЦікла; // закриваємо підключення Ком. ActiveConnection. Close (); Ком \u003d Не визначено; Конектор \u003d Не визначено; Повернення 0; КонецФункціі

Функція отримує 3 параметра:

  1. СтруктураОпісаніяТабліци - структура містить опис самої таблиці і її полів. Формується допоміжною функцією, яку я приведу нижче.
  2. Имяфайла - рядок ім'я файлу БД.
  3. УдалятьСуществующуюТабліцу - прапорець, який визначає поведінку функції щодо вже існуючих однойменних таблиць.

Отримавши управління, функція відкриває файл БД. При вдалому підключенні створюється об'єкт «ADOX.Catalog» (каталог таблиць), який в першу чергу перевіряє існування таблиці відповідно до параметром функції №3. Наступним дією створюється нова таблиця. До таблиці додається ключове поле (індекс). Далі на підставі параметра функції №2 створюються поля таблиці відповідних типів. По завершенні новостворена таблиця додається в каталог і з'єднання закривається.

Зрозуміло вручну збирати параметр функції №2 досить трудомістким, для полегшення я написав функцію, яка на підставі таблиці значень з даними формує структуру опису таблиці.

Вихідний код функції складання структури опису полів:

// допоміжна функція по пормірованію структури опису полів // Параметр 1: ТабліцаЗначеній - Таблиця з даними до вивантаження // Параметр 2: рядок - повне ім'я таблиці (не повинно містити не допустимі символи: ",.) // Повертає структуру опису таблиці Функція СоставленіеСтруктуриОпісаніяПолей (Знач ТабліцаДанних, Знач ІмяТабліци) СтруктураОпісанія \u003d Новий Структура ( "ІмяТабліци , ОпісаніеПолей"); СтруктураОпісанія. ІмяТабліци \u003d ІмяТабліци; СтруктураОпісанія. ОпісаніеПолей \u003d Новий Масив; // обходимо колонки таблиці значень Для Кожного КолонкаТЗ З ТабліцаДанних. Колонки Цикл СтруктураСвойстПоля \u003d Новий Структура ( "Ім'я , Тип, Довжина, Синонім"); ТіпЗначеніяКолонкі \u003d КолонкаТЗ. ТіпЗначенія; ДлінаСтрокі \u003d ТіпЗначеніяКолонкі. КваліфікаториСтрокі. Довжина; // перевірка типів містяться в колонці // будь-якої складової тип буде рядком Якщо ТіпЗначеніяКолонкі. Типи (). Кількість ()\u003e 2 Тоді СтруктураСвойстПоля. Ім'я \u003d КолонкаТЗ. ім'я; СтруктураСвойстПоля. Тип \u003d " 202 "; // adVarWChar, type СтруктураСвойстПоля. Довжина \u003d 255; СтруктураСвойстПоля. Синонім \u003d КолонкаТЗ. Тема; ІначеЕслі ТіпЗначеніяКолонкі. СодержітТіп (Тип (" рядок")) Тоді СтруктураСвойстПоля. Ім'я \u003d КолонкаТЗ. Ім'я; Якщо ДлінаСтрокі \u003d 0 Тоді СтруктураСвойстПоля. Тип \u003d" 203 " ; // adLongVarWChar ( "memo"), type 203 [текстовий потік в Юникоде (DT_NTEXT)]202 "; // adVarWChar, type 202 [рядок в Юникоде довжиною в 255 символів (DT_WSTR)] //СтруктураСвойстПоля.Дліна \u003d? (ДлінаСтрокі 0 Тоді // помилка редактора статті при вставці коду, виправити не зміг, дивіться обробку СтруктураСвойстПоля. Тип \u003d " 5 "; // adDouble, type 5 Інакше СтруктураСвойстПоля. Тип \u003d " 3 "; // adInteger, type 3 КонецЕсли; ІначеЕслі ТіпЗначеніяКолонкі. СодержітТіп (Тип ( "Булево")) Тоді СтруктураСвойстПоля. Ім'я \u003d КолонкаТЗ. ім'я; СтруктураСвойстПоля. Тип \u003d " 11 "; // adBoolean, type 11 СтруктураСвойстПоля. Довжина \u003d Не визначено; СтруктураСвойстПоля. Синонім \u003d КолонкаТЗ. Заголовок; ІначеЕслі ТіпЗначеніяКолонкі. СодержітТіп (Тип ( "Дата")) Тоді СтруктураСвойстПоля. Ім'я \u003d КолонкаТЗ. ім'я; СтруктураСвойстПоля. Тип \u003d " 7 "; // adDate, type 7 СтруктураСвойстПоля. Довжина \u003d Не визначено; СтруктураСвойстПоля. Синонім \u003d КолонкаТЗ. Заголовок; Інакше СтруктураСвойстПоля. Ім'я \u003d КолонкаТЗ. ім'я; СтруктураСвойстПоля. Тип \u003d " 202 "; // adVarWChar, type 202 [рядок в Юникоде довжиною в 255 символів (DT_WSTR)] СтруктураСвойстПоля. Довжина \u003d 255; СтруктураСвойстПоля. Синонім \u003d КолонкаТЗ. Заголовок; КонецЕсли; СтруктураОпісанія. ОпісаніеПолей. Додати (СтруктураСвойстПоля); КонецЦікла; Повернення СтруктураОпісанія; КонецФункціі

Функція отримує 2 параметра:

  1. ТабліцаДанних - таблиця значень з даними. З цього параметра функція формує опис типів даних майбутніх полів. Рекомендую створювати цю таблицю значень через запит, так як в цьому випадку все поля ТЗ будуть тіпізірованія.
  2. ІмяТабліци - рядок ім'я майбутньої таблиці access.

Спочатку створюється структура з описом самої БД, після чого додається масив, який буде містити в собі інші структури з описом полів. У процесі циклу по колонках таблиці значень заповнюється масив опису полів. Структура опису поля містить 4 основні властивості:

  1. Ім'я - рядок імені майбутнього поля. Не повинно містити пробілів або несумісних символів. Якщо таблицю значень ви формуєте запитом, то проблем виникнути не повинно, але в разі самостійного заповнення таблиці значень відповідальність повністю лягає на вас.
  2. Тип - рядок, це константа Microsoft. У нашому випадку використовуються тільки: число ціле, число дробове, рядок (різної довжини), булево і дата.
  3. Довжина - число, для строкових типів.
  4. Синонім - рядок, текстовий опис поля.

Закінчивши формування структури, она повертається.

Нарешті можна переходити до функції записуючої дані в таблицю БД. У цій функції, можна сказати, зосереджено ядро \u200b\u200bфункціонала всього механізму. Таким чином, дана функція є найскладнішою, але це не повинно вас лякати. Програміст тому і програміст, що розвиває аналітичний склад розуму.

Вихідний код функції внесення даних в таблицю:

// функція вносить дані в таблицю // Параметр 1 : Рядок - повне ім'я файлу бази даних // Параметр 2 : ТабліцаЗначеній - Таблиця з даними до вивантаження // Параметр 3 : Структура - опис створюваної таблиці (сформувати можна за допомогою функції: СоставленіеСтруктуриОпісаніяПолей) // Повертає 0 в разі вдалого завершення роботи і не 0 якщо функція зазнала невдачі функція ВнесеніеДаннихТабліцу (знач Ім'я файлу , знач ТабліцаДанних , знач ОпісаніеТабліци ) СтрокаПодключенія = " Provider = Microsoft . Jet . OLEDB . 4 . 0 ; Data Source = " " " + Ім'я файлу + " " " ; Jet OLEDB: Engine Type = 5 ; " ; // об'єкт відповідає за зв'язок з БД конектор = новий COMОб'ект (" ADODB . Connection" ) ; конектор . ConnectionString = СтрокаПодключенія ; // підключення спроба конектор . Open () ; виняток Повідомити (" Чи не вдалося відкрити файл БД!" ) ; Повідомити (ОпісаніеОшібкі () ) ; повернення - 1 ; КонецПопиткі; стан (" Заповнюю даними таблицю:" + ОпісаніеТабліци . ІмяТабліци ) ; // командний об'єкт БД ком = новий COMОб'ект (" ADODB . Command" ) ; ком . ActiveConnection = конектор ; // константа 1 означає "запит", бувають ще уявлення і процедури ком . CommandType = 1 ; СчётчікСтрок = 1 ; для кожного СтрокаТЗ з ТабліцаДанних цикл ОбработкаПрериваніяПользователя () ; // обходимо колонки даних СпісокПолей = формат (СчётчікСтрок , " ЧГ = " ) + " , " + символи . ПС ; СчётчікСтрок = СчётчікСтрок + 1 ; СчётчікКолонок = 0 ; // цикл для формування списку полів для кожного КолонкаТЗ з ТабліцаДанних . колонки цикл ТекЗначеніе = СтрокаТЗ [ КолонкаТЗ . ім'я ] ; ОпісаніеПоля = ОпісаніеТабліци . ОпісаніеПолей . отримати (СчётчікКолонок ) ; // аналіз типу даних якщо ОпісаніеПоля . Тип = " 3 " тоді // число ціле СпісокПолей = СпісокПолей + формат (ТекЗначеніе , " ЧН = null; ЧГ = " ) + " , " + символи . ПС ; ІначеЕслі ОпісаніеПоля . Тип = " 5 " тоді // число дробове СпісокПолей = СпісокПолей + формат (ТекЗначеніе , " ЧРД = . ; ЧН = null; ЧГ = " ) + " , " + символи . ПС ; ІначеЕслі ОпісаніеПоля . Тип = " 7 " тоді // дата якщо ТекЗначеніе = "00010101 " тоді МодЗначеніе = " null" ; інакше МодЗначеніе = " " " + формат (ТекЗначеніе , " ДЛФ = DT" ) + " " " ; КонецЕсли; СпісокПолей = СпісокПолей + МодЗначеніе + " , " + символи . ПС ; ІначеЕслі ОпісаніеПоля . Тип = " 11 " тоді // булево СпісокПолей = СпісокПолей + формат (ТекЗначеніе , " БЛ = false; БІ = true" ) + " , " + символи . ПС ; ІначеЕслі ОпісаніеПоля . Тип = " 202 " тоді // рядок ЗначеніеСтрокой = Лев (ТекЗначеніе , 255 ) ; якщо Порожня стрічка (ЗначеніеСтрокой ) тоді СпісокПолей = СпісокПолей + " null, " + символи . ПС ; інакше // Одиночна лапки є спец символом в sql // перетворимо цей символ через код МодЗначеніе = СтрЗаменіть (ЗначеніеСтрокой , " " " , " " + chr (" + КодСімвола (" " " ) + " ) + " " ) ; СпісокПолей = СпісокПолей + " " " + СокрЛП (Лев (МодЗначеніе , 255 ) ) + " ", " + символи . ПС КонецЕсли; ІначеЕслі ОпісаніеПоля . Тип = " 203 " тоді // рядок якщо Порожня стрічка (ЗначеніеСтрокой ) тоді СпісокПолей = СпісокПолей + " null, " + символи . ПС ; інакше МодЗначеніе = СтрЗаменіть (ТекЗначеніе , " " " , " " + chr (" + КодСімвола (" " " ) + " ) + " " ) ; СпісокПолей = СпісокПолей + " " " + МодЗначеніе + " ", " + символи . ПС КонецЕсли; КонецЕсли; СчётчікКолонок = СчётчікКолонок + 1 ; КонецЦікла; // Для Кожного КолонкаТЗ З ТабліцаДанних.Колонкі Цикл // обрізаємо останню кому СпісокПолей = Лев (СпісокПолей , СтрДліна (СпісокПолей ) - 2 ) ; // остаточне формування тесту запиту ТекстЗапроса = " INSERT INTO" + ОпісаніеТабліци . ІмяТабліци + " VALUES (" + СпісокПолей + " ) " ; ком . CommandText = ТекстЗапроса ; // запис даних в БД (виконання запиту) спроба ком . Execute() ; виняток Повідомити (" Помилка запису даних!" + символи . ПС + " Текст запиту:" + ТекстЗапроса + символи . ПС + ОпісаніеОшібкі () ) ; повернення - 2 ; КонецПопиткі; КонецЦікла; // Для Кожного СтрокаТЗ З Дані Цикл // закриваємо підключення ком . ActiveConnection . Close () ; ком = НЕ визначено; конектор = НЕ визначено; повернення 0 ; КонецФункціі

Функція отримує 3 параметра:

  1. Имяфайла - рядок ім'я файлу бази даних.
  2. ТабліцаДанних - таблиця значень, що містить дані.
  3. ОпісаніеТабліци - структура, що описує поля таблиці і ім'я.

Для роботи з БД створюється вже знайоме нам підключення. Підключившись, створюємо об'єкт, який відповідає за виконання sql інструкцій. Далі організуємо цикл по рядках таблиці значень (параметр функції №2) і вкладений цикл по колонках таблиці. Лічильник рядків буде використовуватися для індексування рядків. Лічильник колонок буде використовуватися для пошуку опису поля в структурі опису таблиці (параметр №3). Перебираючи колонки чергового рядка, аналізуємо їх типи (за описом таблиці) і виконуємо відповідні перетворення. В результаті у нас виявляється готова команда sql для запису рядка в БД. Застосовуємо отриману sql інструкцію, об'єктом ADODB.Command. Після закінчення процесу закриваємо підключення і очищаємо пам'ять.

На жаль на цьому сайті я не зміг прикріпити обробку для товстого клієнта, яка може вивантажувати будь-які довідники в базу access. Але на яндекс диску її можна завантажити: http://yadi.sk/d/UzK_PAsJ3vjTS . У даній обробці задіяні всі деталі універсального механізму вивантаження. Звичайно даної обробкою, цей механізм не обмежується. Його можна сміливо копіювати як в окремий модуль, так і в свої обробки. Я не виключаю помилкових ситуацій, які можу привести до краху вивантаження, але це не комерційний проект. Ви вільні доопрацювати даний механізм під свої потреби. Нижче наведені 2 додатки з описом констант adox. Сподіваюся, цей механізм буде вам корисним. Бажаю вам успіхів на професійній ниві!

Додаток 1 список додаткових властивостей поля таблиці access:

AutoIncrement

Задає тип поля "Лічильник" з автоматичним збільшенням значення при додаванні запису.

Default

Значення поля за замовчуванням.

Description

Опис поля.

Fixed Length

Визначає, буде поле фіксованої довжини або зміною.

Increment

Значення, на яке буде збільшуватися поле типу "лічильник".

Nullable

Визначає, чи може поле не містити жодного значення, іншими словами чи повинно це поле бути обов'язковим для заповнення.

Seed

Значення, з якого почнеться відлік в першому записі для поля типу "лічильник".

Jet OLEDB: Allow Zero Length

Визначає, чи можуть текстові поля містити рядки нульової довжини. Ігнорується для несімвольних полів.

Jet OLEDB: AutoGenerate

Визначає, чи буде автоматично генеруватися нове значення GUID для полів типу adGUID.

Jet OLEDB: Column Validation Rule

Вираз, що визначає правильність записується в поле значення, повинно бути написано в форматі SQL WHERE але без ключового слова WHERE.

Jet OLEDB: Column Validation Text

Текст, який буде показаний, в разі невідповідності заносимого в поле значення, певного для цього поля правилом (Rule).

Jet OLEDB: Compressed UNICODE Strings

Визначає, чи буде Microsoft Jet стискати UNICODE рядки при запису на диск. Ігнорується, якщо база даних не в форматі Microsoft Jet version 4.0.

Jet OLEDB: Hyperlink

Визначає, що дані в поле є гіперпосиланням. Ігнорується для полів з типом відмінним від adLongVarWChar.

Jet OLEDB: IISAM Not Last Column

For Installable-ISAMs, this property informs the I-ISAM that there are more columns that are going to be added to the table after this one. If you are using ITableDefinition :: AddColumn or ITableDefintion :: CreateTable, it is required that you set this property for every.

Jet OLEDB: One BLOB per Page

Визначає, чи повинні дані зберігається в роздільних сторінках (True) або можуть використовувати загальні сторінки бази даних, для економії місця на диску. Працює тільки з полями типу adLongVarBinary.

Додаток 2 список типів значень застосовуваних в ADOX

adDouble, type 5 - дробове число

adDate, type 7 - дата / час

adCurrency, type 6 - ціле число

adInteger, type 3 - беззнаковое ціле число

adBoolean, type 11 - булево

adVarWChar, type 202 - рядок unicode довжиною 255 символів

adLongVarWChar ( "memo"), type 203 - рядок unicode необмежена рядок

Нещодавно мені було потрібно вивантажити з однієї простенької БД Access всі дані в самопісний конфігурацію (1С: Підприємство. Інформації для перенесення було не так багато і в принципі можна було вивантажити цей захоплюючий процес на користувача, але я вирішив допомогти і без того зайнятим співробітникам.

Допомога полягала в повній автоматизації цього процесу. Довелося написати простеньку обробку, яка все зробила за кілька секунд. До цього завдання мені не доводилося працювати зі зв'язкою 1С + Access, тому перед тим як схопитися за клаву і почати шльопати код я вирішив почитати манули.

Я з самого початку знав, що все взаємодія буде полягати у використанні відповідних провайдерів, але все ж вирішив покопатися в прикладах.

Я довго думав в якому ключі написати цю замітку. У підсумку зупинився на найпростішому варіанті - привести код мого рішення. Нехай він не сильно оптимальний, але для більшості завдань його більш, ніж достатньо.

Отже, почнемо все розглядати по порядку. Створюємо нову обробку і кидаємо на неї єдиний компонент - «ТаблічноеПоле». Я розтягнув цей компонент по всій формі. У підсумку моя форма набула вигляду як на малюнку 1.


Малюнок 1. Форма обробки

На цьому можна вважати, що дизайн форми готовий. Ми не будемо створювати колонки в ручну, а виконаємо цю процедуру динамічно. Благо, це не складно. Створюй обробник події «ПріНажатіі» для кнопки «Виконати» і напиши на ньому наступний код:

// Очищаємо наше табличное поле ТаблічноеПоле1.Очістіть (); ТаблічноеПоле1.Колонкі.Очістіть (); // Готуємо рядок з'єднання з MS Access // Шлях до бази вказується в самому кінці СтрокаПодключенія \u003d "Provider \u003d Microsoft.Jet.OLEDB.4.0; Data Source \u003d" + "C: \\ mydb.mdb"; СоедіненіеСБазой \u003d Новий COMОб'ект ( "ADODB.Connection"); // Єднаймося СоедіненіеСБазой.Open (СтрокаПодключенія); // Отримуємо набір записів з таблиці demo_table КоллекціяЗапісей \u003d Новий COMОб'ект ( "ADODB.Recordset"); КоллекціяЗапісей.Open ( "select * from demo_table", СоедіненіеСБазой, 1); // зчитуємо структуру полів таблиці // У таблиці значень створюємо всі колонки, які є в Access "івської таблиці Для рах \u003d 0 по КоллекціяЗапісей.Fields.Count - 1 Цикл ТаблічноеПоле1.Колонкі.Добавіть (" Колонка "+ рах, Рядок (КоллекціяЗапісей .Fields.Item (рах) .Name)); КонецЦікла; // Переміщаємо маркер на перший запис КоллекціяЗапісей.MoveFirst (); // зчитуємо дані з таблиці // і додаємо їх в ТЗ Поки НЕ КоллекціяЗапісей.EOF Цикл НоваяСтрока \u003d ТаблічноеПоле1. Додати (); Для рах \u003d 0 по КоллекціяЗапісей.Fields.Count - 1 Цикл НоваяСтрока [ "Колонка" + рах] \u003d КоллекціяЗапісей.fields (ТаблічноеПоле1.Колонкі [рах] .Заголовок) .Value; КонецЦікла; КоллекціяЗапісей.MoveNext (); КонецЦікла; // Відображаємо дані з ТЗ в ТаблічномПоле ЕлементиФОрми.ТаблічноеПоле1.Значеніе \u003d ТаблічноеПоле1; ЕлементиФОрми.ТаблічноеПоле1.СоздатьКолонкі ();

Код вийшов не надто великим, але досить корисним. Я не робив прив'язок до певної структури. Код прекрасно працює на найрізноманітніших таблицях. Більше мені додати нічого, тому прощаюся

Коротко кажучи - ніяк. У всьому, що стосується взаємодії з держорганами (будь то податкова, бухгалтерська звітність, всякі акцизні платежі та інше), 1С не замінить нічим і намагатися зробити це, щонайменше, неконструктивно.

Але ви не кидайте читати цю статтю, це ще не основна думка. Основна полягає в тому, щоб не попасти в логічну пастку і не порахувати 1С зовсім незамінною в будь-якій частині автоматизації всіх процесів на підприємстві. Ось тут є з чим посперечатися і що запропонувати. Я хочу розповісти про один успішний досвід автоматизації найрізноманітніших сторін бізнес-діяльності комп'ютерної фірми і так, звичайно ж, про стикування цього рішення з 1С. Робота виросла з необхідності сполучення розробленої самостійно системи з програмою 1С, але цей підхід (поділ на 2 програмних блоку) можна розвинути до повноцінної філософії побудови інформаційної системи взагалі.

Спочатку завдання полягало в наступному. Була корпоративна система автоматизації, написана на Microsoft Access. За довгі роки свого розвитку вона увібрала в себе практично все повсякденні завдання - ведення банку, виписку рахунків, оформлення бухгалтерських документів на відвантаження, ведення складу, облік комплектуючих по серійним номерам, складання технологічних карт на виробництво і т.д. Останнім часом до можливостей системи додалися: створення банківських платіжок прямо на основі вхідних рахунків, автоматична генерація прайс-листів в різних форматах для публікації на веб-ресурсах, оновлення веб-сайту фірми і підготовка Договорів на основі існуючих шаблонів (так звана офісна автоматизація). Плюс наявність великої кількості аналітики і ведення всього управлінського обліку. Все це робило систему абсолютно незамінною - перенесення всього цього функціоналу в 1С зайняв би купу часу і грошей.

З іншого боку, програма 1С-Підприємство обслуговувала тільки потреби бухгалтерії для ведення БО і НУ і здачі звітності. Таким чином, 1С була «відв'язана» від повсякденного функціонування фірми, а проведені документи заносилися в базу апостеріорі.

Чим хороша така схема? Плюсів можна виділити кілька:
- недопуск менеджерів та інших (без) відповідальних осіб в «святая святих» - бухгалтерську базу, яку повинні формувати тільки співробітники, що мають уявлення про предмет; акуратне ведення довідників,
- винесення з 1С за все, що не має до неї відношення: від управлінських завдань, які не вимагають відображення в бухобліку, до всяких інших моментів, які специфічні для фірми і до яких не повинні мати доступ сторонні,
- економія на ліцензіях: робочі місця 1С стоять помітних грошей,
- важливий момент: При впровадженні всього описаного вище додаткового функціоналу безпосередньо «всередину» 1С існує постійна необхідність в його доопрацюванні при виході оновлень продукту. Це, ясна річ, гарантує практично постійну зайнятість програмістів 1С, але це місце, де можна помітно заощадити.

Ну а жирний мінус, ясна річ, полягає в необхідності двічі проводити всі документи і поповнювати довідники.

Власне, в цьому і полягала основна задача - піти від подвійної роботи.

Спочатку потрібно розібратися з усякими довідниками - в першу голову, це довідник контрагентів і номенклатури. Проблема синхронізації довідників, настільки часто виникає в програмах такого роду, досить відпрацьована і зрозуміла в реалізації. Однак, в даному випадку було прийнято вольове рішення не використовувати 2 довідника зі взаємної синхронізацією, а мати один вихідний варіант - той, що заведений в MS Access, і просто реплицировать його в 1С ( зворотній зв'язок - це просто відмітка в MS Access, що дана позиція вже вивантажено).
Цей підхід сильно спрощує завдання. Для чисто бухгалтерських потреб потрібно зовсім небагато позицій в таких довідниках - і вони також заводяться у зовнішній програмі, щоб не порушувати сформульований принцип. Таким чином, можна прибрати ще одну часту проблему - безмірне роздування довідника використовуваної номенклатури. Нижче наведена товарна група «Монітори»

Завантаження подібного жаху в довідник 1С (а нові моделі моніторів з'являються мало не щотижня) можна налаштувати таким чином, що всі вони потрапляли в одну позицію, так як нюанси кольору рамки навколо екрану і кількості пікселів абсолютно несуттєві для бухобліку! Та й розмір діагоналі, якщо чесно - тим більше, якщо він відрізняється на півдюйма.

Далі, у зовнішній же програмі можна з набагато меншими втратами відпрацювати об'єднання дубльованих позицій в довідниках, особливо в довіднику контрагентів, так як в 1С це займає велику кількість зусиль.

Таким чином, в 1С вивантажуються тільки «рафіновані», очищені і наведені в належний вигляд дані. Вивантаження може проводитися з певною періодичністю - порционность дозволяє налагодити роботу бухгалтерії і уникнути зайвої роботи, якщо протягом дня (або більшого періоду) щось анулювалося, змінювалося, проводилося знову - всі ці речі відбуваються в робочій базі MS Access, і тільки «усталене »стан справ надходить в 1С. Плюс, такого роду вивантаження можна синхронізувати з операціями бекапа і завжди бути впевненим у правильності поточного стану 1С -ской бази.

Ясна річ, документи надходять без автоматичної проводки (хоча і це можна було б налаштувати). До речі, база MS Access сама перевіряє наявність необхідних товарів на складі - для списання в відвантаження (дилема - щоб переконатися, що накладна може бути виписана поточною датою, що всі необхідні для списання позиції є на складі - тобто закуплені або вироблені, - потрібно ... провести документ в 1С. Довіряти це менеджерам, мабуть, не варто - або ж за плечима менеджера завжди повинен стояти співробітник бухгалтерії)

Тепер про реалізацію. Програми 1С підтримують інтерфейс обміну даними через механізм ADO. З боку 1С використовується штатний програмний інтерфейс для створення елементів довідників і документів, так що робота цього механізму не залежить від внутрішньої подробиць реалізації 1С, які можуть змінюватися від версії до версії і від поновлення до оновлення. З іншого боку, головним гаслом розробки було «максимально використовувати можливості 1С, де це можливо». Тому в остаточній реалізації зв'язки з MS Access вантажилось тільки назва та ІПН контрагента - дані «підтягувалися» з довідників ЕГРЮЛ та ВП за допомогою вбудованого в 1С механізму (те ж саме відноситься до банківськими реквізитами - вони актуалізуються по БИК).

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

Схема вивантаження складається з двох етапів. Спершу вантажаться нові позиції довідників контрагентів і номенклатури. Просування 1С ідентифікатори GUID повертаються в MS Access, щоб при вивантаженні на другому етапі вже всіх документів ставити правильні прив'язки до довідників. Виглядає це так

Ми вважаємо, що подібну ідеологію побудови інформаційних систем можна взяти за основу не тільки в тих фірмах, де є успадковані НЕ-1С системи, але і при організації роботи нових юридичних осіб, Так як на MS Access у нас є великі напрацювання. Переваги такого підходу розписані вище.

У цій статті мова піде про налаштування прав доступу користувачів до об'єктів системи 1С.

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

Зверніть увагу! Ця стаття написана в допомогу програмістам. Налаштування прав в призначеному для користувача режимі на прикладі 1С Бухгалтерія розглянута в.

Роль визначає набір прав користувача, які він має. Механізм ролей дуже схожий на механізми прав Windows Active Directory. Для кожного з об'єктів (довідники, документи) розробник встановлює свій набір прав - читання / запис / додавання / зміна / ...

Доступні прав - сукупність всіх дозволів в ролях користувача.

Якщо відкрити об'єкт метаданих Роль, ми можемо побачити наступну картину:

У об'єкта є дві закладки - Права і Шаблони обмежень. Права - основна закладка, Шаблони - вкладка для налаштування прав на рівні запису в 1С ( RLS). Це дуже важлива тема, її я постараюся описати в майбутніх статтях.

Будемо розглядати тільки вкладку права.

  • об'єкти - список, на які будуть встановлюватися права.
  • права - список можливих для установки налаштувань прав.
  • Обмеження доступу до даних - поля ролі для настройки

Слід звернути увагу на галочки в нижній частині:

  • Встановлювати права для нових об'єктів - якщо прапорець встановлений у ролі, на нові об'єкти метаданих будуть автоматично встановлені дозволяють права. Рекомендую встановити, якщо Ви часто забуваєте встановити права на нові об'єкти.
  • Встановлювати права для реквізитів і табличних частин за замовчуванням- прапор, при установці якого реквізити і табличні частини наслідуватимуть права власника (довідника, документа і т.д.)
  • Незалежні права підлеглих об'єктів - якщо прапорець встановлений, то система при визначенні права на об'єкт конфігурації врахує права на батьківський об'єкт

Налаштування прав на всю конфігурацію

Якщо відкрити Роль і клікнути на корінь конфігурації, ми побачимо наступне:

Детальніше про кожного з прав на всю конфігурацію:

Отримайте 267 відеоуроків по 1С безкоштовно:

  • адміністрування - адміністрування інформаційної бази (Потрібна наявність права «Адміністрування даних»)
  • адміністрування даних - право на адміністративні дії над даними
  • Оновлення конфігурації бази даних - право на
  • монопольний режим - використання монопольного режиму
  • активні користувачі - перегляд списку активних користувачів
  • - журнал реєстрації
  • - право запуску тонкого клієнта
  • - право запуску веб-клієнта
  • товстий клієнт - право участі запуску товстого клієнта
  • Зовнішнє з'єднання - право запуску зовнішнього з'єднання
  • Automation - право на використання automation
  • Режим «Все функції» - в режимі керованого застосування
  • Збереження даних користувача - дозвіл або заборона на збереження даних користувача (налаштувань, обраного, історії). Особливо актуально для 1С керованих форм.
  • Інтерактивне відкриття зовнішніх обробок - відкриття зовнішніх обробок
  • Інтерактивне відкриття зовнішніх звітів - відкриття зовнішніх звітів
  • висновок - висновок на друк, запис і копіювання в буфер обміну

Налаштування прав 1С 8.2 на інші об'єкти метаданих

Для інших основних об'єктів (довідники, константи, документи, регістри ...), набір прав у ролі досить стандартний:

  • читання - читання (програмне)
  • Додавання - додавання (програмне)
  • зміна - зміна (програмне)
  • видалення - видалення (програмне)
  • Перегляд - перегляд
  • Інтерактивне додавання - інтерактивне додавання
  • редагування - редагування
  • Інтерактивна позначка видалення - інтерактивна позначка на видалення
  • Інтерактивне зняття позначки видалення - зняття позначки на видалення
  • Інтерактивне видалення позначених- видалення позначених об'єктів
  • Введення по рядку - використання режиму введення по рядку
  • Інтерактивне видалення - безпосереднє видалення (shift + del)

Права тільки для документів:

  • Інтерактивне проведення - проведення
  • скасування проведення - скасування проведення документів
  • Інтерактивне проведення неоперативне - проведення (стандартними командами форм) документа в неоперативне режимі
  • Інтерактивна скасування проведення - інтерактивна скасування проведення
  • Інтерактивне зміна проведених - редагування проведеного документа. Якщо право у ролі не встановлено, то користувач не може видалити проведений документ, встановити позначку видалення, перепровести або зробити непроведеним. Форма такого документа відкривається в режимі перегляду

P.S. Якщо у Вас все ж не вийшло розібратися в ролях користувачів, Ви можете замовити.
Відео з прикладом настройки прав в 1С бухгалтерії 3.0:

Поділитися