Как в Конвертации данных 2.0 задать значение для реквизита приемника, если его нет в источнике?

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

При настройке обмена данными часто возникает задача: для какого-либо реквизита в базе-приемнике нужно установить конкретное значение, которого нет в базе-источнике. Это может быть ссылка на предопределенный элемент справочника, счет из плана счетов, значение перечисления или просто константа. Рассмотрим несколько способов решения этой задачи с помощью инструмента "Конвертация данных 2.0".

Способ 1. Установка значения при выгрузке (рекомендуемый)

Этот подход является наиболее предпочтительным, так как вся логика преобразования данных остается на стороне выгрузки, а сам механизм обмена работает более производительно за счет кэширования объектов. Суть метода заключается в том, что мы подготавливаем значение в обработчике события, а система конвертации при загрузке сама находит нужный объект в базе-приемнике.

Для простых типов (число, строка, дата)

Если нужно присвоить простое значение, например, число `1` реквизиту "Коэффициент", достаточно в правиле конвертации свойств (ПКС) для этого реквизита в обработчике события `Перед выгрузкой` написать одну строку:

Значение = 1;

Источник у такого ПКС указывать не нужно.

Для ссылочных типов (справочники, документы, планы счетов)

Когда требуется установить ссылку на объект, которого нет в источнике (например, счет "50.01" из плана счетов `Хозрасчетный`), напрямую найти его в базе-приемнике на этапе выгрузки нельзя. Задача решается через создание промежуточного правила конвертации объекта (ПКО).

Разберем по шагам на примере установки счета кассы:

  1. Настройка основного ПКС. В ПКО для вашего документа (например, `ПриходныйКассовыйОрдер`) найдите ПКС для реквизита `СчетКасса`. Убедитесь, что у этого ПКС не указан источник. В обработчике `Перед выгрузкой` для этого ПКС присвойте переменной `Значение` строковое представление искомого элемента — в нашем случае, код счета.

    Значение = "50.01";
  2. Создание промежуточного ПКО. Создадим новое ПКО, которое будет преобразовывать нашу строку "50.01" в ссылку на счет. Назовем его, например, `Хозрасчетный_по_коду`.

    • В качестве объекта-источника укажите `Строка`.
    • В качестве объекта-приемника укажите нужный тип: `ПланСчетовСсылка.Хозрасчетный`.
  3. Настройка поиска в промежуточном ПКО. Теперь нужно объяснить системе, как найти объект в приемнике, используя полученную строку. Есть два варианта:

    Вариант А: Через конвертацию значений. Этот способ идеален для небольшого количества предопределенных значений или перечислений.

    • В созданном ПКО `Хозрасчетный_по_коду` перейдите на вкладку "Конвертация значений".
    • Добавьте новую строку. В колонке "Источник" укажите строку, которую мы передаем (`"50.01"`), а в колонке "Приемник" выберите из базы-приемника конкретный счет (например, `КассаОрганизации`).

    Вариант Б: Через поиск по полю. Это универсальный способ для поиска по коду, наименованию или любому другому реквизиту. Он подходит для справочников с большим количеством элементов.

    • В ПКО `Хозрасчетный_по_коду` создайте ПКС для поля, по которому будет вестись поиск (например, `Код`).
    • В свойствах этого ПКС поставьте галочку "Поиск по этому полю".
    • В обработчике `Перед выгрузкой` для ПКС `Код` напишите: Значение = Источник;. Это означает, что для поиска будет использоваться то значение, которое пришло на вход ПКО (наша строка "50.01").
  4. Связывание правил. Вернитесь в исходное ПКС (`СчетКасса` в документе `ПриходныйКассовыйОрдер`) и в поле "Правило конвертации" выберите созданное нами промежуточное ПКО `Хозрасчетный_по_коду`.

Теперь при обмене система сначала выполнит код в ПКС `СчетКасса` и получит строку "50.01". Затем она передаст эту строку правилу `Хозрасчетный_по_коду`, которое найдет в базе-приемнике счет с кодом "50.01" и вернет на него ссылку. Эта ссылка и будет записана в реквизит документа.

Способ 2. Установка значения при загрузке

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

Как это работает:

  1. В ПКО для вашего объекта (например, документа `ОтчетПроизводстваЗаСмену`) перейдите на вкладку "Обработчики событий" и найдите событие После загрузки.
  2. В коде обработчика вам доступна переменная Объект — это уже созданный, но еще не записанный объект в базе-приемнике.
  3. Напишите код для поиска и присвоения значения.

Пример: заполнение номенклатурной группы в табличной части документа.


Для каждого СтрокаТЧ Из Объект.Продукция Цикл
    // Находим нужную группу в базе-приемнике по коду
    ГруппаНоменклатуры = Справочники.НоменклатурныеГруппы.НайтиПоКоду("000001");
    // Присваиваем ее реквизиту табличной части
    СтрокаТЧ.НоменклатурнаяГруппа = ГруппаНоменклатуры;
КонецЦикла;

Важное замечание по производительности. Код в обработчике `ПослеЗагрузки` выполняется для каждого загружаемого объекта. Если вы переносите 10 миллионов операций, то поиск `Справочники.НоменклатурныеГруппы.НайтиПоКоду("000001")` выполнится 10 миллионов раз. Это может катастрофически замедлить процесс загрузки. Способ 1 (при выгрузке) лишен этого недостатка, так как КД эффективно кэширует найденные по ссылкам объекты.

Особый случай: Обмен на базе Библиотеки стандартных подсистем (БСП)

При доработке типовых правил обмена (например, УТ 10.3 -> БП 2.0) можно столкнуться с ситуацией, когда изменения в файле правил XML не дают эффекта или вызывают ошибки о "ненайденных методах".

В чем причина? В конфигурациях, использующих БСП, логика выгрузки для некоторых объектов может быть жестко прописана не в правилах, а в специальных модулях или обработках в самой конфигурации-источнике (например, `ОбработчикиВыгрузкиВБухгалтериюГосударственногоУчреждения20`). Эти обработчики имеют приоритет над правилами из XML-файла.

Что делать?

  1. Найдите в конфигурации-источнике модуль, отвечающий за выгрузку вашего объекта.
  2. Внесите необходимые изменения непосредственно в код этого модуля.
  3. Как альтернатива — доработать конфигурацию так, чтобы она использовала стандартный механизм обмена (`УниверсальныйОбменДаннымиXML`), который полностью полагается на загруженные правила.

Таким образом, если ваши правила не работают, в первую очередь проверьте, не переопределяется ли логика выгрузки в коде самой конфигурации.

← На главную