Почему правила конвертации КД 2.1 работают в универсальном обмене, но не переносят партнеров и контрагентов через планы обмена?

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

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

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

---

В чем разница между ручным обменом и планами обмена БСП?

Для того чтобы понять, почему один и тот же файл правил XML дает разный результат, проанализируем архитектуру выполнения обмена в обоих случаях.

  1. Ручной режим (Универсальный обмен данными XML):

    При использовании этой обработки весь процесс загрузки выполняется непосредственно в сеансе текущего пользователя («НаКлиенте» / «НаСервере»). Обработка считывает XML-файл данных, разбирает его структуру, последовательно находит или создает объекты и сразу же выполняет все обработчики событий (такие как ПередЗагрузкой, ПриЗагрузке, ПослеЗагрузки), описанные в правилах.

  2. Автоматический режим (Синхронизация через Планы обмена БСП):

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

---

Причина 1. Неактуальные правила в регистре сведений приемника

Самая распространенная ошибка при работе с планами обмена БСП — уверенность в том, что база-приемник берет правила обмена из передаваемого XML-файла сообщения. Это не так.

При обмене через встроенную синхронизацию БСП на стороне приемника (в нашем случае — ERP) используются правила загрузки, которые хранятся локально в самой ERP. Они записаны в регистре сведений ПравилаДляОбменаДанными (или загружены в справочник ТехнологическиеЖурналы / сохранены в макетах конфигурации в зависимости от версии БСП).

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

Решение проблемы:

Необходимо принудительно обновить правила обмена на стороне приемника. Для этого выполним следующие шаги:

  1. Перейдем в ERP в раздел НСИ и администрирование — Синхронизация данных.
  2. Откроем Настройки синхронизации данных, выберем нашу настройку с БП.
  3. Найдем пункт Правила конвертации объектов или Правила работы корреспондента и загрузим туда актуальный файл правил, созданный в КД 2.1.

---

Причина 2. Попытка явной записи объекта в обработчике «ПослеЗагрузки»

Проанализируем пример кода, который часто пишут разработчики в ПКО (Правила конвертации объектов) справочника Контрагенты в событии ПослеЗагрузки для связывания его с Партнером в ERP:


ОбъектМодифицирован = Ложь;
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
ПартнерыИКонтрагенты.ЗаписатьИерархиюПартнера(Объект.Ссылка);

Этот код отлично работает в ручной обработке, но гарантированно вызовет сбой в планах обмена БСП по следующим причинам:

Как сделать правильно:

Не выполняйте явную запись объекта базы данных в обработчиках загрузки отдельных элементов. Вместо этого перенесите создание связанных объектов (Партнеров) на этап глобального завершения загрузки пакета.

Для этого в КД 2.1 в обработчике ПослеЗагрузки ПКО Контрагенты мы можем собирать ссылки на загруженные объекты во временную структуру:


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

Затем в глобальном обработчике конвертации ПослеЗагрузкиДанных (который выполняется один раз в самом конце обмена, когда все объекты уже гарантированно записаны в базу данных) мы обработаем наш массив:


Если Параметры.Свойство("КонтрагентыДляОбработки") Тогда
    Для Каждого СсылкаКонтрагента Из Параметры.КонтрагентыДляОбработки Цикл
        // Безопасно создаем партнеров и записываем иерархию
        ПартнерыИКонтрагенты.СоздатьСвязаногоПартнера(СсылкаКонтрагента);
    КонецЦикла;
КонецЕсли;

---

Причина 3. Специфика контекста выполнения фонового задания

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

При этом в Журнале регистрации ERP появится неинформативная ошибка выполнения фонового задания, а транзакция загрузки будет полностью отменена. Объекты останутся ненайденными.

Рекомендация по отладке:

Для того чтобы выявить, на каком конкретно объекте или обработчике спотыкается фоновое задание обмена, выполним следующие действия:

  1. Временно переведем выполнение обмена в интерактивный режим. Для этого в настройках обмена или в коде инициализации установим выполнение обмена «В текущем сеансе» (в файловой базе это происходит автоматически, в клиент-серверной нужно запустить отладку фоновых заданий).
  2. В конфигураторе ERP установим автоматическую остановку по ошибке (меню Отладка — Настройка интеграции/Исключения — поставить галочку «Останавливаться по ошибке»).
  3. Запустим синхронизацию. При возникновении ошибки конфигуратор остановит выполнение на проблемной строке кода в обработчике КД.

---

Причина 4. Функциональные опции ERP и состав Плана обмена

В конфигурациях на ERP-платформе справочники Партнеры и Контрагенты разделены концептуально. Партнеры — это управленческий учет, Контрагенты — регламентированный (юридические лица). Связь между ними хранится в регистре соответствий.

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

При использовании планов обмена необходимо проверить:

Проанализируем состав плана обмена в конфигураторе ERP:

  1. Найдем наш план обмена (например, ОбменУправлениеПредприятиемБухгалтерияПредприятия30).
  2. Перейдем на вкладку Состав.
  3. Убедимся, что напротив справочника Партнеры, справочника Контрагенты и регистров сведений, отвечающих за связи партнеров, установлены соответствующие авторегистрации или они просто разрешены к переносу.

Применяя данные подходы к разделению логики загрузки и записи объектов, а также контролируя актуальность правил непосредственно в узлах планов обмена БСП, мы обеспечим стабильный и безошибочный перенос данных между «Бухгалтерией предприятия» и «ERP».

← На главную