При разработке правил конвертации данных (КД 2.x) разработчики нередко сталкиваются с ситуацией: при тестировании через универсальную обработку выгрузки (V8Exchan82 или «Универсальный обмен данными в формате XML») документы переносятся без замечаний, но как только правила подключаются к типовому механизму планов обмена, загрузка начинает выдавать ошибки проведения. В частности, система сообщает, что в строке табличной части «Услуги» содержится номенклатура, не являющаяся услугой, а при детальном просмотре загруженного документа в полях номенклатуры отображается значение «<Объект не найден>».
Разберем природу этого поведения, выясним, почему универсальная выгрузка и механизм планов обмена работают по-разному, и рассмотрим надежные способы настройки правил конвертации для устранения проблемы.
Проанализируем механику работы платформы в обоих режимах:
Когда база-приемник получает такую урезанную ссылку на элемент, которого в ней еще физически нет, она не может инициализировать свойства нового объекта (реквизиты в XML отсутствуют). В базу записывается пустая ссылка или объект вообще не создается, а в поле документа появляется «<Объект не найден>». Далее при попытке проведения срабатывает типовая проверка конфигурации: система проверяет тип номенклатуры, обращается к реквизитам несуществующего объекта, получает пустое значение и блокирует проведение с ошибкой.
Чтобы локализовать подобную ошибку при отладке обмена через планы обмена, полезно временно отключить проведение документов:
Самый простой и точечный способ заставить механизм конвертации передать объект полностью независимо от наличия его регистрации на узле плана обмена — взвести флаг ВыгрузитьОбъект.
Откроем правило конвертации свойств (ПКС) для номенклатуры в табличной части документа и в обработчике ПередВыгрузкой (или ПередВыгрузкойСвойства) укажем следующий код:
ВыгрузитьОбъект = Истина;
Параметр ВыгрузитьОбъект сообщает ядру конвертации данных, что по данной ссылке необходимо выгрузить не только идентификационную информацию для поиска, но и тело объекта целиком в соответствии с назначенным для него ПКО.
Если требуется выгружать объекты при определенных условиях или обработка строк выполняется вручную в обработчиках документа, применим явную выгрузку по правилу.
В обработчике ПередВыгрузкой или в обработчике строки табличной части документа используем процедуру:
Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
ВыгрузитьПоПравилу(СтрокаТЧ.Номенклатура, , , , "Номенклатура");
КонецЕсли;
Этот вызов принудительно сформирует узел с полными данными номенклатуры в выходном потоке до того, как будет сформирована строка документа.
Проверим и скорректируем параметры самого ПКО в конфигурации «Конвертация данных»:
Если мы не хотим увеличивать нагрузку на алгоритмы КД при выгрузке каждого документа, правильным архитектурным решением является регистрация нормативно-справочной информации к обмену:
Принудительное включение выгрузки объектов по ссылкам (ВыгрузитьОбъект = Истина) имеет важный побочный эффект — лавинную выгрузку данных.
Если для номенклатуры в ее ПКО включена выгрузка единиц измерения, видов номенклатуры, ценовых групп, упаковок, производителей и присоединенных файлов, то при выгрузке одного документа система по цепочке выгрузит десятки связанных справочников. Пакет обмена может вырасти с нескольких килобайт до десятков мегабайт, что приведет к тайм-аутам фоновых заданий.
Чтобы избежать этой проблемы, оптимизируем ПКО зависимого объекта: выгружаем по ссылке только критически важные для приемника реквизиты (например, наименование, признак услуги, базовую единицу и ставку НДС), а тяжелые и вторичные реквизиты (файлы, изображения, историю цен) исключаем из состава конвертируемых свойств.