Как выгрузить данные из 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 если функция потерпела неудачу Функция СоздатьФайлАксес(Знач ИмяФайла, Знач ПерезаписыватьФайл = Истина ) //Проверим валидность имени файла Если ПустаяСтрока(ИмяФайла) Тогда Возврат - 2 ; Иначе //анализ нахождения файла на диске Если ПерезаписыватьФайл Тогда Файл = Новый Файл(ИмяФайла) ; Если Файл. Существует() Тогда Файл = Неопределено ; УдалитьФайлы(ИмяФайла) ; КонецЕсли ; КонецЕсли ; КонецЕсли ; Состояние(" Создаётся файл access: " + ИмяФайла) ; //создаём оболочку БД Попытка АДОХ = Новый COMОбъект(" ADOX. Catalog " ) ; Исключение Сообщить(" " + Символы. ПС + ОписаниеОшибки() ) ; КонецПопытки ; //Подключение к только что созданной БД СтрокаПодключения = " Provider" " " + ИмяФайла + " " " " ; //подключаемся Попытка АДОХ. Create(СтрокаПодключения) ; Исключение Сообщить(" Не удалось сформировать файл с данными. При создании объекта ADOX. Catalog произошла ошибка! " + Символы. ПС + ОписаниеОшибки() ) ; Возврат - 1 ; КонецПопытки ; АДОХ. ActiveConnection. Close() ; АДОХ = Неопределено ; Возврат 0 ; КонецФункции

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

  1. Имя файла будущей БД - строка. Это полный путь к файлу, если его не передать, процедура завершит работу.
  2. Перезаписывать файл - булево. Это булево флажок, который использует механизм перезаписи файла.

Сначала выполняется проверка полного имени файла. Дальше отрабатывает механизм перезаписи файла. В случае необходимости существующий файл удаляется. После чего процедура переходит к созданию пустого файла БД. Делается это с помощью объекта ADOX.Catalog . Для разбора тонкостей работы ADOX.Catalog рекомендую поискать соответствующую информацию на сайте Microsoft.

Вторая «шестерёнка» механизма выгрузки в access реализует создание таблицы в файле БД. Для создания таблиц используется всё тот же объект ADOX.Catalog.

Исходный код процедуры создания новой таблицы в БД:

//Параметр 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 , 0 , ТекЗначение) ; СписокПолей = СписокПолей + Формат(ТекЗначение, " ЧН= null ; ЧГ= " ) + " , 5 " Тогда //число дробное //преобразуем null к 0 потому как дальнейшая функция Формат() не преобразует его правильно ТекЗначение = ? (ТекЗначение = null , 0 , ТекЗначение) ; СписокПолей = СписокПолей + Формат(ТекЗначение, " ЧРД= . ; ЧН= null ; ЧГ= " ) + " , " + Символы. ПС; ИначеЕсли ОписаниеПоля. Тип = " 7 " Тогда //дата ТекЗначение = ? (ТекЗначение = null , "00010101 " , ТекЗначение) ; Если ТекЗначение = "00010101 " Тогда МодЗначение = " null " ; Иначе МодЗначение = " " " + Формат(ТекЗначение, " ДЛФ= DT " ) + " " " ; КонецЕсли ; СписокПолей = СписокПолей + МодЗначение + " , " + Символы. ПС; ИначеЕсли ОписаниеПоля. Тип = " 11 " Тогда //булево ТекЗначение = ? (ТекЗначение = null , Ложь , ТекЗначение) ; СписокПолей = СписокПолей + Формат(ТекЗначение, " БЛ= false ; БИ= true " ) + " , " + Символы. ПС; ИначеЕсли ОписаниеПоля. Тип = " 202 " Тогда //строка ТекЗначение = ? (ТекЗначение = null , " " , ТекЗначение) ; ЗначениеСтрокой = Лев(ТекЗначение, 255 ) ; Если ПустаяСтрока(ЗначениеСтрокой) Тогда СписокПолей = СписокПолей + " null , " + Символы. ПС; Иначе МодЗначение = СтрЗаменить(ЗначениеСтрокой, " " " , " " + chr( ) + " " ) ; СписокПолей = СписокПолей + " " " + СокрЛП(Лев(МодЗначение, 255 ) ) + " ", " + Символы. ПС КонецЕсли ; ИначеЕсли ОписаниеПоля. Тип = " 203 " Тогда //строка Если ПустаяСтрока(ЗначениеСтрокой) Тогда СписокПолей = СписокПолей + " null , " + Символы. ПС; Иначе МодЗначение = СтрЗаменить(ТекЗначение, " " " , " " + chr( " + КодСимвола(" " " ) + " ) + " " ) ; СписокПолей = СписокПолей + " " " + МодЗначение + " ", " + Символы. ПС КонецЕсли ; КонецЕсли ; СчётчикКолонок = СчётчикКолонок + 1 ; КонецЦикла ; //обрезаем последнюю запятую СписокПолей = Лев(СписокПолей, СтрДлина(СписокПолей) - 2 ) ; ТекстЗапроса = " INSERT INTO " + ОписаниеТаблицы. ИмяТаблицы + " VALUES ( " + СписокПолей + " ) " ; Ком. CommandText = ТекстЗапроса; Попытка Ком. Execute () ; Исключение Сообщить(" Ошибка записи данных! " + Символы. ПС + " Текст запроса: " + ТекстЗапроса + Символы. ПС + ОписаниеОшибки() ) ; Возврат - 2 ; КонецПопытки ; КонецЦикла ; //закрываем подключение Ком. ActiveConnection. Close() ; Ком = Неопределено ; Коннектор = Неопределено ; Возврат 0 ; КонецФункции

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

  1. СтруктураОписанияТаблицы - структура содержащая описание самой таблицы и её полей. Формируется вспомогательной функцией, которую я приведу ниже.
  2. ИмяФайла - строка имя файла БД.
  3. УдалятьСуществующуюТаблицу - флажок, определяющий поведение функции в отношении уже существующих одноименных таблиц.

Получив управление, функция открывает файл БД. При удачном подключении создается объект «ADOX.Catalog» (каталог таблиц), который в первую очередь проверяет существование таблицы в соответствии с параметром функции №3. Следующим действием создаётся новая таблица. К таблице добавляется ключевое поле (индекс). Далее на основании параметра функции №2 создаются поля таблицы соответствующих типов. По завершении вновь созданная таблица добавляется в каталог и соединение закрывается.

Разумеется вручную собирать параметр функции №2 достаточно трудоёмко, для облегчения я написал функцию, которая на основании таблицы значений с данными формирует структуру описания таблицы.

Исходный код функции составление структуры описания полей:

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

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

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

Первоначально создается структура с описанием самой БД, после чего добавляется массив, который буде содержать в себе другие структуры с описанием полей. В процессе цикла по колонкам таблицы значений заполняется массив описания полей. Структура описания поля содержит 4 основных свойства:

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

Закончив формирование структуры, оная возвращается.

Наконец можно переходить к функции записывающей данные в таблицу БД. В этой функции, можно сказать, сосредоточено ядро функционала всего механизма. Таким образом, данная функция является самой сложной, но это не должно вас пугать. Программист потому и программист, что развивает аналитический склад ума.

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

//функция вносит данные в таблицу //Параметр 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 неограниченная строка

В этой статье речь пойдет о настройке прав доступа пользователей к объектам системы 1С.

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

Обратите внимание! Эта статья написана в помощь программистам. Настройка прав в пользовательском режиме на примере 1С Бухгалтерия рассмотрена в .

Роль определяет набор прав пользователя, которые он имеет. Механизм ролей очень похож на механизмы прав Windows Active Directory. Для каждого из объектов (справочники, документы) разработчик устанавливает свой набор прав — чтение/запись/добавление/изменение/…

Набор доступных прав — совокупность всех разрешений в ролях пользователя .

Если открыть объект метаданных Роль, мы можем увидеть следующую картину:

У объекта есть две закладки — Права и Шаблоны ограничений. Права — основная закладка, Шаблоны — вкладка для настройки прав на уровне записи в 1С (RLS ). Это очень важная тема, её я постараюсь описать в будущих статьях.

Будем рассматривать только вкладку Права .

  • Объекты — список , на которые будут устанавливаться права.
  • Права — список возможных для установки настроек прав.
  • Ограничение доступа к данным — поля роли для настройки

Следует обратить внимание на галочки в нижней части:

  • Устанавливать права для новых объектов — если флаг установлен у роли, на новые объекты метаданных будут автоматически установлены разрешающие права. Рекомендую установить, если Вы часто забываете установить права на новые объекты.
  • Устанавливать права для реквизитов и табличных частей по умолчанию — флаг, при установке которого реквизиты и табличные части будут наследовать права владельца(справочника, документа и т.д.)
  • Независимые права подчиненных объектов — если флаг установлен, то система при определении права на объект конфигурации учтёт права на родительский объект

Настройки прав на всю конфигурацию

Если открыть Роль и кликнуть на корень конфигурации, мы увидим следующие настройки:

Подробнее о каждом из прав на всю конфигурацию :

Получите 267 видеоуроков по 1С бесплатно:

  • Администрирование — администрирование информационной базы (требуется наличие права «Администрирование данных»)
  • Администрирование данных — право на административные действия над данными
  • Обновление конфигурации базы данных — право на
  • Монопольный режим — использование монопольного режима
  • Активные пользователи — просмотр списка активных пользователей
  • — журнал регистрации
  • — право запуска тонкого клиента
  • — право запуска веб-клиента
  • Толстый клиент — право роли запуска толстого клиента
  • Внешнее соединение — право запуска внешнего соединения
  • Automation — право на использование automation
  • Режим «Все функции» — в режиме управляемого приложения
  • Сохранение данных пользователя — разрешение или запрет на сохранение данных пользователя (настроек, избранного, истории). Особенно актуально для 1С управляемых форм.
  • Интерактивное открытие внешних обработок — открытие внешних обработок
  • Интерактивное открытие внешних отчетов — открытие внешних отчетов
  • Вывод — вывод на печать, запись и копирование в буфер обмена

Настройка прав 1С 8.2 на другие объекты метаданных

Для остальных основных объектов (справочники, константы, документы, регистры…), набор прав у роли достаточно стандартен:

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

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

  • Интерактивное проведение — проведение
  • Отмена проведения — отмена проведения документов
  • Интерактивное проведение неоперативное — проведение (стандартными командами форм) документа в неоперативном режиме
  • Интерактивная отмена проведения — интерактивная отмена проведения
  • Интерактивное изменение проведенных — редактирование проведенного документа. Если право у роли не установлено, то пользователь не может удалить проведенный документ, установить пометку удаления, перепровести или сделать непроведенным. Форма такого документа открывается в режиме просмотра

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

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

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

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

Я долго думал в каком ключе написать эту заметку. В итоге остановился на самом простом варианте – привести код моего решения. Пускай он не сильно оптимальный, но для большинства задач его более, чем достаточно.

Итак, начнем все рассматривать по порядку. Создаем новую обработку и кидаем на нее единственный компонент – «ТабличноеПоле». Я растянул этот компонент по всей форме. В итоге моя форма приобрела вид как на рисунке 1.


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

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

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

Понравилось? Лайкни нас на Facebook