Как ограничить выгрузку документов по типам хозяйственных операций при синхронизации через EnterpriseData?

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

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

Разберем основные способы реализации такого отбора: через модуль менеджера обмена (ПОД в КД 3), правила регистрации объектов (ПРО в КД 2.1), а также через механизмы подписок на события и расширения.

Способ 1. Фильтрация в модуле менеджера обмена через обработчик ПОД

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

В этой процедуре платформа определяет, по какому именно правилу конвертации объекта (ПКО) будет сериализован документ, заполняя структуру ИспользованиеПКО. Чтобы исключить ненужные операции, проанализируем значение реквизита ХозяйственнаяОперация выгружаемого объекта.

Рассмотрим пример кода для модификации обработчика ПОД:


// В процедуре ПОД_Документ_РасходныйКассовыйОрдер_ПриОбработке
// Проверяем тип хозяйственной операции выгружаемого документа
Если ДанныеИБ.ХозяйственнаяОперация <> Перечисления.ХозяйственныеОперации.ВыдачаДенежныхСредствПодотчетнику
	И ДанныеИБ.ХозяйственнаяОперация <> Перечисления.ХозяйственныеОперации.ВыплатаЗаработнойПлаты Тогда
	
	// Отключаем обработку документа
	Отказ = Истина;
	Возврат;
	
КонецЕсли;

Обратим внимание на важный нюанс: если просто принудительно установить во всех ключах структуры ИспользованиеПКО значение Ложь, механизм EnterpriseData в некоторых версиях БСП может продолжить попытку формирования пустого XDTO-пакета, что приведет к ошибке проверки схемы. Кроме того, если для ПОД включено свойство ОчисткаДанных, отключение всех ПКО может быть расценено как удаление объекта в источнике, из-за чего в базе-приемнике будет инициировано удаление документа. Поэтому наиболее корректным способом является явное прерывание обработки через флаг Отказ = Истина или переопределение ветвления условий для нужных ПКО.

Способ 2. Ограничение через правила регистрации объектов (ПРО)

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

Разберем по шагам, как настроить правила регистрации:

  1. Выгружаем метаданные конфигурации источника (УТ 11) с помощью штатной обработки MD83Exp.epf.
  2. Загружаем структуру метаданных и текущие правила регистрации в «Конвертацию данных 2.1».
  3. Находим правило регистрации для документа РасходныйКассовыйОрдер.
  4. В обработчике события ПередОбработкойПравила или в таблице отборов настраиваем условие по реквизиту ХозяйственнаяОперация.
  5. Сохраняем правила в XML-файл.
  6. В режиме «1С:Предприятие» переходим в настройки синхронизации данных, открываем меню параметров обмена и загружаем обновленные правила через команду Загрузить правила регистрации данных.

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

Способ 3. Перехват регистрации через подписки на события и расширения

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

Посмотрим на два практических варианта реализации:

  1. Использование расширения для перехвата ПОД: создаем расширение, подключаем общий модуль МенеджерОбменаЧерезУниверсальныйФормат и перехватываем процедуру ПОД_Документ_РасходныйКассовыйОрдер_ПриОбработке с аннотацией &Вместо или &ИзменениеИКонтроль, внедряя проверку реквизита ХозяйственнаяОперация.
  2. Доработка подписки перед регистрацией: используем обработчик подписки ПередЗаписьюДокументаДляРегистрации либо переопределяемый модуль ОбменДаннымиПереопределяемый / ПравилаРегистрацииОбъектовПереопределяемый. В коде анализируем имя плана обмена и значение хозяйственной операции:

// Пример проверки в подписке на событие регистрации
Если Источник.ХозяйственнаяОперация <> Перечисления.ХозяйственныеОперации.ВыдачаДенежныхСредствПодотчетнику
	И Источник.ХозяйственнаяОперация <> Перечисления.ХозяйственныеОперации.ВыплатаЗаработнойПлаты Тогда
	
	// Отменяем регистрацию изменения для конкретного плана обмена
	ПланыОбмена.УдалитьРегистрациюИзменений(УзелПланаОбмена, Источник.Ссылка);
	
КонецЕсли;

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

← На главную