Как отфильтровать документы перед началом обмена между УТ и БП?

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

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

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

Вариант 1. Редактирование Правил регистрации объектов (ПРО)

Проанализируем самый "типовой" способ, который не требует изменения кода конфигурации. Во многих современных обменах фильтрация реализована не в правилах выгрузки, а в правилах регистрации. Если объект не зарегистрирован на узле обмена, он в принципе не попадет в выборку для отправки.

  1. Переходим в режим предприятия в раздел настроек синхронизации данных.
  2. Выгружаем текущие Правила регистрации объектов (ПРО) в виде XML-файла.
  3. Открываем конфигурацию «Конвертация данных 2» (КД2), загружаем туда ПРО и находим правило для документа реализации.
  4. Добавляем программное условие: перед регистрацией делаем быстрый запрос к базе на наличие связанного проведенного Счета-фактуры. Если документа нет — отказываем в регистрации.
  5. Сохраняем новые правила и загружаем их обратно в базу УТ в пользовательском режиме.

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

Вариант 2. Управление регистрацией через события документов (Расширения)

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

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

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

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

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

Важно: Таким образом реализации без счетов-фактур вообще никогда не попадут в таблицу регистрации изменений, что сильно разгрузит обмен.

Вариант 3. Перехват выгрузки в универсальном формате (КД3)

Посмотрим на ситуацию, если мы используем современный обмен через формат EnterpriseData (КД3). Вся логика выгрузки содержится в общих модулях, а не в XML-правилах. Перехватить выгрузку можно прямо перед формированием сообщения обмена.

Для этого в расширении можно подключиться к общему модулю МенеджерОбменаЧерезУниверсальныйФормат. Нас интересуют процедуры-обработчики отправки данных, например, ПриОтправкеДанныхПодчиненному или конкретные обработчики объектов ПОД_Документ_РеализацияТоваровУслуг_Отправка.

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


Если ТипЗнч(ДанныеИБ) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
    ЕстьСчетФактура = ПроверитьНаличиеСчетаФактуры(ДанныеИБ);
    Если Не ЕстьСчетФактура Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Данный подход хорош тем, что даже если пользователь решит воспользоваться «ручным обменом» и интерактивно добавит документы в список выгрузки, платформа все равно выполнит нашу проверку и документ не попадет в итоговый XML-файл.

Вариант 4. Использование переопределяемых модулей БСП

Библиотека стандартных подсистем (БСП) предоставляет нам общий модуль ОбменДаннымиПереопределяемый. В нем присутствует процедура ПриВыгрузкеДанных. Разберем этот инструмент: он вызывается подсистемой обмена непосредственно перед сериализацией данных. Через расширение в этой процедуре можно модифицировать выборку.

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

Итог: Мы рассмотрели несколько надежных способов. Если задача стоит разово и не хочется лезть в код — используйте редактирование правил регистрации (ПРО). Если же вам нужно жестко ограничить обмен и предотвратить отправку документов даже в ручном режиме обмена — переопределите логику регистрации ПриЗаписи счета-фактуры или добавьте перехватчик в МенеджерОбменаЧерезУниверсальныйФормат через механизм расширений.

← На главную