Как в УТ 11 запретить регистрацию документа к обмену при изменении отдельного реквизита

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

При переходе с конфигурации 1С:Управление торговлей 11.1 на 1С:Управление торговлей 11.3 (и выше) разработчики часто сталкиваются с изменением поведения синхронизации данных: при изменении добавленного пользовательского реквизита документ автоматически регистрируется к отправке в 1С:Бухгалтерию предприятия 3.0, даже если этот реквизит отсутствует в правилах выгрузки. Разберем причины такого поведения платформы и Библиотеки стандартных подсистем (БСП), а также рассмотрим практические способы решения этой задачи.

Почему изменилось поведение обмена между версиями УТ

Проанализируем ключевые архитектурные различия между версиями конфигурации:

  1. Переход на EnterpriseData (КД 3.0): В УТ 11.1 типовой обмен строился на базе классических правил конвертации данных (КД 2.0). Механизм обмена поддерживал выборочную регистрацию объектов (ВРО) — при записи проверялось, изменились ли поля, входящие в состав правил конвертации. Если менялись только внутренние реквизиты, регистрация не выполнялась.
  2. Отказ от выборочной проверки полей в EnterpriseData: В УТ 11.3 обмен выполняется через универсальный формат в модуле МенеджерОбменаЧерезУниверсальныйФормат. Для универсального формата выборочная проверка состава измененных полей «из коробки» отключена разработчиками ради оптимизации скорости проведения документов.
  3. Особенность планов обмена 1С: На уровне платформы факт изменения фиксируется для объекта целиком. В БСП подписки на события (например, ЗарегистрироватьИзмененияПередЗаписьюДокумента) регистрируют весь документ при любой его перезаписи или проведении, если в коде не задан явный отказ.

Способ 1. Вынос реквизита в независимый регистр сведений (Рекомендуемый)

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

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

При таком подходе сам объект документа не перезаписывается (метод Записать() для документа не вызывается), а независимый регистр не включен в состав плана обмена. В результате документ гарантированно не регистрируется к отправке.

Способ 2. Использование механизма «Дополнительные сведения»

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

Важно различать Дополнительные реквизиты и Дополнительные сведения:

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

Способ 3. Модификация правил регистрации объектов (ПРО)

Если реквизит обязательно должен оставаться в составе реквизитов документа, настроим правила регистрации объектов (ПРО) в конфигурации «Конвертация данных»:

  1. Открываем правила регистрации объектов для плана обмена с БП 3.0.
  2. Находим правило для нужного документа и переходим в обработчик события «Перед обработкой» или «При обработке».
  3. Сравниваем текущие значения реквизитов объекта в памяти с данными, уже записанными в информационной базе.
  4. Если установлено, что изменился исключительно добавленный реквизит, программно выставляем флаг отказа:

// В обработчике правил регистрации объектов
Если ЭтоТолькоИзменениеСлужебногоРеквизита(Объект) Тогда
    Отказ = Истина;
КонецЕсли;

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

Если изменение реквизита выполняется программно (в обработке или регламентном задании), подавим регистрацию изменений через свойство ОбменДанными перед вызовом метода записи:


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.НашСлужебныйРеквизит = НовоеЗначение;

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

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

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

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

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

← На главную