Как в Конвертации данных 2.1 объединить несколько булевых реквизитов источника в один ссылочный реквизит приемника?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При переносе данных между различными конфигурациями 1С часто возникает ситуация, когда архитектура хранения свойств отличается. Например, в базе-источнике тип позиции номенклатуры определяется несколькими отдельными флажками типа Булево (Товар, Услуга, Набор), а в базе-приемнике используется отдельный ссылочный справочник ВидыНоменклатуры. Разберем по шагам, как правильно настроить правила конвертации в «1С:Конвертация данных 2.1», чтобы корректно сопоставить данные и избежать типовых ошибок при выгрузке.

Причины возникновения ошибки «Поле объекта не обнаружено»

Посмотрим на типичные проблемы, с которыми сталкиваются разработчики при подобной настройке:

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

Способ 1. Создание ПКО для справочника приемника и передача структуры через ВходящиеДанные

Рассмотрим основной и наиболее гибкий способ решения, при котором создается отдельное правило конвертации для подчиненного справочника.

Шаг 1. Настройка ПКО для справочника «ВидыНоменклатуры»

Создадим правило конвертации объекта:

  1. Объект источника: оставляем пустым (так как в базе-источнике такого справочника нет).
  2. Объект приемника: выбираем СправочникСсылка.ВидыНоменклатуры.
  3. В табличной части создаем ПКС для свойства Наименование. В этом ПКС устанавливаем флаги «Получить из входящих данных» и «Поиск».

Шаг 2. Настройка ПКС в правиле конвертации «Номенклатура»

Перейдем в ПКО справочника Номенклатура и добавим строку в конвертацию свойств:

  1. Поле «Источник» оставляем пустым.
  2. Поле «Приемник»: указываем ВидНоменклатуры.
  3. Поле «Правило»: выбираем созданное ранее ПКО для видов номенклатуры.
  4. В обработчике «Перед выгрузкой» этого ПКС пишем следующий код:

Если Источник.ЭтоГруппа Тогда
    Отказ = Истина;
Иначе
    ВходящиеДанные = Новый Структура;
    
    Если Источник.Услуга Тогда
        ВходящиеДанные.Вставить("Наименование", "Услуга");
    ИначеЕсли Источник.Набор Тогда
        ВходящиеДанные.Вставить("Наименование", "Набор");
    Иначе
        ВходящиеДанные.Вставить("Наименование", "Товар");
    КонецЕсли;
    
    Значение = ВходящиеДанные;
КонецЕсли;

Проанализируем работу этого алгоритма: для групп срабатывает директива Отказ = Истина, благодаря чему выгрузка реквизита для папок пропускается. Для элементов формируется структура входящих данных с наименованием вида, которая передается в подчиненное ПКО, где по этому наименованию выполняется поиск соответствующего элемента в базе-приемнике.

Способ 2. Программная выгрузка через ВыгрузитьПоПравилу

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


Если Источник.ЭтоГруппа Тогда
    Отказ = Истина;
Иначе
    ИмяВида = "Товар";
    Если Источник.Услуга Тогда
        ИмяВида = "Услуга";
    ИначеЕсли Источник.Набор Тогда
        ИмяВида = "Набор";
    КонецЕсли;
    
    ВходящиеДанные = Новый Структура("Наименование", ИмяВида);
    Значение = ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ВидыНоменклатуры");
КонецЕсли;

Способ 3. Поиск и сопоставление на стороне базы-приемника

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

Шаг 1. Передача параметра в ПКО «Номенклатура» (обработчик «После выгрузки» на источнике):


Если Не Источник.ЭтоГруппа Тогда
    Если Источник.Услуга Тогда
        ПараметрыОбъекта.Вставить("ИмяВидаНоменклатуры", "Услуга");
    ИначеЕсли Источник.Набор Тогда
        ПараметрыОбъекта.Вставить("ИмяВидаНоменклатуры", "Набор");
    Иначе
        ПараметрыОбъекта.Вставить("ИмяВидаНоменклатуры", "Товар");
    КонецЕсли;
КонецЕсли;

Шаг 2. Заполнение реквизита в ПКО «Номенклатура» (обработчик «После загрузки» или «Перед записью объекта» на приемнике):


Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта.Свойство("ИмяВидаНоменклатуры") Тогда
    НайденныйВид = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(ПараметрыОбъекта["ИмяВидаНоменклатуры"]);
    Если ЗначениеЗаполнено(НайденныйВид) Тогда
        Объект.ВидНоменклатуры = НайденныйВид;
    КонецЕсли;
КонецЕсли;

Важные особенности при выгрузке в современные конфигурации (УТ 11, КА 2, ERP)

Выясним важную деталь: в современных конфигурациях справочник ВидыНоменклатуры содержит обязательный реквизит ТипНоменклатуры (системное перечисление: Товар, Услуга, Работа, Тара, Набор). Если правило создает новый вид номенклатуры только по наименованию, объект может записаться некорректно, что приведет к ошибкам при дальнейшей работе.

Для корректного создания нового вида номенклатуры во ВходящиеДанные рекомендуется передавать оба реквизита:


ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Наименование", "Услуга");
ВходящиеДанные.Вставить("ТипНоменклатуры", "Услуга");
Значение = ВходящиеДанные;

В ПКО справочника ВидыНоменклатуры для свойства ТипНоменклатуры также устанавливается флаг «Получить из входящих данных» и указывается соответствующее правило конвертации перечисления.

← На главную