Как исправить ошибку Метод не обнаружен (УникальныйИдентификатор) при выгрузке данных с параметрами

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

При работе с конфигурацией «Конвертация данных 2.0» разработчики часто сталкиваются с ситуацией, когда настроенные правила обмена работают корректно до тех пор, пока в процесс не вмешиваются дополнительные параметры. Ошибка Метод не обнаружен (УникальныйИдентификатор) является одной из самых «коварных», так как она возникает не в коде самих правил, а глубоко внутри типовой обработки УниверсальныйОбменДаннымиXML. Давайте подробно разберем, почему это происходит и как нам совместно решить эту задачу.

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

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

Ошибка возникает в тот момент, когда алгоритм обработки «считает», что в параметре передается ссылочный тип данных (например, СправочникСсылка, ДокументСсылка), и пытается вызвать у этого значения метод УникальныйИдентификатор(), чтобы получить GUID объекта для записи в файл. Если же в этот момент в параметре фактически находится Строка, Число, Дата или, что бывает чаще всего, значение Неопределено, система выдает ошибку, так как у примитивных типов такого метода просто не существует.

Рассмотрим основные сценарии, приводящие к этому сбою:

  1. Неявное приведение к строке: В настройках параметра в КД указан ссылочный тип, но в обработчике «Перед выгрузкой данных» параметру присваивается строковое значение.
  2. Пустые значения: Параметр не был инициализирован, и его значение равно Неопределено.
  3. Составные типы: Параметр может принимать как ссылку, так и строку. Логика обработки УниверсальныйОбменДаннымиXML не всегда корректно обрабатывает такие «смеси» при сериализации в XML.

Шаг 1. Проверка инициализации параметров

Проанализируем наш код в обработчиках. Самое важное правило — параметр должен быть определен до того, как начнется выгрузка объектов, которые от него зависят. Рассмотрим пример правильной инициализации параметра в глобальном обработчике конвертации Перед выгрузкой данных.

Допустим, у нас есть параметр СкладВыгрузки. Мы должны убедиться, что он всегда содержит либо корректную ссылку, либо пустую ссылку нужного типа, но никак не Неопределено.


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

Если мы передаем простое текстовое значение, важно убедиться, что в самой «Конвертации данных» в настройках этого параметра на вкладке «Параметры» правильно указан тип значения. Если там стоит галочка напротив ссылочного типа, а вы передаете текст — ждите ошибку УникальныйИдентификатор.

Шаг 2. Анализ составных типов данных

Разберем ситуацию, упомянутую в обсуждении: использование составных типов (например, Строка + Ссылка). В этом случае стандартная обработка выгрузки может ошибиться при определении метаданных значения. Если параметр предполагает вариативность, лучше всего привести его к одному типу перед началом выгрузки или использовать вспомогательные параметры.

Посмотрим на пример проверки типа в коде:


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

Шаг 3. Настройка флага «Передавать при выгрузке»

Выясним еще одну важную деталь. В конфигурации «Конвертация данных» у каждого параметра есть флаг Передавать при выгрузке.

Если этот параметр нужен вам только для внутренних расчетов в скриптах внутри правил (например, для условий в ПКС или ПВД) и вы не планируете использовать его в базе-приемнике, снимите этот флаг. Если флаг снят, обработка УниверсальныйОбменДаннымиXML вообще не будет пытаться сериализовать это значение в XML, и вызов метода УникальныйИдентификатор() не произойдет. Это самый простой и эффективный способ избавиться от ошибки для «служебных» параметров.

Шаг 4. Диагностика конкретного виновника

Если параметров много и непонятно, какой из них вызывает сбой, мы можем применить метод «контрольных сообщений». Для этого нам придется на время залезть в код обработки УниверсальныйОбменДаннымиXML (той самой, которую вы запускаете в базе для выгрузки).

Найдем строку, указанную в ошибке (в вашем случае 10248), и добавим перед ней вывод отладочной информации. Мы хотим увидеть, на каком именно значении спотыкается система.


// Временный код для отладки в модуле обработки
Попытка
    Идентификатор = ЗначениеПараметра.УникальныйИдентификатор();
Исключение
    Сообщить("Ошибка выгрузки параметра! Текущее значение: " + ЗначениеПараметра);
    Сообщить("Тип значения: " + ТипЗнч(ЗначениеПараметра));
    ВызватьИсключение; // Пробрасываем ошибку дальше
КонецПопытки;

Проанализировав это сообщение, вы точно узнаете, какой параметр содержит, например, Строку там, где ожидается Ссылка.

Рекомендации по обновлению инструментов

Часто проблема кроется в устаревшей версии самой обработки УниверсальныйОбменДаннымиXML.epf. Разработчики фирмы 1С периодически исправляют баги, связанные с обработкой пустых ссылок и параметров неопределенного типа. Рекомендуем выгрузить актуальную версию обработки из вашей конфигурации Конвертация данных (она обычно хранится в макетах или поставляется в составе дистрибутива в папке TMTS).

Подведем итоги нашего анализа. Ошибка Метод не обнаружен (УникальныйИдентификатор) всегда свидетельствует о том, что система пытается обработать примитивный тип (или пустоту) как ссылку. Для решения необходимо:

  1. Явно инициализировать параметры значениями правильного типа (использовать ПустаяСсылка() вместо Неопределено).
  2. Проверить соответствие типов в настройках параметра в КД и реально передаваемых данных.
  3. Отключить передачу параметра в файл, если он используется только для внутренних целей.
  4. Обновить версию обработки выгрузки до актуальной.
← На главную