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