Почему при обмене через план обмена номенклатура загружается как «Объект не найден» и документ не проводится?

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

При разработке правил конвертации данных (КД 2.x) разработчики нередко сталкиваются с ситуацией: при тестировании через универсальную обработку выгрузки (V8Exchan82 или «Универсальный обмен данными в формате XML») документы переносятся без замечаний, но как только правила подключаются к типовому механизму планов обмена, загрузка начинает выдавать ошибки проведения. В частности, система сообщает, что в строке табличной части «Услуги» содержится номенклатура, не являющаяся услугой, а при детальном просмотре загруженного документа в полях номенклатуры отображается значение «<Объект не найден>».

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

В чем причина различия между обработкой и планом обмена

Проанализируем механику работы платформы в обоих режимах:

  1. Универсальная обработка: По умолчанию в интерактивной обработке выгрузки включен режим полной выгрузки всех связанных данных по ссылкам. Когда документ помещается в файл обмена, механизм конвертации обходит все его реквизиты и табличные части и целиком выгружает все связанные элементы справочников со всеми их реквизитами. В результате в базе-приемнике успешно создаются и заполняются все зависимые позиции (включая признак «Услуга»).
  2. Обмен на планах обмена (онлайн-обмен): Типовая подсистема обмена данными оптимизирует размер XML-сообщения. В пакет включаются только те данные, которые явно зарегистрированы на узле плана обмена. Если документ зарегистрирован к обмену, а номенклатура из его табличной части — нет, то номенклатура передается не целиком, а лишь в виде ссылки (уникального идентификатора GUID) и базовых полей поиска.

Когда база-приемник получает такую урезанную ссылку на элемент, которого в ней еще физически нет, она не может инициализировать свойства нового объекта (реквизиты в XML отсутствуют). В базу записывается пустая ссылка или объект вообще не создается, а в поле документа появляется «<Объект не найден>». Далее при попытке проведения срабатывает типовая проверка конфигурации: система проверяет тип номенклатуры, обращается к реквизитам несуществующего объекта, получает пустое значение и блокирует проведение с ошибкой.

Диагностика: как отключить проведение для проверки состава данных

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

  1. В обработчике ПКО документа ПослеЗагрузки можно временно отключить явный вызов метода записи с режимом проведения.
  2. Если в конфигурации задействовано отложенное проведение документов (типовой механизм БСП), отключите соответствующее регламентное задание либо переведите режим загрузки в запись без проведения.
  3. Откройте незаписанный или записанный без проведения документ в базе-приемнике и проверьте табличные части: появление надписей «<Объект не найден>» явно свидетельствует о том, что ссылочные данные не были выгружены из источника целиком.

Способ 1. Принудительная выгрузка объекта в ПКС (рекомендуемый)

Самый простой и точечный способ заставить механизм конвертации передать объект полностью независимо от наличия его регистрации на узле плана обмена — взвести флаг ВыгрузитьОбъект.

Откроем правило конвертации свойств (ПКС) для номенклатуры в табличной части документа и в обработчике ПередВыгрузкой (или ПередВыгрузкойСвойства) укажем следующий код:

ВыгрузитьОбъект = Истина;

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

Способ 2. Программный вызов процедуры «ВыгрузитьПоПравилу»

Если требуется выгружать объекты при определенных условиях или обработка строк выполняется вручную в обработчиках документа, применим явную выгрузку по правилу.

В обработчике ПередВыгрузкой или в обработчике строки табличной части документа используем процедуру:


Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
    ВыгрузитьПоПравилу(СтрокаТЧ.Номенклатура, , , , "Номенклатура");
КонецЕсли;

Этот вызов принудительно сформирует узел с полными данными номенклатуры в выходном потоке до того, как будет сформирована строка документа.

Способ 3. Настройка параметров ПКО справочника «Номенклатура»

Проверим и скорректируем параметры самого ПКО в конфигурации «Конвертация данных»:

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

Способ 4. Регистрация данных к обмену (на уровне типовой конфигурации)

Если мы не хотим увеличивать нагрузку на алгоритмы КД при выгрузке каждого документа, правильным архитектурным решением является регистрация нормативно-справочной информации к обмену:

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

Нюансы и ограничения: как избежать «лавинной» выгрузки

Принудительное включение выгрузки объектов по ссылкам (ВыгрузитьОбъект = Истина) имеет важный побочный эффект — лавинную выгрузку данных.

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

Чтобы избежать этой проблемы, оптимизируем ПКО зависимого объекта: выгружаем по ссылке только критически важные для приемника реквизиты (например, наименование, признак услуги, базовую единицу и ставку НДС), а тяжелые и вторичные реквизиты (файлы, изображения, историю цен) исключаем из состава конвертируемых свойств.

← На главную