Как настроить выгрузку сотрудников из ЗУП 3.1 в УАТ 2.2 только при наличии определенного флага

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

При настройке типовой синхронизации между конфигурациями «Зарплата и управление персоналом 3.1» и «Управление автотранспортом 2.2» часто возникает задача ограничить состав передаваемых данных. В нашем случае необходимо реализовать механизм, при котором из ЗУП выгружаются только те сотрудники, у которых установлен специальный признак (флаг) ВыгружатьВУАТ. Поскольку современные обмены строятся на базе технологии EnterpriseData (Универсальный формат), решение задачи требует понимания работы механизмов регистрации изменений и менеджера обмена.

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

Способ 1. Использование подписки на событие для контроля регистрации изменений

Самый оперативный способ управления составом данных — это вмешательство в процесс регистрации изменений. Когда пользователь записывает объект (в нашем случае справочник Сотрудники), система должна определить, нужно ли отправлять этот объект в конкретный узел плана обмена. Рассмотрим, как это реализовать.

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

Рассмотрим пример программного кода, который можно разместить в обработчике события ПередЗаписью или в специализированной подписке на регистрацию изменений:


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

Важный нюанс: использование прямой отмены регистрации в событии ПередЗаписью может быть неэффективным, так как типовой механизм может зарегистрировать изменения позже. Поэтому лучше всего ориентироваться на специализированные процедуры БСП, такие как СинхронизацияДанныхЧерезУниверсальныйФорматЗарегистрироватьИзменение.

Способ 2. Модификация менеджера обмена через универсальный формат

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

Разберем по шагам, как найти нужное место для доработки. В КД 3.0 (Конвертация данных 3) для каждого объекта определены процедуры ПРЕД (Правила регистрации), ПОД (Правила обработки данных) и ПВД (Правила выгрузки данных). Нам интересна процедура ПОД_Справочник_Сотрудники_Отправка_ПриОбработке.

Проанализируем пример доработки этой процедуры:


Процедура ПОД_Справочник_Сотрудники_Отправка_ПриОбработке(ДанныеИБ, Использование, КомпонентыОбмена) Экспорт
    
    // Проверяем значение флага в объекте
    // ДанныеИБ — это структура или объект сотрудника
    
    Если ДанныеИБ.ВыгружатьВУАТ = Ложь Тогда
        // Отменяем отправку объекта
        Использование = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Важное предупреждение: этот метод имеет «подводный камень». Если вы просто установите Использование = Ложь, объект перестанет выгружаться, но запись о его изменении останется в таблице регистрации плана обмена. При каждой следующей синхронизации система будет пытаться его выгрузить, снова вызывать этот код и снова пропускать. Если таких объектов много, это приведет к существенному замедлению обмена. Рекомендуется в этом же блоке кода программно удалять регистрацию объекта для текущего узла обмена.

Способ 3. Использование Правил регистрации объектов (ПРО) в КД 3.0

Наиболее «правильным» с точки зрения архитектуры 1С является редактирование Правил регистрации объектов. Эти правила хранятся отдельно от кода модулей и загружаются в информационную базу как XML-файл (или входят в состав конфигурации).

Выясним, как это работает в КД 3.0. В правилах регистрации для справочника Сотрудники можно задать условие регистрации. Это позволит отсечь лишние данные еще на этапе записи объекта в базу, не создавая лишних записей в таблицах ПланыОбмена.

Рассмотрим логику, которую нужно прописать в правилах регистрации:

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

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

Анализ ситуации с COM-соединением

Выясним причину возможной путаницы. В первом сообщении упоминается «типовая синхронизация по COM». Важно различать два случая:

  1. Обмен через КД 2.0: Это старый формат, где используются файлы правил xml. Там фильтрация настраивается в ПВД (Правилах выгрузки данных) с помощью параметра Отказ = Истина.
  2. EnterpriseData через COM-канал: Это современный способ, где COM используется только как транспорт для передачи данных в формате EnterpriseData. В этом случае работают все советы, описанные выше (менеджер обмена и КД 3.0).

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

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

Подведем итоги нашего исследования. Для фильтрации сотрудников по флагу ВыгружатьВУАТ у вас есть три пути:

Рассмотрим вариант с определением узла. Так как в базе может быть несколько синхронизаций (например, с Бухгалтерией и с УАТ), в коде всегда нужно проверять, для какого узла мы фильтруем данные:


// Пример проверки имени плана обмена или кода узла
ИмяПлана = ПланОбменаОбъект.Метаданные().Имя;
Если ИмяПлана = "СинхронизацияДанныхЧерезУниверсальныйФормат" Тогда
    // Дополнительная проверка на то, что это именно узел УАТ
    Если СокрЛП(Узел.Наименование) = "Управление автотранспортом" Тогда
        // Применяем фильтр
    КонецЕсли;
КонецЕсли;

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

← На главную