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