Удмуртская Республика, г. Ижевск
Поиск
Войти
Заказать звонок

Перенос пользователей ИБ с помощью 1С:Конвертации данных

2 ноя 2017
#Методика
#Программирование
Методика переноса списка пользователей из одной информационной базы в другую с помощью конфигурации 1С:Конвертация данных, ред. 2.1 (с паролями, списком ролей, другими настройками)

С помощью конфигурации 1С:Конвертация данных, ред. 2.1 можно выполнить настройку самых разных переносов - это очень гибкий инструмент, пожалуй самый популярный для разработки разовых обменов. В этой статье мы рассмотрим методику реализации переноса данных пользователей одной информационной базы в другую.

Задача

Требуется выполнить перенос списка пользователей информационной базы (с сохраненными паролями, ролями). Информационные базы, между которыми выполняется перенос имеют одинаковую конфигурацию - в обоих есть справочник «Пользователи», наименование в котором совпадает с именем пользователя информационной базы. Если пользователь не найден в списке пользователей ИБ - переносить его не нужно.

Решение

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

Подготовительные действия

Установим 1С:Конвертация данных, ред. 2.1, выгрузим метаданные исходной конфигурации с помощью обработки MD82Exp.epf (MD83Exp.epf - для управляемых форм) и загрузим в справочник "Конфигурации".

Выгрузка метаданных
Загрузка метаданных

Откроем форму "Настройка правил обмена данными" и создадим новую конвертацию. В качестве источника и приемника укажем нашу загруженную конфигурацию. При записи конвертации программа предложит автоматически создать все возможные правила. Откажемся от предложения - все правила будут создаваться вручную.

Правило выгрузки

Создадим правило выгрузки данных, способ выборки - «Произвольный алгоритм», код (имя) правила - "ПользователиИБ", наименование - "Пользователи информационной базы", правило конвертации пока указывать не будем - вернемся к нему позже.

Правило выгрузки данных

Перейдем на закладку «Основная» и в обработчике «Перед выгрузкой» напишем следующий текст:

ВыборкаДанных = Новый ТаблицаЗначений;
ВыборкаДанных.Колонки.Добавить("Наименование");

КоллекцияПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();

Для каждого ПользовательИБ Из КоллекцияПользователей Цикл

    НоваяСтрока = ВыборкаДанных.Добавить();
    НоваяСтрока.Наименование = ПользовательИБ.УникальныйИдентификатор;
    
КонецЦикла;
В этом алгоритме мы создаем таблицу значений с единственной колонкой - «Наименование», в которой будет храниться имя пользователя ИБ. Запишем правило.

Правило конвертации

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

ПКО Пользователи

Для правила конвертации объектов «Пользователи» создадим правило конвертации свойств «Наименование», установим флажок «Поиск объекта при загрузке по свойству», запишем.

Вновь откроем карточку правила конвертации «Пользователи». Сейчас нам предстоит поработать с файлом выгрузки - программно создать подчиненный узел с информацией о пользователе ИБ при выгрузке, а при загрузке его прочитать и записать в информационную базу.

Перейдем на закладку «Обработчики событий», вкладка «При выгрузке» и напишем следующий программный код:

ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Источник.Наименование));

Если ПользовательИБ <> Неопределено Тогда

    // Данные пользователя ИБ
    Описание = Новый Структура("Имя,ПолноеИмя,АутентификацияOpenID,АутентификацияОС,АутентификацияСтандартная,
        |ЗапрещеноИзменятьПароль,ЗащитаОтОпасныхДействий,ОсновнойИнтерфейс,СохраняемоеЗначениеПароля,ПоказыватьВСпискеВыбора,
        |ПользовательОС,РежимЗапуска,УникальныйИдентификатор,Язык,Роли");
        
    ЗаполнитьЗначенияСвойств(Описание, ПользовательИБ,, "ОсновнойИнтерфейс,ЗащитаОтОпасныхДействий,РежимЗапуска,Язык,Роли");
    
    Описание.ОсновнойИнтерфейс          = ?(ПользовательИБ.ОсновнойИнтерфейс = Неопределено, "", ПользовательИБ.ОсновнойИнтерфейс.Имя);
    Описание.РежимЗапуска               = ?(ПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.Авто, "Авто", ?(ПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение, "ОбычноеПриложение", "УправляемоеПриложение"));
    Описание.Язык                       = ?(ПользовательИБ.Язык = Неопределено, "", ПользовательИБ.Язык.Имя);
    Описание.ЗащитаОтОпасныхДействий    = ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях;
    
    ПереченьРолей = "";
    Для каждого Роль Из ПользовательИБ.Роли Цикл
    
        ПереченьРолей = ПереченьРолей + ?(ПустаяСтрока(ПереченьРолей), "", ",") 
            + Роль.Имя;
    
    КонецЦикла;
        
    Описание.Роли = ПереченьРолей;
    
    // Формирование подчиненного узла
    ИнформацияОПользователе = СоздатьУзел("ИнформацияОПользователе");
    
    Для каждого КлючИЗначение ИЗ Описание Цикл
        
        УстановитьАтрибут(ИнформацияОПользователе, КлючИЗначение.Ключ, КлючИЗначение.Значение);
        
    КонецЦикла;
    
    ДобавитьПодчиненный(Приемник, ИнформацияОПользователе);
    
КонецЕсли; 

Здесь мы программно создаем подчиненный узел с информацией о пользователе информационной базы - режим запуска, язык, пароль, роли и пр.

В обработчике «Перед загрузкой» прочитаем информацию о пользователе и запишем его в список пользователей информационной базы.

 Пока ФайлОбмена.Прочитать() Цикл
 
    ИмяУзла = ФайлОбмена.ЛокальноеИмя; 
    ТипУзла = ФайлОбмена.ТипУзла; 
    
    Если ИмяУзла = "ИнформацияОПользователе" И (ТипУзла = одТипУзлаXML_НачалоЭлемента) Тогда
        
        ИмяПользователя = одАтрибут(ФайлОбмена, одТипСтрока, "Имя");
        
        Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
        
        Если Пользователь = Неопределено Тогда
            
            Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
            
            Пользователь.Имя                        = ИмяПользователя;
            Пользователь.ПолноеИмя                  = одАтрибут(ФайлОбмена, одТипСтрока, "ПолноеИмя");
            Пользователь.АутентификацияOpenID       = одАтрибут(ФайлОбмена, одТипБулево, "АутентификацияOpenID");
            Пользователь.АутентификацияОС           = одАтрибут(ФайлОбмена, одТипБулево, "АутентификацияОС");
            Пользователь.АутентификацияСтандартная  = одАтрибут(ФайлОбмена, одТипБулево, "АутентификацияСтандартная");
            Пользователь.ЗапрещеноИзменятьПароль    = одАтрибут(ФайлОбмена, одТипБулево, "ЗапрещеноИзменятьПароль");
            Пользователь.ПоказыватьВСпискеВыбора    = одАтрибут(ФайлОбмена, одТипБулево, "ПоказыватьВСпискеВыбора");
            Пользователь.СохраняемоеЗначениеПароля  = одАтрибут(ФайлОбмена, одТипСтрока, "СохраняемоеЗначениеПароля");
            Пользователь.ПользовательОС             = одАтрибут(ФайлОбмена, одТипСтрока, "ПользовательОС");
            Пользователь.РежимЗапуска               = РежимЗапускаКлиентскогоПриложения[одАтрибут(ФайлОбмена, одТипСтрока, "РежимЗапуска")];
            
            // Защита от опасных действий
            ЗащитаОтОпасныхДействий = Новый ОписаниеЗащитыОтОпасныхДействий;
            ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = одАтрибут(ФайлОбмена, одТипБулево, "ЗащитаОтОпасныхДействий");
            
            Пользователь.ЗащитаОтОпасныхДействий = ЗащитаОтОпасныхДействий;
            
            // Основной интерфейс
            Свойство = одАтрибут(ФайлОбмена, одТипСтрока, "ОсновнойИнтерфейс");             
            Если ЗначениеЗаполнено(Свойство) Тогда
                
                Интерфейс = Метаданные.Интерфейсы.Найти(Свойство);
                
                Если Интерфейс <> Неопределено Тогда
                    
                    Пользователь.ОсновнойИнтерфейс = Интерфейс;
                    
                КонецЕсли;
                
            КонецЕсли;    
            
            // Язык
            Свойство = одАтрибут(ФайлОбмена, одТипСтрока, "Язык");
            
            Если ЗначениеЗаполнено(Свойство) Тогда
                
                Язык = Метаданные.Языки.Найти(Свойство);
                
                Если Язык <> Неопределено Тогда
                    
                    Пользователь.Язык = Язык;
                    
                КонецЕсли;
                
            КонецЕсли;    
            
            // Роли
            ПереченьРолей = одАтрибут(ФайлОбмена, одТипСтрока, "Роли");            
            КоллекцияРолей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПереченьРолей, ",");
            
            Для каждого ИмяРоли Из КоллекцияРолей Цикл
                
                Роль = Метаданные.Роли.Найти(ИмяРоли);
                
                Если Роль <> Неопределено Тогда
                    
                    Пользователь.Роли.Добавить(Роль);
                    
                КонецЕсли;
                
            КонецЦикла;
            
            Пользователь.Записать();
            
        КонецЕсли;         
        
    ИначеЕсли (ИмяУзла = "ИнформацияОПользователе") И (ТипУзла = одТипУзлаXML_КонецЭлемента) Тогда
        
        Прервать;
        
    КонецЕсли;
    
КонецЦикла;

Таким несложным образом мы перенесли все данные о пользователях информационной базы в новую программу.

В дальнейшем пример можно усложнить, например - передавать не только справочник «Пользователи», но и профили прав доступа, значения групп доступа, пользователей информационной базы и т.д.