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