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