Как предотвратить регистрацию изменений документа в планах обмена 1С при программной перезаписи?

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

При разработке интеграций и фоновых алгоритмов часто возникает задача: программно обновить реквизит в документе без отправки этого изменения в другие информационные базы через планы обмена. Типичной ошибкой является попытка использовать для этих целей свойство ОбменДанными.Загрузка = Истина. Разберем, почему данный механизм не отменяет регистрацию изменений и как правильно управлять регистрацией объектов в планах обмена платформы 1С:Предприятие.

Почему свойство ОбменДанными.Загрузка не исключает документ из обмена

Проанализируем назначение свойства ОбменДанными.Загрузка. Установка значения Истина сообщает платформе и конфигурации, что текущая запись объекта происходит в режиме загрузки данных из внешнего источника. Это приводит к следующим системным эффектам:

  1. Отключаются стандартные проверки платформы (например, проверка заполнения обязательных реквизитов).
  2. Отключается автоматическое формирование проводок и движений по регистрам, если документ записывается без проведения.
  3. В обработчиках событий (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) разработчики типовых и нетиповых конфигураций обычно ставят проверку:
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    

Важно понимать: механизм регистрации изменений в планах обмена работает независимо от свойства ОбменДанными.Загрузка. Если в метаданных плана обмена для конкретного документа свойство Авторегистрация установлено в значение Разрешить, платформа автоматически зарегистрирует изменение объекта для всех узлов при вызове метода Записать().

Способ 1. Отключение автозаполнения списка получателей при записи

Рассмотрим основной и наиболее быстрый способ отключения регистрации изменений при программной перезаписи объекта. У каждого объекта конфигурации свойство ОбменДанными содержит коллекцию Получатели, которая управляет набором узлов, куда будет зарегистрировано изменение.

Чтобы платформа не добавляла узлы плана обмена автоматически, достаточно отключить автозаполнение получателей перед вызовом записи:


ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДокументОбъект.НомерДокументаНачисления = НомерОтвета;

// Отключаем автоматическое добавление узлов в список получателей
ДокументОбъект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
ДокументОбъект.ОбменДанными.Получатели.Очистить();

ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

В этом случае документ будет успешно записан в текущей базе, но таблица изменений планов обмена останется нетронутой, и документ не попадет в следующий сеанс синхронизации.

Способ 2. Программное удаление регистрации изменений после записи

Если объект уже был записан или логика конфигурации требует выполнения стандартных подписок, можно удалить зарегистрированные изменения с помощью менеджера планов обмена.

Посмотрим на пример удаления регистрации для конкретного узла:


// Удаление регистрации для одного выбранного узла
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, ДокументСсылка);

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


ВыборкаУзлов = ПланыОбмена.ПланОбменаСБухгалтерией.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
    // Исключаем предопределенный узел "ЭтотУзел"
    Если ВыборкаУзлов.Ссылка <> ПланыОбмена.ПланОбменаСБухгалтерией.ЭтотУзел() Тогда
        ПланыОбмена.УдалитьРегистрациюИзменений(ВыборкаУзлов.Ссылка, ДокументСсылка);
    КонецЕсли;
КонецЦикла;

Способ 3. Перевод плана обмена на выборочную (ручную) авторегистрацию

Если специфика бизнес-процессов регулярно требует выборочной регистрации документов, проанализируем архитектурное решение на уровне метаданных:

  1. В дереве конфигурации откроем нужный ПланОбмена и перейдем на вкладку Состав.
  2. Для нужного документа изменим свойство Авторегистрация со значения Разрешить на Запретить.
  3. В подписке на событие ПередЗаписьюДокумента или ПриЗаписиДокумента опишем явные правила регистрации. Например, будем добавлять узел в коллекцию ОбменДанными.Получатели только при интерактивном изменении ключевых реквизитов пользователем, игнорируя служебные фоновые обновления.
← На главную