При переносе данных между различными конфигурациями 1С часто возникает ситуация, когда архитектура хранения свойств отличается. Например, в базе-источнике тип позиции номенклатуры определяется несколькими отдельными флажками типа Булево (Товар, Услуга, Набор), а в базе-приемнике используется отдельный ссылочный справочник ВидыНоменклатуры. Разберем по шагам, как правильно настроить правила конвертации в «1С:Конвертация данных 2.1», чтобы корректно сопоставить данные и избежать типовых ошибок при выгрузке.
Посмотрим на типичные проблемы, с которыми сталкиваются разработчики при подобной настройке:
Поле объекта не обнаружено.Услуга или ВидНоменклатуры отсутствуют или не имеют смысла. Если не проверить свойство ЭтоГруппа, попытка обработать папки приведет к ошибкам при обращении к полям или выгрузке пустых данных.Значение = "Товар"), приемник не сможет автоматически сопоставить строку со ссылочным типом данных без настроенного правила поиска.Рассмотрим основной и наиболее гибкий способ решения, при котором создается отдельное правило конвертации для подчиненного справочника.
Шаг 1. Настройка ПКО для справочника «ВидыНоменклатуры»
Создадим правило конвертации объекта:
СправочникСсылка.ВидыНоменклатуры.Наименование. В этом ПКС устанавливаем флаги «Получить из входящих данных» и «Поиск».Шаг 2. Настройка ПКС в правиле конвертации «Номенклатура»
Перейдем в ПКО справочника Номенклатура и добавим строку в конвертацию свойств:
ВидНоменклатуры.
Если Источник.ЭтоГруппа Тогда
Отказ = Истина;
Иначе
ВходящиеДанные = Новый Структура;
Если Источник.Услуга Тогда
ВходящиеДанные.Вставить("Наименование", "Услуга");
ИначеЕсли Источник.Набор Тогда
ВходящиеДанные.Вставить("Наименование", "Набор");
Иначе
ВходящиеДанные.Вставить("Наименование", "Товар");
КонецЕсли;
Значение = ВходящиеДанные;
КонецЕсли;
Проанализируем работу этого алгоритма: для групп срабатывает директива Отказ = Истина, благодаря чему выгрузка реквизита для папок пропускается. Для элементов формируется структура входящих данных с наименованием вида, которая передается в подчиненное ПКО, где по этому наименованию выполняется поиск соответствующего элемента в базе-приемнике.
Если мы не хотим жестко связывать ПКС с конкретным ПКО в табличной части, можно вызвать выгрузку подчиненного объекта программно с помощью функции ВыгрузитьПоПравилу. Разберем этот пример:
Если Источник.ЭтоГруппа Тогда
Отказ = Истина;
Иначе
ИмяВида = "Товар";
Если Источник.Услуга Тогда
ИмяВида = "Услуга";
ИначеЕсли Источник.Набор Тогда
ИмяВида = "Набор";
КонецЕсли;
ВходящиеДанные = Новый Структура("Наименование", ИмяВида);
Значение = ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ВидыНоменклатуры");
КонецЕсли;
В ситуациях, когда создавать новые виды номенклатуры не требуется, а все необходимые элементы гарантированно существуют в базе-приемнике, можно передать наименование в параметрах объекта и найти ссылку при загрузке.
Шаг 1. Передача параметра в ПКО «Номенклатура» (обработчик «После выгрузки» на источнике):
Если Не Источник.ЭтоГруппа Тогда
Если Источник.Услуга Тогда
ПараметрыОбъекта.Вставить("ИмяВидаНоменклатуры", "Услуга");
ИначеЕсли Источник.Набор Тогда
ПараметрыОбъекта.Вставить("ИмяВидаНоменклатуры", "Набор");
Иначе
ПараметрыОбъекта.Вставить("ИмяВидаНоменклатуры", "Товар");
КонецЕсли;
КонецЕсли;
Шаг 2. Заполнение реквизита в ПКО «Номенклатура» (обработчик «После загрузки» или «Перед записью объекта» на приемнике):
Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта.Свойство("ИмяВидаНоменклатуры") Тогда
НайденныйВид = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(ПараметрыОбъекта["ИмяВидаНоменклатуры"]);
Если ЗначениеЗаполнено(НайденныйВид) Тогда
Объект.ВидНоменклатуры = НайденныйВид;
КонецЕсли;
КонецЕсли;
Выясним важную деталь: в современных конфигурациях справочник ВидыНоменклатуры содержит обязательный реквизит ТипНоменклатуры (системное перечисление: Товар, Услуга, Работа, Тара, Набор). Если правило создает новый вид номенклатуры только по наименованию, объект может записаться некорректно, что приведет к ошибкам при дальнейшей работе.
Для корректного создания нового вида номенклатуры во ВходящиеДанные рекомендуется передавать оба реквизита:
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Наименование", "Услуга");
ВходящиеДанные.Вставить("ТипНоменклатуры", "Услуга");
Значение = ВходящиеДанные;
В ПКО справочника ВидыНоменклатуры для свойства ТипНоменклатуры также устанавливается флаг «Получить из входящих данных» и указывается соответствующее правило конвертации перечисления.