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