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