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

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

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

Разберем причины такого поведения платформы и детально рассмотрим все доступные способы решения этой задачи в зависимости от архитектуры конфигурации.

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

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

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

Способ 1. Управление коллекцией получателей (штатный механизм платформы)

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

Чтобы исключить попадание узлов в эту коллекцию, перед вызовом метода Записать() необходимо отключить автозаполнение и очистить список узлов:


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

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

Важный нюанс: если документ при проведении или записи формирует движения по регистрам, платформа может зарегистрировать наборы записей этих регистров. В таком случае необходимо отключить автозаполнение получателей и у наборов записей движений документа:


Для Каждого НаборЗаписей Из ДокументОбъект.Движения Цикл
    НаборЗаписей.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
    НаборЗаписей.ОбменДанными.Получатели.Очистить();
КонецЦикла;

Способ 2. Отключение регистрации средствами Библиотеки стандартных подсистем (БСП)

Если разработка ведется в типовой конфигурации на базе БСП (например, 1С:ERP, 1С:УТ, 1С:КА, 1С:УНФ, 1С:Бухгалтерия), регистрация объектов дополнительно управляется подписками на события подсистемы обмена данными. В этом случае платформенного отключения автозаполнения может быть недостаточно, так как логика БСП зарегистрирует объект через свои обработчики.

Посмотрим на штатный механизм БСП: перед записью объекта достаточно передать специальный флаг в структуру дополнительных свойств:


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

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

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

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

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

Способ 3. Использование правил регистрации объектов (ПРО)

В сценариях, где регистрация зависит от реквизитов документа или признаков бизнес-логики, правильнее вынести условия в правила регистрации объектов (конфигурация «Конвертация данных 2.0 / 3.0»):

  1. Открываем правила регистрации для нужного плана обмена.
  2. В обработчике события ПередОбработкой или ПриОбработке описываем условие исключения объекта из выгрузки.
  3. Устанавливаем флаг Отказ = Истина, если документ не должен передаваться в целевые узлы.

Способ 4. Удаление регистрации изменений после записи

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


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

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

Этот метод гарантированно очищает таблицы изменений, однако создает небольшую избыточную нагрузку на базу данных из-за повторного обращения к таблицам регистрации.

Итоги и рекомендации

Выясним оптимальный алгоритм выбора решения:

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