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