При настройке обмена данными между конфигурациями (например, «1С:Управление торговлей» и «1С:Бухгалтерия предприятия») разработчики часто сталкиваются с ситуацией, когда однотипные реквизиты или перечисления имеют разные наименования в источника и приемника. Например, в конфигурации-источнике реквизит справочника контрагентов называется ЮрФизЛицо со значениями перечисления ЮрЛицо и ФизЛицо, а в конфигурации-приемнике — ЮридическоеФизическоеЛицо со значениями ЮридическоеЛицо и ФизическоеЛицо.
Попытка напрямую обратиться к объектам или метаданным базы-приемника из обработчиков выгрузки в источнике приводит к ошибкам вроде МетодОбъектаНеОбнаружен или ошибкам обращения к несуществующим метаданным. Разберем по шагам, почему возникают такие ошибки и как правильно настроить передачу данных — как стандартными средствами «Конвертации данных 2.0» (КД 2), так и программно.
Проанализируем типовую ошибку, с которой сталкиваются начинающие разработчики правил обмена:
Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
Приемник.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
Иначе
Приемник.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо;
КонецЕсли;
Этот код не сработает по двум ключевым причинам:
Перечисления.ЮридическоеФизическоеЛицо, поэтому обращение к нему вызовет исключение.Приемник при выгрузке: В обработчиках ПередВыгрузкой и ПриВыгрузке объект приемника еще физически не существует. Формируется лишь XML-файл выгрузки, и прямое присвоение полям приемника невозможно. Для передачи результата используется специальная переменная Значение или Выражение.В большинстве случаев для сопоставления перечислений не требуется писать программный код. Механизм КД 2 умеет делать это автоматически через сопоставление правил конвертации объектов.
Разберем по шагам порядок настройки:
ЮрФизЛицо, Приемник — ЮридическоеФизическоеЛицо.— Значение источника ЮрЛицо сопоставляется со значением приемника ЮридическоеЛицо;
— Значение источника ФизЛицо сопоставляется со значением приемника ФизическоеЛицо.
Контрагенты найдем правило конвертации свойств (ПКС) для реквизита: Источник — ЮрФизЛицо, Приемник — ЮридическоеФизическоеЛицо.Важный нюанс: Если правило настроено, но реквизит в базе-приемнике не заполняется при загрузке, убедимся, что в настройках ПКС не установлен флаг Не замещать значение у существующего объекта, а в базе-приемнике нет обработчиков ПередЗаписью, очищающих реквизит при отсутствии связанных данных (например, ИНН/КПП).
Если мы не хотим создавать отдельное ПКО для перечисления, значение можно передать в виде точного строкового имени значения перечисления базы-приемника.
Рассмотрим, как это реализуется в обработчике ПКС ПередВыгрузкой:
Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
Значение = "ЮридическоеЛицо";
Иначе
Значение = "ФизическоеЛицо";
КонецЕсли;
В этом случае в переменную Значение помещается строка с именем элемента перечисления так, как он называется в конфигурации-приемнике. При загрузке типовой механизм КД 2 сам найдет элемент перечисления по переданному имени.
Если логику требуется исполнить строго на стороне приемника, у нас есть два варианта:
"Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо"
Объект:
Если Не ЗначениеЗаполнено(Объект.ЮридическоеФизическоеЛицо) Тогда
Объект.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
КонецЕсли;
Часто требуется проверить, заполнен ли реквизит в источнике, и в зависимости от этого принимать решение — выгружать значение по умолчанию или вовсе пропускать передачу свойства.
Посмотрим на пример в обработчике ПКС ПередВыгрузкой:
Если ЗначениеЗаполнено(Источник.ЮрФизЛицо) Тогда
Значение = Источник.ЮрФизЛицо;
Иначе
// Если реквизит пустой, можно отменить выгрузку конкретного свойства,
// чтобы не затереть существующие данные в приемнике:
Отказ = Истина;
КонецЕсли;
Использование функции ЗначениеЗаполнено() позволяет корректно обработать пустые ссылки, значения Неопределено и Null, предотвращая ошибки сопоставления при обмене.