Как исправить ошибку «Метод объекта не обнаружен ПолучитьСсылку» при конвертации данных в перечисление?

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

При выгрузке и загрузке данных с использованием обработки «Универсальный обмен данными XML» или правил «Конвертации данных 2.0» разработчики нередко сталкиваются с ошибкой во время поиска объектов:

Метод объекта не обнаружен (ПолучитьСсылку)

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


СсылкаПоИдентификатору = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(Значение));

Для справочников и документов этот код отрабатывает штатно, однако если переменная Менеджер содержит тип ПеречислениеМенеджер.<ИмяПеречисления>, выполнение аварийно прерывается. Разберем причины такого поведения платформы 1С и рассмотрим по шагам, как правильно настроить правила обмена и программный код.

Почему у перечисления нельзя получить ссылку по GUID?

Проанализируем особенности объектной модели платформы 1С:

  1. Отсутствие табличных ссылок: Значения перечислений жестко зафиксированы в структуре метаданных конфигурации. В отличие от справочников или документов, элементы перечислений не создаются динамически в пользовательском режиме и не имеют ссылочных идентификаторов (UUID таблицы базы данных).
  2. Ограничения менеджера: У объекта ПеречислениеМенеджер.<ИмяПеречисления> отсутствует метод ПолучитьСсылку(), а у типа ПеречислениеСсылка.<Имя> нет метода УникальныйИдентификатор().
  3. Принцип сопоставления: Перечисления сопоставляются исключительно по их строковым именам значений в метаданных, синонимам или явным таблицам соответствий, но не по GUID.

Причины возникновения ошибки в правилах обмена

Выясним причину, почему универсальная обработка пытается искать перечисление по GUID:

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

Способ 1. Корректная настройка ПКО и ПКЗ в «Конвертации данных»

Разберем по шагам, как исправить правила обмена в конфигурации «Конвертация данных 2.0»:

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

Способ 2. Передача строкового имени из справочника-источника

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

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


Если ЗначениеЗаполнено(Источник) Тогда
    // Передаем имя предопределенного элемента строкой вместо ссылки
    Значение = Источник.ИмяПредопределенныхДанных;
Иначе
    Значение = "";
КонецЕсли;

Если требуется передать значение обычного (не предопределенного) элемента справочника, можно использовать понятный строковый реквизит (например, Источник.Код или Источник.Наименование), сопоставив эти строковые значения в таблице ПКЗ со значениями перечисления приемника.

Способ 3. Программное получение значения перечисления

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


ИмяПеречисления = "СтатусыЗаказов";
ИмяЗначения = "Согласован";

// Получение через обращение по строковым именам
ЗначениеПеречисления = Перечисления[ИмяПеречисления][ИмяЗначения];

В обработчике ПКС «ПередЗагрузкой» или «ПриЗагрузке» можно предусмотреть безопасную установку значения с обработкой возможных исключений:


Попытка
    Значение = Перечисления.СтатусыЗаказов[Строка(Значение)];
Исключение
    // Назначаем значение по умолчанию, если переданное имя не найдено
    Значение = Перечисления.СтатусыЗаказов.ПустаяСсылка();
КонецПопытки;

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

← На главную