При разработке правил обмена в конфигурации «Конвертация данных 2.1» разработчики регулярно сталкиваются с ситуациями, когда структура метаданных источника и приемника различается. Типичные примеры — когда в конфигурации-источнике (например, 1С:УНФ) реквизит документа ссылается на справочник Сотрудники, а в приемнике (1С:БП) требуется ссылка на справочник ФизическиеЛица, либо когда ставка НДС в источнике является справочником, а в приемнике — системным перечислением.
Разберем детально, как правильно настроить правила конвертации для обоих сценариев и избежать типичных ошибок при загрузке данных.
В типовых конфигурациях справочник Сотрудники обычно содержит реквизит ФизЛицо. В зависимости от архитектуры обмена мы можем реализовать перенос двумя способами.
Способ 1. Прямая передача через реквизит источника (рекомендуемый)
Рассмотрим самый простой и надежный вариант, когда в правиле конвертации свойств (ПКС) мы сразу передаем значение связанного физического лица и используем стандартное ПКО для справочника ФизическиеЛица.
Сотрудник и реквизит приемника ФизЛицо.ФизическиеЛица.Если конвертируется реквизит шапки документа:
Значение = Источник.Сотрудник.ФизЛицо;
Если конвертируется строка табличной части документа (внутри ПКГС):
Значение = ОбъектКоллекции.Сотрудник.ФизЛицо;
Способ 2. Создание отдельного ПКО «Сотрудники в ФизическиеЛица»
Если требуется отдельное правило сопоставления, создадим ПКО, где источником выступает СправочникСсылка.Сотрудники, а приемником — СправочникСсылка.ФизическиеЛица.
ИНН или комбинации ФИО + ДатаРождения).Выясним причину частой ошибки: при попытке передать ссылку справочника в реклизит-перечисление при загрузке возникает исключение «Метод объекта не обнаружен (ПолучитьСсылку)».
Платформа вызывает метод ПолучитьСсылку(УникальныйИдентификатор) только у менеджеров ссылочных объектов базы данных (справочников, документов). У объекта ПеречислениеМенеджер такого метода нет — значения перечислений получают исключительно по имени идентификатора. Когда в файл выгрузки попадает стандартный ссылочный узел с GUID, обработчик загрузки дает сбой. Кроме того, механизм Правил конвертации значений (ПКЗ) предназначен исключительно для связки Перечисление -> Перечисление и не работает со справочниками.
Рассмотрим правильные способы передачи значений.
Способ 1. Использование служебной переменной «Выражение» (рекомендуемый)
В ПКС реквизита оставляем поле «Правило» пустым. В обработчике «Перед выгрузкой» формируем строку кода, которая выполнится на стороне базы-приемника при загрузке.
Посмотрим на пример кода для табличной части документа:
Если ОбъектКоллекции.СтавкаНДС.НеОблагается Тогда
Выражение = "Перечисления.СтавкиНДС.БезНДС";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 20 И НЕ ОбъектКоллекции.СтавкаНДС.Расчетная Тогда
Выражение = "Перечисления.СтавкиНДС.НДС20";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 20 И ОбъектКоллекции.СтавкаНДС.Расчетная Тогда
Выражение = "Перечисления.СтавкиНДС.НДС20_120";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 10 И НЕ ОбъектКоллекции.СтавкаНДС.Расчетная Тогда
Выражение = "Перечисления.СтавкиНДС.НДС10";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 10 И ОбъектКоллекции.СтавкаНДС.Расчетная Тогда
Выражение = "Перечисления.СтавкиНДС.НДС10_110";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 0 Тогда
Выражение = "Перечисления.СтавкиНДС.НДС0";
Иначе
Выражение = "Перечисления.СтавкиНДС.БезНДС";
КонецЕсли;
Способ 2. Передача строкового имени значения перечисления
В ПКС оставляем поле «Правило» пустым, а в переменную Значение передаем точное имя предопределенного значения перечисления в виде строки:
Если ОбъектКоллекции.СтавкаНДС.Ставка = 20 Тогда
Значение = "НДС20";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 10 Тогда
Значение = "НДС10";
Иначе
Значение = "БезНДС";
КонецЕсли;
При загрузке платформа сопоставит переданную строку со значением перечисления конфигурации-приемника.
Способ 3. Переопределение значения в обработчике «После загрузки»
Если выгрузка реквизита через ПКС не настраивается вовсе, заполнение реквизита в объекте приемника можно выполнить напрямую в обработчике ПКО документа «После загрузки» (или «При загрузке»):
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
КонецЦикла;
Проанализируем ключевые моменты, предотвращающие типичные ошибки:
ОбъектКоллекции. Обращение через Источник.<Реквизит> приведет к ошибке, так как Источник указывает на весь документ-владелец.Отказ = Истина;, убедитесь, что включен флаг «Не запоминать выгруженные объекты», чтобы предотвратить кэширование пустых ссылок.