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