При настройке обмена данными часто возникает задача: для какого-либо реквизита в базе-приемнике нужно установить конкретное значение, которого нет в базе-источнике. Это может быть ссылка на предопределенный элемент справочника, счет из плана счетов, значение перечисления или просто константа. Рассмотрим несколько способов решения этой задачи с помощью инструмента "Конвертация данных 2.0".
Этот подход является наиболее предпочтительным, так как вся логика преобразования данных остается на стороне выгрузки, а сам механизм обмена работает более производительно за счет кэширования объектов. Суть метода заключается в том, что мы подготавливаем значение в обработчике события, а система конвертации при загрузке сама находит нужный объект в базе-приемнике.
Для простых типов (число, строка, дата)
Если нужно присвоить простое значение, например, число `1` реквизиту "Коэффициент", достаточно в правиле конвертации свойств (ПКС) для этого реквизита в обработчике события `Перед выгрузкой` написать одну строку:
Значение = 1;
Источник у такого ПКС указывать не нужно.
Для ссылочных типов (справочники, документы, планы счетов)
Когда требуется установить ссылку на объект, которого нет в источнике (например, счет "50.01" из плана счетов `Хозрасчетный`), напрямую найти его в базе-приемнике на этапе выгрузки нельзя. Задача решается через создание промежуточного правила конвертации объекта (ПКО).
Разберем по шагам на примере установки счета кассы:
Настройка основного ПКС. В ПКО для вашего документа (например, `ПриходныйКассовыйОрдер`) найдите ПКС для реквизита `СчетКасса`. Убедитесь, что у этого ПКС не указан источник. В обработчике `Перед выгрузкой` для этого ПКС присвойте переменной `Значение` строковое представление искомого элемента — в нашем случае, код счета.
Значение = "50.01";
Создание промежуточного ПКО. Создадим новое ПКО, которое будет преобразовывать нашу строку "50.01" в ссылку на счет. Назовем его, например, `Хозрасчетный_по_коду`.
Настройка поиска в промежуточном ПКО. Теперь нужно объяснить системе, как найти объект в приемнике, используя полученную строку. Есть два варианта:
Вариант А: Через конвертацию значений. Этот способ идеален для небольшого количества предопределенных значений или перечислений.
Вариант Б: Через поиск по полю. Это универсальный способ для поиска по коду, наименованию или любому другому реквизиту. Он подходит для справочников с большим количеством элементов.
Значение = Источник;. Это означает, что для поиска будет использоваться то значение, которое пришло на вход ПКО (наша строка "50.01").Связывание правил. Вернитесь в исходное ПКС (`СчетКасса` в документе `ПриходныйКассовыйОрдер`) и в поле "Правило конвертации" выберите созданное нами промежуточное ПКО `Хозрасчетный_по_коду`.
Теперь при обмене система сначала выполнит код в ПКС `СчетКасса` и получит строку "50.01". Затем она передаст эту строку правилу `Хозрасчетный_по_коду`, которое найдет в базе-приемнике счет с кодом "50.01" и вернет на него ссылку. Эта ссылка и будет записана в реквизит документа.
Этот метод применяется, когда для определения значения необходим доступ к данным базы-приемника, или для быстрой доработки правил без создания сложных конструкций. Логика в этом случае выполняется уже после того, как основной объект создан в базе-приемнике.
Как это работает:
После загрузки.Объект — это уже созданный, но еще не записанный объект в базе-приемнике.Пример: заполнение номенклатурной группы в табличной части документа.
Для каждого СтрокаТЧ Из Объект.Продукция Цикл
// Находим нужную группу в базе-приемнике по коду
ГруппаНоменклатуры = Справочники.НоменклатурныеГруппы.НайтиПоКоду("000001");
// Присваиваем ее реквизиту табличной части
СтрокаТЧ.НоменклатурнаяГруппа = ГруппаНоменклатуры;
КонецЦикла;
Важное замечание по производительности. Код в обработчике `ПослеЗагрузки` выполняется для каждого загружаемого объекта. Если вы переносите 10 миллионов операций, то поиск `Справочники.НоменклатурныеГруппы.НайтиПоКоду("000001")` выполнится 10 миллионов раз. Это может катастрофически замедлить процесс загрузки. Способ 1 (при выгрузке) лишен этого недостатка, так как КД эффективно кэширует найденные по ссылкам объекты.
При доработке типовых правил обмена (например, УТ 10.3 -> БП 2.0) можно столкнуться с ситуацией, когда изменения в файле правил XML не дают эффекта или вызывают ошибки о "ненайденных методах".
В чем причина? В конфигурациях, использующих БСП, логика выгрузки для некоторых объектов может быть жестко прописана не в правилах, а в специальных модулях или обработках в самой конфигурации-источнике (например, `ОбработчикиВыгрузкиВБухгалтериюГосударственногоУчреждения20`). Эти обработчики имеют приоритет над правилами из XML-файла.
Что делать?
Таким образом, если ваши правила не работают, в первую очередь проверьте, не переопределяется ли логика выгрузки в коде самой конфигурации.