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