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