Как в Конвертации данных 2.1 перенести реквизиты с несовпадающими типами (Сотрудник в Физлицо, Справочник в Перечисление)?

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

При разработке правил обмена в конфигурации «Конвертация данных 2.1» разработчики регулярно сталкиваются с ситуациями, когда структура метаданных источника и приемника различается. Типичные примеры — когда в конфигурации-источнике (например, 1С:УНФ) реквизит документа ссылается на справочник Сотрудники, а в приемнике (1С:БП) требуется ссылка на справочник ФизическиеЛица, либо когда ставка НДС в источнике является справочником, а в приемнике — системным перечислением.

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

Сценарий 1. Перенос реквизита «Сотрудник» в «Физ. лицо»

В типовых конфигурациях справочник Сотрудники обычно содержит реквизит ФизЛицо. В зависимости от архитектуры обмена мы можем реализовать перенос двумя способами.

Способ 1. Прямая передача через реквизит источника (рекомендуемый)

Рассмотрим самый простой и надежный вариант, когда в правиле конвертации свойств (ПКС) мы сразу передаем значение связанного физического лица и используем стандартное ПКО для справочника ФизическиеЛица.

  1. В ПКС документа сопоставим реквизит источника Сотрудник и реквизит приемника ФизЛицо.
  2. В качестве правила конвертации укажем типовое ПКО для справочника ФизическиеЛица.
  3. В обработчике «Перед выгрузкой» переопределим передаваемое значение:

Если конвертируется реквизит шапки документа:

Значение = Источник.Сотрудник.ФизЛицо;

Если конвертируется строка табличной части документа (внутри ПКГС):

Значение = ОбъектКоллекции.Сотрудник.ФизЛицо;

Способ 2. Создание отдельного ПКО «Сотрудники в ФизическиеЛица»

Если требуется отдельное правило сопоставления, создадим ПКО, где источником выступает СправочникСсылка.Сотрудники, а приемником — СправочникСсылка.ФизическиеЛица.

  1. В настройках созданного ПКО обязательно снимем флаг «Искать объект приемника по внутреннему идентификатору». Идентификаторы (GUID) сотрудника и физлица не совпадают, поэтому поиск по УИД приведет к ошибкам или созданию дублей.
  2. Настроим поиск физлица по ключевым реквизитам (например, по реквизиту ИНН или комбинации ФИО + ДатаРождения).
  3. В ПКС документа укажем созданное правило конвертации объекта.

Сценарий 2. Конвертация «Справочник $\rightarrow$ Перечисление» (Ставки НДС)

Выясним причину частой ошибки: при попытке передать ссылку справочника в реклизит-перечисление при загрузке возникает исключение «Метод объекта не обнаружен (ПолучитьСсылку)».

Платформа вызывает метод ПолучитьСсылку(УникальныйИдентификатор) только у менеджеров ссылочных объектов базы данных (справочников, документов). У объекта ПеречислениеМенеджер такого метода нет — значения перечислений получают исключительно по имени идентификатора. Когда в файл выгрузки попадает стандартный ссылочный узел с GUID, обработчик загрузки дает сбой. Кроме того, механизм Правил конвертации значений (ПКЗ) предназначен исключительно для связки Перечисление -> Перечисление и не работает со справочниками.

Рассмотрим правильные способы передачи значений.

Способ 1. Использование служебной переменной «Выражение» (рекомендуемый)

В ПКС реквизита оставляем поле «Правило» пустым. В обработчике «Перед выгрузкой» формируем строку кода, которая выполнится на стороне базы-приемника при загрузке.

Посмотрим на пример кода для табличной части документа:


Если ОбъектКоллекции.СтавкаНДС.НеОблагается Тогда
    Выражение = "Перечисления.СтавкиНДС.БезНДС";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 20 И НЕ ОбъектКоллекции.СтавкаНДС.Расчетная Тогда
    Выражение = "Перечисления.СтавкиНДС.НДС20";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 20 И ОбъектКоллекции.СтавкаНДС.Расчетная Тогда
    Выражение = "Перечисления.СтавкиНДС.НДС20_120";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 10 И НЕ ОбъектКоллекции.СтавкаНДС.Расчетная Тогда
    Выражение = "Перечисления.СтавкиНДС.НДС10";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 10 И ОбъектКоллекции.СтавкаНДС.Расчетная Тогда
    Выражение = "Перечисления.СтавкиНДС.НДС10_110";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 0 Тогда
    Выражение = "Перечисления.СтавкиНДС.НДС0";
Иначе
    Выражение = "Перечисления.СтавкиНДС.БезНДС";
КонецЕсли;

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

В ПКС оставляем поле «Правило» пустым, а в переменную Значение передаем точное имя предопределенного значения перечисления в виде строки:


Если ОбъектКоллекции.СтавкаНДС.Ставка = 20 Тогда
    Значение = "НДС20";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 10 Тогда
    Значение = "НДС10";
Иначе
    Значение = "БезНДС";
КонецЕсли;

При загрузке платформа сопоставит переданную строку со значением перечисления конфигурации-приемника.

Способ 3. Переопределение значения в обработчике «После загрузки»

Если выгрузка реквизита через ПКС не настраивается вовсе, заполнение реквизита в объекте приемника можно выполнить напрямую в обработчике ПКО документа «После загрузки» (или «При загрузке»):


Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
КонецЦикла;

Важные правила работы с контекстом обработчиков

Проанализируем ключевые моменты, предотвращающие типичные ошибки:

  1. Контекст табличных частей: при работе внутри правил конвертации групп свойств (ПКГС) обращение к данным текущей выгружаемой строки выполняется через переменную ОбъектКоллекции. Обращение через Источник.<Реквизит> приведет к ошибке, так как Источник указывает на весь документ-владелец.
  2. Специальные флаги: если для специфических сопоставлений создается отдельное ПКО с прерыванием штатной выгрузки через Отказ = Истина;, убедитесь, что включен флаг «Не запоминать выгруженные объекты», чтобы предотвратить кэширование пустых ссылок.
← На главную