Как в 1С:Конвертации данных 2.0 заполнить реквизит, если документ не найден в базе-приемнике?

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

При настройке правил обмена в конфигурации «Конвертация данных 2.0» (КД 2.0) часто возникает задача: перенести документ из базы-источника в базу-приёмник, но при этом заполнить определенный реквизит (например, Контрагент или Склад) значением по умолчанию только в том случае, если документ создается заново. Если документ уже существует в базе-приёмнике, его реквизит перезаписывать не требуется.

Разберем детально, почему проверки со стороны источника (в обработчике «Перед выгрузкой») не работают в этой ситуации, и рассмотрим программные и настройки механизмы КД 2.0 для решения этой задачи.

Почему не работает проверка на стороне источника?

Проанализируем частую ошибку разработчиков: попытку проверить наличие объекта или запустить функции поиска в обработчиках выгрузки (например, «Перед выгрузкой» в ПКС). На этапе выгрузки данных из информационной базы-источника обработка обмена ничего не знает о содержимом базы-приёмника. Выгрузка создает XML-файл с данными, а поиск элементов происходит уже на стороне приёмника во время загрузки.

Решение 1: Использование обработчика «После загрузки» и флага ОбъектНайден

Наиболее наглядный способ заполнения реквизита при создании объекта — использование специального обработчика «После загрузки» в Правиле конвертации объектов (ПКО).

В этом обработчике доступна системная переменная ОбъектНайден, которая имеет значение Ложь, если документ не был найден в базе по УИД или полям поиска и создается с нуля.

Рассмотрим порядок действий:

  1. Откроем нужное ПКО для документа (например, ЗаказПокупателя).
  2. Перейдем на вкладку «Обработчики событий» и выберем событие «После загрузки».
  3. Напишем код проверки условия поиска и присвоения ссылки на элемент:

Если Не ОбъектНайден Тогда
    // Получаем ссылку на предопределенный элемент или ищем по коду
    Объект.Контрагент = Справочники.Контрагенты.НайтиПоКоду("00002");
КонецЕсли;

Важные нюансы при написании кода:

1. Заполнение ссылочным типом: Переменной Объект.Контрагент нужно присваивать именно ссылку на объект (СправочникСсылка.Контрагенты), а не строковое наименование или код.

2. Обращение к предопределенным элементам: Если в базе-приёмнике элемент является предопределенным, безопаснее использовать функцию ПредопределенноеЗначение() или прямое обращение к имени элемента:


Если Не ОбъектНайден Тогда
    Объект.Контрагент = ПредопределенноеЗначение("Справочник.Контрагенты.НеизвестныйПокупатель");
КонецЕсли;

3. Явная запись объекта не требуется: Внутри обработчика «После загрузки» вызывать метод Объект.Записать() не нужно. Обработка УниверсальныйОбменДаннымиXML автоматически сохранит созданный или отредактированный объект после выполнения кода обработчика. Лишняя запись приводит к повторным вызовам подписок на события и снижает скорость обмена.

Решение 2: Настройка флага в Правиле конвертации свойства (ПКС) без кода записи

В «Конвертации данных 2.0» предусмотрен штатный механизм, позволяющий избежать написания программного кода в обработчиках загрузки.

Разберем шаг за шагом настройку ПКС:

  1. В ПКО создадим или откроем правило конвертации свойства (ПКС) для заполняемого реквизита (например, Контрагент).
  2. Источнику этого ПКС присвоим значение «<Пусто>», а Приёмником выберем нужный реквизит.
  3. В свойствах ПКС установим флаг «Не замещать значение свойства у существующих объектов в приёмнике».
  4. В обработчике события «Перед выгрузкой» этого ПКС укажем выражением значение, которое должно передаваться:

Значение = "00002"; // Если для ПКС задано правило поиска по коду
// Или через выражение:
Выражение = "Справочники.Контрагенты.НеизвестныйПокупатель";

При такой настройке логика работы платформы выглядит следующим образом:

Решение 3: Передача данных через параметры объекта (ПараметрыОбъекта)

Если значение для заполнения должно динамически определяться на стороне источника (например, браться из константы или настройки узла обмена), его удобно передать в базу-приёмник через структуру параметров.

1. В источнике в обработчике «При выгрузке» ПКО передаем параметр:


Параметры.Вставить("ОсновнойКонтрагент", Константы.ОсновнойПокупатель.Получить());

2. В приёмнике в обработчике «После загрузки» ПКО принимаем параметр и заполняем реквизит:


Если Не ОбъектНайден Тогда
    ЗначениеПараметра = Неопределено;
    Если ПараметрыОбъекта.Свойства().Свойство("ОсновнойКонтрагент", ЗначениеПараметра) Тогда
        Объект.Контрагент = ЗначениеПараметра;
    КонецЕсли;
КонецЕсли;

Таким образом, для заполнения реквизита только при создании нового объекта можно использовать как программный подход с проверкой Не ОбъектНайден в обработчике «После загрузки», так и штатную настройку флага перезаписи свойства в ПКС.

← На главную