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