Как исправить ошибку «Значение не является значением объектного типа (ЭтоСсылочныйТип)» при обмене через универсальный формат в 1С?

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

При настройке синхронизации данных через универсальный формат (EnterpriseData) с использованием конфигурации «Конвертация данных 3.0» разработчики нередко сталкиваются с ситуацией, когда требуется передать справочник или документ, отсутствующий в стандартной схеме XDTO текущей версии формата. При попытке настроить ПКО (правило конвертации объекта) и ПОД (правило обработки данных) для такого объекта процедура выгрузки аварийно завершается с ошибкой в общем модуле ОбменДаннымиXDTOСервер:

«Значение не является значением объектного типа (ЭтоСсылочныйТип) Если ПравилоКонвертации.ЭтоСсылочныйТип Тогда»

Проанализируем природу данной неполадки и подробно разберем все способы ее корректного решения.

Выясним причину возникновения ошибки

Механизм обмена на базе EnterpriseData жестко опирается на XDTO-пакеты. Во время работы алгоритмов выгрузки в общем модуле ОбменДаннымиXDTOСервер выполняется сопоставление метаданных конфигурации с типами XDTO, зарегистрированными в правилах конвертации. Если разработчик добавил ПКО для прикладного объекта (например, справочника НаправленияДеятельности), но соответствующий XDTO-тип отсутствует в используемой схеме пакета EnterpriseData (например, версии 1.1), менеджер обмена не находит правила конвертации для типа формата и возвращает значение Неопределено.

При дальнейшем обращении к реквизиту ПравилоКонвертации.ЭтоСсылочныйТип платформа пытается прочитать свойство у значения Неопределено, что и приводит к падению сеанса синхронизации.

Способ 1: Доработка XSD-схемы EnterpriseData и правил в КД 3.0

Если требуется полноценная передача справочника как самостоятельной сущности формата, необходимо расширить схему XDTO. Разберем этот процесс по шагам:

  1. Добавление XDTO-типа в конфигурациях: В информационных базах источника и приемника необходимо открыть ветку метаданных XDTO-пакеты, найти пакет формата обмена и добавить в него новый тип объекта (например, Справочник.НаправленияДеятельности), описав требуемые свойства (Ссылка, Наименование, Код и другие реквизиты). Если конфигурация находится на поддержке, расширение пакета XDTO можно выполнить через механизм расширений (начиная с платформы 8.3.14+).
  2. Выгрузка обновленной XSD-схемы: Экспортируем измененную схему формата в файл XSD из информационной базы.
  3. Загрузка формата в КД 3.0: В базе «Конвертация данных, ред. 3.0» загружаем обновленный формат данных, после чего новый XDTO-тип станет доступен для сопоставления.
  4. Настройка правил ПКО и ПОД: Создаем правило конвертации объекта, связав справочник НаправленияДеятельности с созданным типом XDTO, и создаем соответствующее правило обработки данных.
  5. Обновление модуля менеджера обмена: Выгружаем из КД 3.0 сгенерированный программный код и переносим его в модуль МенеджерОбменаЧерезУниверсальныйФормат обеих баз.

Важно: структура XDTO-пакета в источнике и приемнике должна быть абсолютно идентичной, иначе база-приемник выдаст ошибку валидации XML при разборе входящего сообщения.

Способ 2: Переход на более актуальную версию формата EnterpriseData

Формат версии 1.1 содержит базовый набор сущностей. В более поздних версиях EnterpriseData состав документов, справочников и аналитических разрезов существенно расширен. Проверим, поддерживают ли обе конфигурации более новую версию формата. Если более свежая версия доступна в обеих базах, целесообразно переключить обмен на нее, где требуемый справочник уже описан разработчиками платформы.

Способ 3: Передача данных без изменения XDTO-схемы

Если внесение изменений в структуру метаданных и XDTO-пакеты нежелательно, можно передавать данные справочника внутри существующих типов данных через механизм дополнительных свойств или обработчики событий.

Рассмотрим передачу значения через табличную часть ДополнительныеРеквизиты / ДополнительныеСвойства целевого документа:

  1. Большинство объектов формата EnterpriseData содержат встроенную коллекцию для передачи произвольных реквизитов. В ПКО документа на стороне источника настраиваем заполнение свойства именем и значением направления деятельности.
  2. На стороне базы-приемника в модуле менеджера обмена используем обработчик события ПослеЗагрузкиВсехДанных или ПриКонвертацииДанныхXDTO для поиска и сопоставления элемента в базе данных:

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

Такой подход позволяет передавать аналитику без модификации типовых схем XDTO и снятия конфигурации с поддержки.

← На главную