С помощью конфигурации 1С:Конвертация данных, ред. 2.1 можно выполнить настройку самых разных переносов - это очень гибкий инструмент, пожалуй самый популярный для разработки разовых обменов. В этой статье мы рассмотрим методику реализации переноса данных пользователей одной информационной базы в другую.
Задача
Требуется выполнить перенос списка пользователей информационной базы (с сохраненными паролями, ролями). Информационные базы, между которыми выполняется перенос имеют одинаковую конфигурацию - в обоих есть справочник «Пользователи», наименование в котором совпадает с именем пользователя информационной базы. Если пользователь не найден в списке пользователей ИБ - переносить его не нужно.
Решение
Для переноса списка пользователей информационной базы используем в качестве источника данных произвольный алгоритм. В этом алгоритме мы получим список пользователей, передадим его правилу конвертации объектов, при выгрузке запишем дополнительную информацию, а при загрузке - прочитаем эти данные и создадим нового пользователя информационной базы.
Подготовительные действия
Установим 1С:Конвертация данных, ред. 2.1, выгрузим метаданные исходной конфигурации с помощью обработки MD82Exp.epf (MD83Exp.epf - для управляемых форм) и загрузим в справочник "Конфигурации".
![Выгрузка метаданных Выгрузка метаданных](/images/blog/export_metadata.png)
![Загрузка метаданных Загрузка метаданных](/images/blog/import_metadata.png)
Откроем форму "Настройка правил обмена данными" и создадим новую конвертацию. В качестве источника и приемника укажем нашу загруженную конфигурацию. При записи конвертации программа предложит автоматически создать все возможные правила. Откажемся от предложения - все правила будут создаваться вручную.
Правило выгрузки
Создадим правило выгрузки данных, способ выборки - «Произвольный алгоритм», код (имя) правила - "ПользователиИБ", наименование - "Пользователи информационной базы", правило конвертации пока указывать не будем - вернемся к нему позже.
![Правило выгрузки данных Правило выгрузки данных](/images/blog/export_rule.png)
Перейдем на закладку «Основная» и в обработчике «Перед выгрузкой» напишем следующий текст:
ВыборкаДанных = Новый ТаблицаЗначений; ВыборкаДанных.Колонки.Добавить("Наименование"); КоллекцияПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();Для каждого ПользовательИБ Из КоллекцияПользователей Цикл НоваяСтрока = ВыборкаДанных.Добавить(); НоваяСтрока.Наименование = ПользовательИБ.УникальныйИдентификатор;КонецЦикла;В этом алгоритме мы создаем таблицу значений с единственной колонкой - «Наименование», в которой будет храниться имя пользователя ИБ. Запишем правило.
Правило конвертации
Перейдем на закладку «Правила конвертации объектов» и создадим новое правило - «Пользователи». В карточке правила перейдем на закладку «Настройки» и снимем флажок «Искать объект приемника по внутреннему идентификатору объекта источника». На самом деле переноситься будет не справочник пользователей, а список пользователей информационной базы, т.к. мы подменили источник выборки. Запишем правило, вернемся к правилу выгрузки данных и укажем его в реквизите «Правило конвертации».
![ПКО Пользователи ПКО Пользователи](/images/blog/export_rule_param.png)
Для правила конвертации объектов «Пользователи» создадим правило конвертации свойств «Наименование», установим флажок «Поиск объекта при загрузке по свойству», запишем.
Вновь откроем карточку правила конвертации «Пользователи». Сейчас нам предстоит поработать с файлом выгрузки - программно создать подчиненный узел с информацией о пользователе ИБ при выгрузке, а при загрузке его прочитать и записать в информационную базу.
Перейдем на закладку «Обработчики событий», вкладка «При выгрузке» и напишем следующий программный код:
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Источник.Наименование));Если ПользовательИБ <> Неопределено Тогда// Данные пользователя ИБ Описание = Новый Структура("Имя,ПолноеИмя,АутентификацияOpenID,АутентификацияОС,АутентификацияСтандартная, |ЗапрещеноИзменятьПароль,ЗащитаОтОпасныхДействий,ОсновнойИнтерфейс,СохраняемоеЗначениеПароля,ПоказыватьВСпискеВыбора, |ПользовательОС,РежимЗапуска,УникальныйИдентификатор,Язык,Роли"); ЗаполнитьЗначенияСвойств(Описание, ПользовательИБ,, "ОсновнойИнтерфейс,ЗащитаОтОпасныхДействий,РежимЗапуска,Язык,Роли"); Описание.ОсновнойИнтерфейс = ?(ПользовательИБ.ОсновнойИнтерфейс = Неопределено, "", ПользовательИБ.ОсновнойИнтерфейс.Имя); Описание.РежимЗапуска = ?(ПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.Авто, "Авто", ?(ПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение, "ОбычноеПриложение", "УправляемоеПриложение")); Описание.Язык = ?(ПользовательИБ.Язык = Неопределено, "", ПользовательИБ.Язык.Имя); Описание.ЗащитаОтОпасныхДействий = ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях; ПереченьРолей = "";Для каждого Роль Из ПользовательИБ.Роли Цикл ПереченьРолей = ПереченьРолей + ?(ПустаяСтрока(ПереченьРолей), "", ",")+ Роль.Имя;КонецЦикла; Описание.Роли = ПереченьРолей;// Формирование подчиненного узла ИнформацияОПользователе = СоздатьУзел("ИнформацияОПользователе");Для каждого КлючИЗначение ИЗ Описание Цикл УстановитьАтрибут(ИнформацияОПользователе, КлючИЗначение.Ключ, КлючИЗначение.Значение);КонецЦикла; ДобавитьПодчиненный(Приемник, ИнформацияОПользователе);КонецЕсли;
Здесь мы программно создаем подчиненный узел с информацией о пользователе информационной базы - режим запуска, язык, пароль, роли и пр.
В обработчике «Перед загрузкой» прочитаем информацию о пользователе и запишем его в список пользователей информационной базы.
Пока ФайлОбмена.Прочитать() Цикл ИмяУзла = ФайлОбмена.ЛокальноеИмя; ТипУзла = ФайлОбмена.ТипУзла;Если ИмяУзла = "ИнформацияОПользователе" И (ТипУзла = одТипУзлаXML_НачалоЭлемента) Тогда ИмяПользователя = одАтрибут(ФайлОбмена, одТипСтрока, "Имя"); Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);Если Пользователь = Неопределено Тогда Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя(); Пользователь.Имя = ИмяПользователя; Пользователь.ПолноеИмя = одАтрибут(ФайлОбмена, одТипСтрока, "ПолноеИмя"); Пользователь.АутентификацияOpenID = одАтрибут(ФайлОбмена, одТипБулево, "АутентификацияOpenID"); Пользователь.АутентификацияОС = одАтрибут(ФайлОбмена, одТипБулево, "АутентификацияОС"); Пользователь.АутентификацияСтандартная = одАтрибут(ФайлОбмена, одТипБулево, "АутентификацияСтандартная"); Пользователь.ЗапрещеноИзменятьПароль = одАтрибут(ФайлОбмена, одТипБулево, "ЗапрещеноИзменятьПароль"); Пользователь.ПоказыватьВСпискеВыбора = одАтрибут(ФайлОбмена, одТипБулево, "ПоказыватьВСпискеВыбора"); Пользователь.СохраняемоеЗначениеПароля = одАтрибут(ФайлОбмена, одТипСтрока, "СохраняемоеЗначениеПароля"); Пользователь.ПользовательОС = одАтрибут(ФайлОбмена, одТипСтрока, "ПользовательОС"); Пользователь.РежимЗапуска = РежимЗапускаКлиентскогоПриложения[одАтрибут(ФайлОбмена, одТипСтрока, "РежимЗапуска")];// Защита от опасных действий ЗащитаОтОпасныхДействий = Новый ОписаниеЗащитыОтОпасныхДействий; ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = одАтрибут(ФайлОбмена, одТипБулево, "ЗащитаОтОпасныхДействий"); Пользователь.ЗащитаОтОпасныхДействий = ЗащитаОтОпасныхДействий;// Основной интерфейс Свойство = одАтрибут(ФайлОбмена, одТипСтрока, "ОсновнойИнтерфейс");Если ЗначениеЗаполнено(Свойство) Тогда Интерфейс = Метаданные.Интерфейсы.Найти(Свойство);Если Интерфейс <> Неопределено Тогда Пользователь.ОсновнойИнтерфейс = Интерфейс;КонецЕсли;КонецЕсли;// Язык Свойство = одАтрибут(ФайлОбмена, одТипСтрока, "Язык");Если ЗначениеЗаполнено(Свойство) Тогда Язык = Метаданные.Языки.Найти(Свойство);Если Язык <> Неопределено Тогда Пользователь.Язык = Язык;КонецЕсли;КонецЕсли;// Роли ПереченьРолей = одАтрибут(ФайлОбмена, одТипСтрока, "Роли"); КоллекцияРолей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПереченьРолей, ",");Для каждого ИмяРоли Из КоллекцияРолей Цикл Роль = Метаданные.Роли.Найти(ИмяРоли);Если Роль <> Неопределено Тогда Пользователь.Роли.Добавить(Роль);КонецЕсли;КонецЦикла; Пользователь.Записать();КонецЕсли;ИначеЕсли (ИмяУзла = "ИнформацияОПользователе") И (ТипУзла = одТипУзлаXML_КонецЭлемента) ТогдаПрервать;КонецЕсли;КонецЦикла;
Таким несложным образом мы перенесли все данные о пользователях информационной базы в новую программу.
В дальнейшем пример можно усложнить, например - передавать не только справочник «Пользователи», но и профили прав доступа, значения групп доступа, пользователей информационной базы и т.д.