Как заполнить булевский реквизит в приемнике на основе значения перечисления из источника в Конвертации данных 2.1

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

При настройке обмена данными между конфигурациями на платформе 1С часто возникает ситуация, когда структура метаданных источника и приемника не совпадает. Типичный пример: в базе-источнике информация о типе контрагента хранится в одном реквизите типа Перечисление (например, ЮрЛицо, ФизЛицо, ЮрЛицо-нерезидент), а в базе-приемнике для этого выделены отдельные поля, включая логический флаг Булево (например, РезидентРБ). Разберем подробно, как реализовать такую логику заполнения с помощью инструментов конфигурации Конвертация данных 2.1.

Использование обработчика Перед выгрузкой в ПКС

Самый распространенный и гибкий способ решения данной задачи — написание кода в обработчике события Перед выгрузкой конкретного правила конвертации свойства (ПКС). Проанализируем ситуацию: нам нужно заполнить реквизит приемника РезидентРБ, которого нет в источнике как отдельного поля, но его значение можно вычислить на основании реквизита ЮрФизЛицо.

Рассмотрим по шагам алгоритм настройки в ПКС:

  1. Создаем новое правило конвертации свойства (ПКС) для реквизита РезидентРБ.
  2. Поле Источник оставляем пустым, так как прямого соответствия нет.
  3. В поле Приемник выбираем наш булевский реквизит.
  4. Переходим на закладку Обработчики событий и находим событие Перед выгрузкой.

В этом обработчике нам доступны важные параметры: Источник (ссылка на объект базы-источника) и Значение (то, что будет передано в приемник). Напишем следующий код:


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

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

Реализация через колонку Выражение

Если логика преобразования достаточно проста и умещается в одну строку, можно не заходить в обработчики, а воспользоваться колонкой Выражение в таблице ПКС. Это делает правила более наглядными и упрощает их поддержку. Выражение должно возвращать результат, который будет присвоен реквизиту приемника.

Пример выражения для нашего случая:

Результат = ?(Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент, Истина, Ложь);

Этот способ работает быстро, так как платформа оптимизирует выполнение подобных выражений при выгрузке данных. Однако помните, что в Выражение нельзя писать сложные многострочные конструкции с объявлением переменных.

Обработка типичных ошибок при обращении к реквизитам

Иногда при выполнении обмена возникает ошибка: "Поле объекта не обнаружено" или "Значение не является значением объектного типа" при обращении к Источник.ЮрФизЛицо. Выясним причину этой проблемы. Она может возникать, если Источник в данный момент не определен (например, при выгрузке из ТЗ или структуры) или если реквизит имеет пустое значение.

Для повышения отказоустойчивости кода рекомендуется использовать проверку на наличие значения или обращаться к перечислениям через строковое представление, если есть сомнения в идентичности метаданных:


// Безопасный способ проверки через строку
Если СокращеннаяЛП(Источник.ЮрФизЛицо) = "ЮрЛицоНеРезидент" Тогда
    Значение = Истина;
Иначе
    Значение = Ложь;
КонецЕсли;

Также проанализируем ситуацию, когда данные выгружаются не из объекта (справочника/документа), а из выборки запроса. В этом случае обращение к реквизитам через точку может не сработать. Тогда следует использовать структуру ОбъектКоллекции, которая содержит поля текущей строки выгрузки.

Заполнение в обработчике После загрузки в ПКО

В некоторых случаях удобнее заполнять реквизиты уже на стороне приемника, когда объект фактически создан. Это актуально, если логика заполнения РезидентРБ зависит не только от данных источника, но и от других реквизитов, которые могли измениться в процессе загрузки (например, поиск по ИНН или сопоставление с существующими объектами).

В правиле конвертации объекта (ПКО) в обработчике После загрузки мы можем написать:


Если Объект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент Тогда
    Объект.РезидентРБ = Истина;
Иначе
    Объект.РезидентРБ = Ложь;
КонецЕсли;

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

Использование Входящих данных для сложных расчетов

Рассмотрим продвинутый метод. Если расчет признака резидентства сложный и требует запросов к базе или анализа множества полей, лучше вычислить его один раз в ПКО Перед выгрузкой и передать в ПКС через структуру ВходящиеДанные.

В обработчике Перед выгрузкой объекта (ПКО) пишем:


ВходящиеДанные = Новый Структура;
Если Источник.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент Тогда
    ВходящиеДанные.Вставить("ФлагРезидента", Истина);
Иначе
    ВходящиеДанные.Вставить("ФлагРезидента", Ложь;
КонецЕсли;

Затем в настройках ПКС для реквизита РезидентРБ нужно установить флаг "Получать из входящих данных". В обработчике Перед выгрузкой этого ПКС достаточно будет написать:


Значение = ВходящиеДанные.ФлагРезидента;

Это позволяет избежать дублирования логики, если одно и то же вычисленное значение требуется для заполнения нескольких разных реквизитов приемника. Мы проанализировали основные подходы к заполнению булевских реквизитов и выяснили, что наиболее стабильным решением является программная установка параметра Значение в ПКС с учетом контекста выгружаемых данных.

← На главную