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