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