При настройке правил обмена в среде 1С:Конвертация данных 2.1 (КД 2.1) программисты часто сталкиваются с задачей выборочного заполнения реквизитов. Типичный сценарий: если объект (например, договор контрагента) уже существует в базе-приемнике, его трогать не нужно, а если он создается «с нуля», необходимо инициализировать ряд специфических полей. Ситуация осложняется, когда данные для этих полей зависят от контекста другого объекта (например, документа поступления), который и инициировал создание этого договора. Если подготовленные правила в дальнейшем будут применяться для регулярной синхронизации баз, автоматизировать процесс их выполнения по расписанию можно через программу регулярного обмена данными между конфигурациями 1С.
В этой статье мы подробно разберем, как программно определить статус объекта (новый или найденный), как управлять процессом перезаписи и как элегантно передавать данные между различными правилами конвертации объектов (ПКО).
Самый простой способ, не требующий написания кода, — это использование стандартных настроек ПКО. Проанализируем, как работает этот механизм. В настройках Правила конвертации объектов на закладке «Основные» есть флаг «Не замещать существующие объекты в приемнике (освежать только пустые)».
Если этот флаг установлен:
Рассмотрим нюанс: даже если установлена эта «галочка», обработчики событий (такие как ПриЗагрузке или ПослеЗагрузки) все равно будут выполнены. Это дает нам гибкость: мы можем запретить автоматическое замещение, но прописать индивидуальную логику обновления конкретных реквизитов в коде.
Если логика сложнее, чем просто «не перезаписывать», нам на помощь приходят обработчики ПКО. В КД 2.1 для платформы 1С:Предприятие 8 существует специальный параметр ОбъектНайден. Выясним, как использовать его в разных событиях.
Обработчик «При загрузке»
Это событие выполняется сразу после того, как система попыталась идентифицировать объект в базе-приемнике. Если объект был найден по уникальному идентификатору (GUID) или полям поиска, параметр ОбъектНайден примет значение Истина. Если поиск не дал результатов — Ложь.
Проанализируем пример кода в обработчике ПриЗагрузке:
Если Не ОбъектНайден Тогда
// Здесь мы понимаем, что объект новый.
// Можно инициализировать Объект какими-то значениями по умолчанию
// до того, как в него начнут записываться данные из файла.
Сообщить("Будет создан новый договор");
Иначе
// Объект найден. Можно решить, нужно ли нам его изменять.
// Если мы установим параметр НеЗамещатьОбъект в Истина,
// система не будет записывать свойства из файла.
НеЗамещатьОбъект = Истина;
КонецЕсли;
Обработчик «После загрузки»
Этот обработчик вызывается, когда все свойства объекта из файла уже прочитаны и установлены в памяти, но сам объект еще не записан в базу данных. Здесь параметр ОбъектНайден также доступен. Это идеальное место для «финальной шлифовки» нового объекта. Для удобного написания кода в событиях правил подойдёт конфигурация КД 2.1 с подсказками по обработчикам.
Разберем ситуацию, когда при создании договора в ПКО нам нужны данные из документа-основания (например, информация о ставке НДС или специфический признак из шапки накладной). Прямого доступа к объекту-родителю из ПКО подчиненного справочника нет. Для этого используется связка параметров ИсходящиеДанные и ВходящиеДанные.
Посмотрим на алгоритм реализации по шагам:
Перед выгрузкой формируем структуру с нужными нам данными:
// ПКС Документа (свойство ДоговорКонтрагента) -> Перед выгрузкой
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("СуммаВключаетНДС", Объект.СуммаВключаетНДС);
ИсходящиеДанные.Вставить("ОрганизацияДляДоговора", Объект.Организация);
При загрузке или После загрузки) переданная структура будет доступна в параметре ВходящиеДанные.
// ПКО Договора -> После загрузки
Если ТипЗнч(ВходящиеДанные) = Тип("Структура") Тогда
Если Не ОбъектНайден Тогда
// Заполняем реквизиты нового договора данными из документа
Объект.Комментарий = "Создан автоматически на основании документа с НДС: " + ВходящиеДанные.СуммаВключаетНДС;
Объект.Организация = ВходящиеДанные.ОрганизацияДляДоговора;
КонецЕсли;
КонецЕсли;
Важное замечание: всегда проверяйте ТипЗнч(ВходящиеДанные). Договор может выгружаться из разных мест (из другого документа или справочника), где ИсходящиеДанные не были заполнены. В этом случае ВходящиеДанные будут равны Неопределено, что приведет к ошибке при попытке обращения к свойствам структуры.
Иногда логика заполнения должна сохраняться на протяжении всей цепочки событий, вплоть до записи объекта. В этом случае удобно использовать стандартный механизм платформы 1С — ДополнительныеСвойства объекта.
Посмотрим, как это работает: в обработчике При загрузке мы можем поместить информацию в объект, которая «доживет» до момента записи. Это удобно, если вы используете подписки на события или встроенную логику модуля объекта в базе-приемнике.
// В обработчике ПКО "При загрузке"
Объект.ДополнительныеСвойства.Вставить("ЭтоНовыйОбъектИзКонвертации", Не ОбъектНайден);
Рассмотрим ситуацию, когда поиск по наименованию и владельцу может быть неоднозначным. В КД 2.1 есть мощный инструмент — обработчик «Поля поиска» в ПКО. С его помощью можно реализовать кастомную проверку на существование объекта. Для этой задачи можно использовать пример настройки поиска при загрузке по дополнительному реквизиту.
Например, мы хотим сначала найти договор по номеру, а если не нашли — по наименованию. Для этого используется параметр НомерВарианта. Проанализируем логику:
НомерВарианта = 1, проверяем наличие номера в данных поиска.НомерВарианта и вызывает обработчик снова.Ссылка и установить ПрекратитьПоиск = Истина.Резюмируем: для эффективной работы с новыми объектами в КД 2.1 программисту достаточно освоить использование параметра ОбъектНайден в обработчиках загрузки и механизм ВходящиеДанные для передачи контекста. Это позволяет создавать гибкие и надежные правила обмена, которые корректно обрабатывают как обновление существующих данных, так и создание новой нормативно-справочной информации.