В чем заключаются особенности настройки правил обмена КД 2.0 при использовании БСП и почему результаты могут отличаться от универсальной обработки?

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

Разработка правил обмена в конфигурации «Конвертация данных 2.1» — это стандарт де-факто для интеграции систем на платформе 1С. Однако многие разработчики сталкиваются с ситуацией, когда правила, идеально работающие в обработке УниверсальныйОбменДаннымиXML, ведут себя совершенно иначе при запуске через механизмы БСП (Библиотека стандартных подсистем). Это вызывает путаницу, ошибки поиска и дублирование данных.

В этой статье мы подробно разберем, почему один и тот же файл правил выдает разный результат, и на что нужно обратить внимание при проектировании обмена через БСП.

1. Разница в типе данных переменной «Источник»

Проанализируем одно из самых фундаментальных отличий, которое часто ломает обработчики событий. В стандартной обработке УниверсальныйОбменДаннымиXML при выгрузке данных переменная Источник чаще всего представляет собой ДокументОбъект или СправочникОбъект. Это позволяет обращаться к табличным частям, модифицировать объект перед выгрузкой или проверять его свойства напрямую.

В случае использования планов обмена и БСП ситуация меняется. Движок обмена БСП (обработка ОбменДаннымиXML) работает с выборками из планов обмена, где Источник — это Ссылка (ДокументСсылка, СправочникСсылка). Рассмотрим, к чему это приводит:

  1. Если в вашем коде в обработчике «Перед выгрузкой» есть обращение к свойствам через точку от ссылки, это провоцирует неявный запрос к базе данных, что замедляет обмен.
  2. Если вы пытаетесь обратиться к методам объекта (например, Источник.Метаданные().Имя), это может отработать по-разному в зависимости от того, объект это или ссылка.

Совет: Всегда проверяйте тип источника и, если вам необходим именно объект, получайте его явно, хотя для БСП-обменов лучше стараться работать со ссылочными данными.

2. Использование регистра «Соответствие объектов для обмена»

Выясним, почему настройки поиска в КД 2.0 могут игнорироваться. Это, пожалуй, самое «коварное» отличие БСП от универсальной обработки.

В универсальном обмене поиск идет строго по алгоритму: сначала по Уникальному Идентификатору (GUID), затем по полям поиска, указанным в правилах. В БСП же реализован механизм регистрации соответствий.

Разберем по шагам, как ищет объект БСП:

  1. Проверяется наличие записи в регистре сведений СоответствиеОбъектовДляОбмена. Если там найдена связь между GUID источника и GUID приемника, объект сопоставляется мгновенно.
  2. Внимание: Если запись в регистре есть, БСП может вообще не смотреть на ваши настройки «Поля поиска» в правилах конвертации.
  3. Только если в регистре ничего не найдено, вступает в силу стандартный механизм поиска КД.

Это объясняет ситуации, когда вы изменили поля поиска в правилах (например, решили искать контрагента по ИНН вместо Наименования), но система продолжает «склеивать» объекты по-старому. Чтобы применить новые правила поиска, иногда требуется очистить старые связи в регистре соответствий.

3. Особенности работы Правил выгрузки данных (ПВД)

Рассмотрим ситуацию с выгрузкой. В «Универсальном обмене» ПВД являются отправной точкой: вы выбираете ПВД, и обработка выполняет запрос или алгоритм, указанный там. В обмене по стандартам БСП логика иная:

4. Безопасный режим и ограничения кода

Проанализируем еще один важный аспект — безопасный режим. В современных версиях БСП код обработчиков (например, «После загрузки» или «При поиске») часто выполняется в безопасном режиме платформы.

Это накладывает жесткие ограничения:

  1. Запрещены прямые вызовы процедур из привилегированных модулей (если они не помечены соответствующим образом).
  2. Запрещена работа с файловой системой и внешними компонентами (COM-объекты, ADO).
  3. Ограничен доступ к некоторым системным методам.

Если в УниверсальныйОбменДаннымиXML (запущенном под полными правами) ваш код успешно записывает лог в текстовый файл на диске, то в БСП этот же код вызовет исключение и прервет обмен.

5. Выполнение кода на стороне получателя

В типовых обменах БСП часто используется механизм «Выполнять код на стороне получателя». Рассмотрим, что это значит для нас:

Для корректной работы алгоритмов (обработчиков «При загрузке», «После загрузки») правила обмена должны быть загружены в обе базы — и в источник, и в приемник. В «Универсальном обмене» вы просто указываете один файл правил в обработке. В БСП, если вы обновили алгоритм загрузки в правилах на стороне источника, но не обновили правила в справочнике «Правила конвертации объектов» на стороне приемника, вы получите старое поведение системы.

6. Параметры обмена

В «Универсальном обмене» параметры заполняются на специальной вкладке формы. В БСП параметры инициализируются программно. Разберем пример, как это происходит:

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

7. Пакетная запись и транзакции

Выясним причину, по которой ошибки в БСП-обмене бывает сложнее локализовать. БСП загружает данные пакетами (по умолчанию, например, по 200 объектов в одной транзакции). Это делается для ускорения процесса.

Однако, если один объект из этих 200 вызывает ошибку на уровне платформы (например, нарушение прав или проверка заполнения), откатывается вся транзакция. В «Универсальном обмене» вы можете отключить использование транзакций для поиска конкретного проблемного объекта, в БСП это требует изменения настроек узла обмена.

Пример проверки типа источника для универсальности

Чтобы ваши правила работали стабильно и там, и там, рекомендуется использовать проверку типа в начале тяжелых обработчиков:


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

Если ОбъектДляРаботы <> Неопределено Тогда
    // Выполняем логику
    Сообщить("Обрабатываем: " + ОбъектДляРаботы.Номер);
КонецЕсли;

Подведем итоги

Для успешного внедрения обмена через БСП мы рекомендуем соблюдать следующие правила:

  1. Тестируйте в контексте: Никогда не ограничивайтесь тестами в универсальной обработке. Всегда делайте финальную проверку через «Синхронизацию данных» в интерфейсе программы.
  2. Следите за регистрами: Если объект сопоставляется неправильно — проверьте СоответствиеОбъектовДляОбмена.
  3. Синхронизируйте версии правил: Обновили правила — загрузите их в обе базы.
  4. Избегайте сложности в ПВД: Всю логику отбора лучше переносить в правила регистрации данных (ПРД) или в обработчики ПКО.

Понимание этих архитектурных нюансов позволит вам создавать надежные интеграции, которые не «рассыплются» при переходе от ручного запуска к автоматической синхронизации по расписанию.

← На главную