Как исключить определенные документы из обмена между УТ 11.5 и БП 3.0 при использовании КД 3.0

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

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

В этой статье мы подробно разберем, как грамотно реализовать запрет на выгрузку документов, проанализируем механизмы регистрации объектов и выясним, какие инструменты платформы 1С и БСП (Библиотеки стандартных подсистем) лучше всего подходят для этой цели.

Понимание механизма регистрации в КД 3.0

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

  1. Регистрация изменений: Когда документ записывается, срабатывает подписка на событие (например, СинхронизацияДанныхЧерезУниверсальныйФорматРегистрацияДокумента). Она определяет, нужно ли ставить ссылку на этот объект в таблицу регистрации (регистр сведений ИзмененияОбщихДанныхУзлов или аналогичные).
  2. Выгрузка данных: При запуске синхронизации система считывает зарегистрированные изменения и преобразует их в формат XDTO согласно правилам обмена.

Наша задача — либо предотвратить регистрацию на первом этапе, либо «отсечь» выгрузку на втором. Рассмотрим наиболее эффективные способы.

Способ 1. Использование расширения и флага ОтключитьМеханизмРегистрацииОбъектов

Это самый «чистый» и современный способ, который позволяет избежать изменения типового кода. В БСП заложен механизм, который проверяет наличие определенных флагов в ДополнительныеСвойства объекта перед его регистрацией. Рассмотрим подробнее, как это реализовать.

Разберем по шагам:

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

Посмотрим на пример кода, который нужно разместить в расширении:


&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Определяем условие, по которому документ не должен уходить в обмен
    Если ЭтотОбъект.Организация.Наименование = "Техническая организация" Тогда
        // Устанавливаем специальное свойство БСП, которое блокирует автоматическую регистрацию
        ЭтотОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
    КонецЕсли;
КонецПроцедуры

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

Способ 2. Управление регистрацией через очистку получателей

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

Рассмотрим пример реализации в расширении для процедуры ПередЗаписью:


&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Если документ соответствует критериям исключения
    Если ЭтотОбъект.ПометкаУдаления Тогда 
        // В некоторых случаях мы не хотим выгружать даже помеченные на удаление
        ЭтотОбъект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
        ЭтотОбъект.ОбменДанными.Получатели.Очистить();
    КонецЕсли;
КонецПроцедуры

Установка АвтоЗаполнение = Ложь предотвращает автоматическое добавление узлов обмена в список получателей при записи объекта. Это гарантирует, что объект не попадет в таблицу регистрации изменений.

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

Хотя сам обмен идет через КД 3.0, правила регистрации объектов (ПР) в типовых решениях часто по-прежнему настраиваются через конфигурацию «Конвертация данных 2.0». Выясним, как изменить логику без программирования в самой базе.

Разберем процесс по шагам:

  1. Заходим в «Параметры синхронизации данных» — «Состав отправляемых данных».
  2. Находим возможность выгрузить типовые правила регистрации в XML-файл.
  3. Загружаем этот XML в конфигурацию «Конвертация данных 2.0».
  4. В правилах регистрации для конкретного документа прописываем условие в обработчике ПередОбработкой. Например:
    
    Если Объект.СуммаДокумента < 100 Тогда
        Отказ = Истина;
    КонецЕсли;
    
  5. Выгружаем измененные правила из КД 2.0 и загружаем их обратно в УТ 11.5 как внешние правила регистрации.

Важный нюанс: В современных версиях УТ в правилах регистрации часто стоит флаг Авторегистрация = Ложь, а сама логика вынесена в подписки. В этом случае правка XML-правил не поможет, и нужно возвращаться к способам с расширениями (Способ 1 и 2).

Способ 4. Использование событий модуля менеджера обмена (ПОД)

Если документ все же зарегистрировался (например, вы хотите исключить уже существующие в очереди регистрации документы), можно вмешаться в процесс самой выгрузки. В КД 3.0 за выгрузку отвечают Правила обработки данных (ПОД), которые обычно описаны в общем модуле МенеджерОбменаЧерезУниверсальныйФормат.

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


&Перед("Пр_ПередОбработкойДанных")
Процедура Расш1_Пр_ПередОбработкойДанных(ДанныеИБ, Использование, Отказ, ...)
    // Проверяем тип данных
    Если ТипЗнч(ДанныеИБ) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
        Если ДанныеИБ.Склад.Наименование = "Архив" Тогда
            Отказ = Истина; // Объект не будет выгружен в XML/JSON
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Резюме и рекомендации

Подведем итог нашему анализу:

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

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

← На главную