Как в Конвертации данных 2.1 определить, является ли объект новым, и передать в него данные из документа

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

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

В этой статье мы подробно разберем, как программно определить статус объекта (новый или найденный), как управлять процессом перезаписи и как элегантно передавать данные между различными правилами конвертации объектов (ПКО).

Способ 1. Использование флага «Не замещать существующие объекты»

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

Если этот флаг установлен:

  1. Система выполняет поиск объекта по заданным полям поиска (например, «Владелец» и «Наименование»).
  2. Если объект найден, поиск считается успешным, но стандартные Правила конвертации свойств (ПКС) для этого объекта игнорируются — данные из файла загрузки не будут записаны в найденный объект.
  3. Если объект не найден, система создает новый экземпляр и заполняет его всеми доступными данными.

Рассмотрим нюанс: даже если установлена эта «галочка», обработчики событий (такие как ПриЗагрузке или ПослеЗагрузки) все равно будут выполнены. Это дает нам гибкость: мы можем запретить автоматическое замещение, но прописать индивидуальную логику обновления конкретных реквизитов в коде.

Способ 2. Определение новизны через параметр ОбъектНайден

Если логика сложнее, чем просто «не перезаписывать», нам на помощь приходят обработчики ПКО. В КД 2.1 для платформы 1С:Предприятие 8 существует специальный параметр ОбъектНайден. Выясним, как использовать его в разных событиях.

Обработчик «При загрузке»

Это событие выполняется сразу после того, как система попыталась идентифицировать объект в базе-приемнике. Если объект был найден по уникальному идентификатору (GUID) или полям поиска, параметр ОбъектНайден примет значение Истина. Если поиск не дал результатов — Ложь.

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


Если Не ОбъектНайден Тогда
    // Здесь мы понимаем, что объект новый.
    // Можно инициализировать Объект какими-то значениями по умолчанию
    // до того, как в него начнут записываться данные из файла.
    Сообщить("Будет создан новый договор");
Иначе
    // Объект найден. Можно решить, нужно ли нам его изменять.
    // Если мы установим параметр НеЗамещатьОбъект в Истина,
    // система не будет записывать свойства из файла.
    НеЗамещатьОбъект = Истина; 
КонецЕсли;

Обработчик «После загрузки»

Этот обработчик вызывается, когда все свойства объекта из файла уже прочитаны и установлены в памяти, но сам объект еще не записан в базу данных. Здесь параметр ОбъектНайден также доступен. Это идеальное место для «финальной шлифовки» нового объекта. Для удобного написания кода в событиях правил подойдёт конфигурация КД 2.1 с подсказками по обработчикам.

Способ 3. Передача контекста через ВходящиеДанные

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

Посмотрим на алгоритм реализации по шагам:

  1. В ПКО документа находим ПКС (Правило конвертации свойства), которое отвечает за выгрузку договора.
  2. В обработчике этого ПКС Перед выгрузкой формируем структуру с нужными нам данными:

// ПКС Документа (свойство ДоговорКонтрагента) -> Перед выгрузкой
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("СуммаВключаетНДС", Объект.СуммаВключаетНДС);
ИсходящиеДанные.Вставить("ОрганизацияДляДоговора", Объект.Организация);
  1. Теперь переходим в ПКО Договора. В обработчиках этого правила (например, При загрузке или После загрузки) переданная структура будет доступна в параметре ВходящиеДанные.

// ПКО Договора -> После загрузки
Если ТипЗнч(ВходящиеДанные) = Тип("Структура") Тогда
    Если Не ОбъектНайден Тогда
        // Заполняем реквизиты нового договора данными из документа
        Объект.Комментарий = "Создан автоматически на основании документа с НДС: " + ВходящиеДанные.СуммаВключаетНДС;
        Объект.Организация = ВходящиеДанные.ОрганизацияДляДоговора;
    КонецЕсли;
КонецЕсли;

Важное замечание: всегда проверяйте ТипЗнч(ВходящиеДанные). Договор может выгружаться из разных мест (из другого документа или справочника), где ИсходящиеДанные не были заполнены. В этом случае ВходящиеДанные будут равны Неопределено, что приведет к ошибке при попытке обращения к свойствам структуры.

Дополнительные возможности: ДополнительныеСвойства

Иногда логика заполнения должна сохраняться на протяжении всей цепочки событий, вплоть до записи объекта. В этом случае удобно использовать стандартный механизм платформы 1С — ДополнительныеСвойства объекта.

Посмотрим, как это работает: в обработчике При загрузке мы можем поместить информацию в объект, которая «доживет» до момента записи. Это удобно, если вы используете подписки на события или встроенную логику модуля объекта в базе-приемнике.


// В обработчике ПКО "При загрузке"
Объект.ДополнительныеСвойства.Вставить("ЭтоНовыйОбъектИзКонвертации", Не ОбъектНайден);

Управление поиском через обработчик «Поля поиска»

Рассмотрим ситуацию, когда поиск по наименованию и владельцу может быть неоднозначным. В КД 2.1 есть мощный инструмент — обработчик «Поля поиска» в ПКО. С его помощью можно реализовать кастомную проверку на существование объекта. Для этой задачи можно использовать пример настройки поиска при загрузке по дополнительному реквизиту.

Например, мы хотим сначала найти договор по номеру, а если не нашли — по наименованию. Для этого используется параметр НомерВарианта. Проанализируем логику:

  1. Если НомерВарианта = 1, проверяем наличие номера в данных поиска.
  2. Если объект не найден, система увеличивает НомерВарианта и вызывает обработчик снова.
  3. Если мы нашли объект программно (например, запросом), мы можем присвоить его ссылке параметр Ссылка и установить ПрекратитьПоиск = Истина.

Резюмируем: для эффективной работы с новыми объектами в КД 2.1 программисту достаточно освоить использование параметра ОбъектНайден в обработчиках загрузки и механизм ВходящиеДанные для передачи контекста. Это позволяет создавать гибкие и надежные правила обмена, которые корректно обрабатывают как обновление существующих данных, так и создание новой нормативно-справочной информации.

← На главную