При переносе данных из конфигураций 1С 7.7 в современные конфигурации 1С 8.x с помощью «Конвертации данных 2.1» (КД 2.1) разработчики часто сталкиваются с ситуацией, когда структура метаданных в источнике и приемнике существенно различается. Типичный пример: в 1С 7.7 все данные по налоговой инспекции хранятся в виде простых строковых реквизитов внутри справочника Организации, а в 1С 8.x они вынесены в отдельный справочник НалоговыеИнспекции и привязаны к организации через регистр сведений КодыОрганизаций.
Разберем подробно, как правильно настроить правила конвертации объектов (ПКО), правила конвертации свойств (ПКС) и программные обработчики для корректного создания новых элементов и подстановки их ссылок в регистр сведений базы-приемника.
Посмотрим на схему решения с использованием встроенных механизмов КД 2.1 на стороне источника (1С 7.7). Поскольку в платформе 1С 7.7 отсутствует тип данных Структура, для передачи набора исходящих данных в функцию ВыгрузитьПоПравилу() применяется объект СписокЗначений, где строковое представление каждого элемента выступает именем реквизита приемника.
Разберем реализацию по шагам:
Создаем ПКО НалоговыеИнспекции_Создание, у которого поле Объект-источник оставляем пустым, а в поле Объект-приемник указываем НалоговыеИнспекции. Настраиваем ПКС для реквизитов (Наименование, ЕДРПОУ, Адрес и т.д.), получая их значения из входящих данных (ВходящиеДанные).
В основном ПКО переноса организации в событии ПриВыгрузке (или ПослеВыгрузки) программно формируем СписокЗначений и передаем его в правило выгрузки:
СЗ = СоздатьОбъект("СписокЗначений");
СЗ.ДобавитьЗначение(СокрЛП(Источник.ОтделНалоговойИнспекции), "Наименование");
СЗ.ДобавитьЗначение(1, "ТипДПИ");
СЗ.ДобавитьЗначение(54, "КодАдмРайона");
СЗ.ДобавитьЗначение("Ворошиловский", "НаименованиеАдмРайона");
СЗ.ДобавитьЗначение("г.Донецк", "Адрес");
СЗ.ДобавитьЗначение(СокрЛП(Источник.ЕГРПОУНалоговойинспекции), "ЕДРПОУ");
СЗ.ДобавитьЗначение(СокрЛП(Источник.КодНалоговойИнспекции), "КодДляПоиска");
ВыгрузитьПоПравилу(, , СЗ, , "НалоговыеИнспекции_Создание");
Для того чтобы подставить созданный элемент справочника в регистр сведений КодыОрганизаций, создаем второе ПКО — НалоговыеИнспекции_Поиск:
Объект-источник: пусто;Объект-приемник: НалоговыеИнспекции;КодДляПоиска или Код) включаем флаг «Поиск объекта при загрузке по свойству». В обработчике ПередВыгрузкой этого ПКС указываем: Значение = Источник;.Создаем правило выгрузки для регистра КодыОрганизаций:
Организация связываем его с основным ПКО организаций;НалоговаяИнспекция источником выбираем реквизит КодНалоговойИнспекции, а в качестве правила конвертации указываем созданное вспомогательное ПКО НалоговыеИнспекции_Поиск.В момент загрузки платформа автоматически найдет созданную на предыдущем шаге инспекцию по коду и подставит корректную ссылку в запись регистра.
Проанализируем ситуацию, когда база-источник 1С 7.7 содержит большое количество организаций, ссылающихся на одни и те же налоговые органы. Если многократно вызывать ВыгрузитьПоПравилу() в цикле по организациям, файл выгрузки XML будет перегружен дублирующимися блоками создания объектов.
Для оптимизации процесса можно разделить выгрузку на два независимых шага с помощью Правила выгрузки данных (ПВД) с типом «Произвольный алгоритм»:
С помощью запроса к базе 1С 7.7 отбираем только уникальные налоговые инспекции, присутствующие у организаций. В цикле выгружаем их по правилу создания справочника НалоговыеИнспекции.
Вторым шагом выгружаем справочник организаций и записи регистра КодыОрганизаций. Так как все инспекции уже записаны в файл и будут созданы первыми, сопоставление ссылок в регистре произойдет быстро и без риска получить пустые значения.
Рассмотрим альтернативный вариант, когда формирование записей регистра и сопутствующих справочников полностью переносится на сторону базы 1С 8.x. Это упрощает отладку и уменьшает нагрузку на механизм конвертации.
ПараметрыОбъекта.ПослеЗагрузки справочника Организации на стороне 1С 8 пишем код на платформе 8.x:
Если Не ПараметрыОбъекта.Свойство("КодИнспекции") Тогда
Возврат;
КонецЕсли;
// Поиск или создание налоговой инспекции
ИнспекцияСсылка = Справочники.НалоговыеИнспекции.НайтиПоРеквизиту("КодДляПоиска", ПараметрыОбъекта.КодИнспекции);
Если Не ЗначениеЗаполнено(ИнспекцияСсылка) Тогда
ОбъектИнспекция = Справочники.НалоговыеИнспекции.СоздатьЭлемент();
ОбъектИнспекция.Наименование = ПараметрыОбъекта.НаименованиеИнспекции;
ОбъектИнспекция.КодДляПоиска = ПараметрыОбъекта.КодИнспекции;
ОбъектИнспекция.Записать();
ИнспекцияСсылка = ОбъектИнспекция.Ссылка;
КонецЕсли;
// Формирование записи в регистре сведений КодыОрганизаций
НаборЗаписей = РегистрыСведений.КодыОрганизаций.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Организация.Установить(Ссылка);
НаборЗаписей.Прочитать();
Запись = НаборЗаписей.Добавить();
Запись.Организация = Ссылка;
Запись.НалоговаяИнспекция = ИнспекцияСсылка;
НаборЗаписей.Записать(Истина);
При настройке правил конвертации из платформы 1С 7.7 обязательно учитывайте следующие технические нюансы:
СписокЗначений (СЗ.ДобавитьЗначение(Значение, "ИмяСвойства")) следите за тем, чтобы представление точно совпадало с именем свойства приемника без пробелов и с соблюдением регистра букв.