Как правильно настроить сопоставление и программное присвоение значений перечислений в Конвертации данных 2.0?

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

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

Попытка напрямую обратиться к объектам или метаданным базы-приемника из обработчиков выгрузки в источнике приводит к ошибкам вроде МетодОбъектаНеОбнаружен или ошибкам обращения к несуществующим метаданным. Разберем по шагам, почему возникают такие ошибки и как правильно настроить передачу данных — как стандартными средствами «Конвертации данных 2.0» (КД 2), так и программно.

Почему прямой код в обработчике выгрузки вызывает ошибку?

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


Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
    Приемник.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
Иначе
    Приемник.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо;
КонецЕсли;

Этот код не сработает по двум ключевым причинам:

  1. Разделение контекстов исполнения: Обработчики выгрузки выполняются в контексте базы-источника (УТ). В ее метаданных нет объекта Перечисления.ЮридическоеФизическоеЛицо, поэтому обращение к нему вызовет исключение.
  2. Недоступность переменной Приемник при выгрузке: В обработчиках ПередВыгрузкой и ПриВыгрузке объект приемника еще физически не существует. Формируется лишь XML-файл выгрузки, и прямое присвоение полям приемника невозможно. Для передачи результата используется специальная переменная Значение или Выражение.

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

В большинстве случаев для сопоставления перечислений не требуется писать программный код. Механизм КД 2 умеет делать это автоматически через сопоставление правил конвертации объектов.

Разберем по шагам порядок настройки:

  1. Создадим отдельное ПКО (Правило конвертации объектов) для перечисления: Источник — ЮрФизЛицо, Приемник — ЮридическоеФизическоеЛицо.
  2. В созданном ПКО перейдем на вкладку Конвертация значений и вручную сопоставим элементы:

    — Значение источника ЮрЛицо сопоставляется со значением приемника ЮридическоеЛицо;

    — Значение источника ФизЛицо сопоставляется со значением приемника ФизическоеЛицо.

  3. В ПКО справочника Контрагенты найдем правило конвертации свойств (ПКС) для реквизита: Источник — ЮрФизЛицо, Приемник — ЮридическоеФизическоеЛицо.
  4. В поле Правило конвертации этого ПКС укажем созданное нами правило для перечисления.

Важный нюанс: Если правило настроено, но реквизит в базе-приемнике не заполняется при загрузке, убедимся, что в настройках ПКС не установлен флаг Не замещать значение у существующего объекта, а в базе-приемнике нет обработчиков ПередЗаписью, очищающих реквизит при отсутствии связанных данных (например, ИНН/КПП).

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

Если мы не хотим создавать отдельное ПКО для перечисления, значение можно передать в виде точного строкового имени значения перечисления базы-приемника.

Рассмотрим, как это реализуется в обработчике ПКС ПередВыгрузкой:


Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
    Значение = "ЮридическоеЛицо";
Иначе
    Значение = "ФизическоеЛицо";
КонецЕсли;

В этом случае в переменную Значение помещается строка с именем элемента перечисления так, как он называется в конфигурации-приемнике. При загрузке типовой механизм КД 2 сам найдет элемент перечисления по переданному имени.

Способ 3. Заполнение через свойство «Выражение» или обработчик «ПослеЗагрузки»

Если логику требуется исполнить строго на стороне приемника, у нас есть два варианта:

  1. Использование поля «Выражение» в ПКС: В строку «Выражение» прописывается код на языке 1С, который будет вычислен при загрузке в контексте приемника: "Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо"
  2. Использование обработчика «ПослеЗагрузки» в ПКО объекта: В момент выполнения этого обработчика объект приемника уже инициализирован и доступен через переменную Объект:
    
    Если Не ЗначениеЗаполнено(Объект.ЮридическоеФизическоеЛицо) Тогда
        Объект.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
    КонецЕсли;
    

Проверка заполненности реквизитов и условная выгрузка

Часто требуется проверить, заполнен ли реквизит в источнике, и в зависимости от этого принимать решение — выгружать значение по умолчанию или вовсе пропускать передачу свойства.

Посмотрим на пример в обработчике ПКС ПередВыгрузкой:


Если ЗначениеЗаполнено(Источник.ЮрФизЛицо) Тогда
    Значение = Источник.ЮрФизЛицо;
Иначе
    // Если реквизит пустой, можно отменить выгрузку конкретного свойства,
    // чтобы не затереть существующие данные в приемнике:
    Отказ = Истина;
КонецЕсли;

Использование функции ЗначениеЗаполнено() позволяет корректно обработать пустые ссылки, значения Неопределено и Null, предотвращая ошибки сопоставления при обмене.

← На главную