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