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