Данный прием широко использовался для переноса информации из конфигурации «Бухгалтерский учет» в конфигурацию «Зарплата и управление персоналом 2.5».
Конфигурация, из которой предполагалось перенести данные, некогда была типовой конфигурацией бухгалтерского учета. За длительное время эксплуатации она непрерывно дорабатывалась под нужды предприятия. На момент переноса ее структура метаданных существенно отличалась от типовой. Было принято решение не искать готовые обработки по переносу, а воспользоваться конфигурацией конвертации данных и разработать правила переноса самостоятельно.
Сложность задачи состояла в том, что база данных источника и приемника сильно отличаются по структуре. Во многих случаях простое сопоставление объектов и их реквизитов не подходило.
Вот несколько примеров правил конвертации, которые пришлось разработать:
Отмечу, что предварительно были разработаны простые правила конвертации, для объектов которые можно было сопоставить в источнике и приемнике.
Пример1: Генерация документа «ПриемНаРаботуВОрганизацию»
В источнике присутствует документ «ПриказОПриемеНаРаботу» но ни одного документа не заполнено. В приемнике документ «ПриемНаРаботуВОрганизацию» имеет несколько табличных частей, которые надо заполнить информацией по работникам и основным начислениям. Необходимо было извлечь информацию из справочника «Сотрудники» исходной конфигурации и поместить в соответствующие табличные части документа «ПриемНаРаботуВОрганизацию» конфигурации приемника. Т.е. на выходе у нас должен сформироваться один документ «ПриемНаРаботуВОрганизацию» содержащий информацию о всех сотрудниках. Как инициировать создание одного документа в приемнике? Применили искусственный прием: в событии «Перед обработкой» правила выгрузки данных разместили код:
Данный код, размещенный в правиле выгрузки данных, спровоцирует выгрузку одного объекта, которого на самом деле нет в источнике.
Правило конвертации объектов настроили следующим образом:
В правилах конвертации свойств добавили две группы в соответствии с количеством табличных частей приемника, которые мы хотели заполнить.
В обработчике события «ПередВыгрузкой» правила конвертации группы свойств создали таблицу значений со структурой соответствующей структуре информации, которую необходимо передать в приемник. Циклом по справочнику «Сотрудники» заполнили эту таблицу и передали ее параметру «КоллекцияОбъектов».
Внутри группы для каждого передаваемого реквизита создали правило конвертации свойств и в обработчике «Перед выгрузкой» разместили код:
Значение = ОбъектКоллекции.ИмяКолонкиТаблицыЗначений
Где ИмяКолонкиТаблицыЗначений – имя колонки таблицы, которую мы создали в ПКГС.
После того как мы сопоставили все передаваемые реквизиты правила конвертации свойств выглядели так:
Далее разработали правила для заполнения табличной части «ОсновныеНачисления» в приемнике. Напомню, что видов расчета и исходной конфигурации нет. В справочнике «Сотрудники» конфигурации-источника есть информация об окладе, ставке и надбавках.
Чтобы выполнить сопоставление - нашли в конфигурации-приемнике виды расчета соответствующие окладу и видам надбавок, добавили недостающие. Запомнили их коды. Далее в обработчике «Перед обработкой» правила конвертации группы свойств, для табличной части «Основные начисления» разместили код:
Далее по аналогии создали правила конвертации свойств, для нужных реквизитов.
Пример 2: Перенос информации о лицевых счетах сотрудников в банке
Организация перечисляет зарплату сотрудникам в банк для последующего зачисления на пластиковые карточки. Сотрудники имеют лицевые счета в различных банках. Сведения о лицевых счетах в источнике содержаться в справочнике «Сотрудники» в виде нескольких реквизитов.
В конфигурации-приемнике есть документ «ЗаявкаНаОткрытиеСчетов» в реквизитах которого указан банк а в табличной части список сотрудников, которые имеют счет в этом банке. Задача состоит в том, чтобы взять информацию из справочника в источнике и разложить ее в несколько (по количеству банков) документов в приемнике. Порядок действий:
1) Создаем правило выгрузки данных в котором описываем таблицу значений с одной колонкой. Добавляем в таблицу значений количество строк равное количеству банков. И присваиваем таблицу значений параметру «ВыборкаДанных».
2) Создаем правило конвертации объектов, правила конвертации свойств и правила конвертации группы свойств:
3) В обработчике события «Перед выгрузкой» правила конвертации группы свойств формируем таблицу значений со структурой аналогичной структуре табличной части приемника:
4) Далее аналогично примеру 1.
Пример 3: Перенос информации об изменении окладов
Данная информация необходима для расчета среднего заработка. В источнике данная информация представлена периодическим реквизитом «Оклад» справочника «Сотрудники». В приемник ее можно перенести через документ «Кадровое перемещение организации» в котором есть табличная часть «ОсновныеНачисления», содержащая информацию о составе и размере начислений для каждого работника. Обычно изменение окладов в организации происходит одновременно для всех работников. Просматривая реквизит Сотрудники.Оклад можно получить даты изменения окладов за интересующий период. Далее технология работы аналогичная предыдущему примеру.
1) Создаем правило выгрузке данных где в соответствующем обработчике определяем таблицу значений с реквизитом «Дт». Добавляем в таблицу значений количество строк равное количеству событий изменения оклада.
В реквизит «Дт» добавляем даты изменения оклада.
2) Правило конвертации свойств выглядит так:
3) Содержание обработчиков правил конвертации группы свойств :
- для табличной части «РаботникиОрганизации»:
тз=СоздатьОбъект("ТаблицаЗначений");
тз.НоваяКолонка("Сотрудник");
тз.НоваяКолонка("ДатаПриема");
тз.НоваяКолонка("ПодразделениеОрганизации");
тз.НоваяКолонка("Должность");
тз.НоваяКолонка("ЗанимаемыхСтавок");
тз.НоваяКолонка("МесячнаяТарифнаяСтавка");
сп=СоздатьОбъект("Справочник.Сотрудники");
сп.ВыбратьЭлементы();
Пока сп.ПолучитьЭлемент()=1 Цикл
Если сп.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Если сп.ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если Источник.Дт
Продолжить;
КонецЕсли;
тз.НоваяСтрока();
тз.Сотрудник = сп.ТекущийЭлемент();
тз.ДатаНачала = Источник.Дт;
тз.ПодразделениеОрганизации = сп.Подразделение.Получить(Источник.Дт);
тз.Должность = сп.Должность;
Ставка = сп.Ставка.Получить(Источник.Дт);
тз.ЗанимаемыхСтавок = ?(Ставка=0,1,Ставка);
тз.МесячнаяТарифнаяСтавка = сп.Оклад.Получить(Источник.Дт);
КонецЦикла;
КоллекцияОбъектов = тз;
- для табличной части «ОсновныеНачисления»:
тз=СоздатьОбъект("ТаблицаЗначений");
тз.НоваяКолонка("Сотрудник");
тз.НоваяКолонка("ФизЛицо");
тз.НоваяКолонка("ВидРасчета");
тз.НоваяКолонка("Показатель1");
тз.НоваяКолонка("Валюта");
сп=СоздатьОбъект("Справочник.Сотрудники");
сп.ВыбратьЭлементы();
Пока сп.ПолучитьЭлемент()=1 Цикл
Если сп.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Если сп.ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если Источник.Дт
Продолжить;
КонецЕсли;
//***
ОкладПоЧасам = сп.Оклад.Получить(Источник.Дт);
Если ОкладПоЧасам > 0 Тогда
тз.НоваяСтрока();
тз.Сотрудник = сп.ТекущийЭлемент();
тз.ФизЛицо = сп.ТекущийЭлемент();
тз.ВидРасчета= "00002";
тз.Показатель1 = ОкладПоЧасам;
тз.Валюта = "BYR";
КонецЕсли;
КонецЦикла;
КоллекцияОбъектов = тз;
Надеюсь, данная публикация будет полезна специалистам, делающим первые шаги в разработке правил конвертации.