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