При работе с механизмами XDTO (XML Data Transfer Objects) в платформе «1С:Предприятие» разработчики часто сталкиваются с ситуацией, когда в схеме или при анализе типов данных указан URI пространства имен, но его имя в дереве метаданных конфигурации совершенно иное. Это происходит потому, что пространство имен — это уникальный идентификатор, определяемый внешними стандартами или сторонними сервисами, в то время как имя пакета в 1С — это просто внутренний идентификатор объекта метаданных. Разберем подробно, как эффективно решать задачу поиска нужного пакета несколькими способами.
Проанализируем самый простой и быстрый способ, который не требует написания программного кода. Платформа хранит URI пространства имен в свойствах объекта ПакетXDTO. Это означает, что данные индексируются поисковым движком Конфигуратора.
Для поиска выполним следующие шаги:
http://www.sample-uri.com/integration).В результатах поиска мы увидим строку, указывающую на конкретный объект ПакетXDTO. Двойной клик по строке результата мгновенно спозиционирует дерево метаданных на нужном пакете.
Рассмотрим ситуацию, когда нам нужно получить соответствие всех пакетов их пространствам имен в виде наглядного списка. Для этого мы можем воспользоваться встроенным языком 1С. Посмотрим на пример кода, который перебирает все пакеты и выводит их в табличный документ.
Создадим функцию, которая сформирует таблицу соответствий:
Функция ПолучитьИменаИURIПространстваИмён()
// Создаём таблицу значений для хранения данных
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("ИмяМетаданных", Новый ОписаниеТипов("Строка"));
ТаблицаЗначений.Колонки.Добавить("ПространствоИмен", Новый ОписаниеТипов("Строка"));
// Перебираем все XDTO-пакеты в конфигурации
Для каждого ПакетXDTO из Метаданные.ПакетыXDTO Цикл
НоваяСтрока = ТаблицаЗначений.Добавить();
// Свойство "Имя" — это имя в дереве конфигурации
// Свойство "ПространствоИмен" — это искомый URI
НоваяСтрока.ИмяМетаданных = ПакетXDTO.Имя;
НоваяСтрока.ПространствоИмен = ПакетXDTO.ПространствоИмен;
КонецЦикла;
// Преобразовываем таблицу в табличный документ для отображения пользователю
ТабличныйДокумент = Новый ТабличныйДокумент;
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаЗначений);
Построитель.Вывести(ТабличныйДокумент);
Возврат ТабличныйДокумент;
КонецФункции
Этот способ удобен тем, что позволяет быстро найти нужный пакет визуально, если у вас их десятки или сотни. Если же нам нужно найти конкретное имя пакета по известному URI программно (например, для динамического обращения к типам), воспользуемся более компактным методом:
Функция НайтиИмяПакетаПоURI(ИскомыйURI)
Для каждого Пакет Из Метаданные.ПакетыXDTO Цикл
Если Пакет.ПространствоИмен = ИскомыйURI Тогда
Возврат Пакет.Имя;
КонецЕсли;
КонецЦикла;
Возврат ""; // Если пакет не найден
КонецФункции
Проанализируем ситуацию, когда конфигурация крайне велика, и глобальный поиск работает медленно. В современных версиях платформы 8.3 реализована возможность выгрузки метаданных в XML-файлы. Это дает нам мощный инструмент для анализа.
Мы обнаружим файл с расширением .xdto, внутри которого в атрибуте targetNamespace будет указан наш URI. Имя самого файла будет в точности соответствовать имени объекта ПакетXDTO в дереве метаданных.
Выясним, как решается эта задача в 1C:EDT. Поскольку EDT построена на базе Eclipse, она постоянно держит в памяти индекс всех связей проекта. Навигация по пространствам имен здесь реализована наиболее глубоко.
В EDT достаточно нажать Ctrl + R (Open Resource) и начать вводить URI. Среда автоматически предложит перейти к определению схемы. Кроме того, при просмотре любого типа данных, который ссылается на базовый тип из другого пакета, можно нажать F3 (Open Declaration), и система автоматически откроет нужный XDTO-пакет, даже если его URI не совпадает с именем.
Стоит учитывать важный нюанс: не все пакеты, которые вы видите в типах данных, присутствуют в дереве метаданных. Платформа 1С содержит ряд встроенных (системных) пакетов. Разберем наиболее популярные:
http://www.w3.org/2001/XMLSchema — стандартные типы данных XML (строки, числа, даты).http://v8.1c.ru/8.1/data/core — базовые типы самой платформы 1С.http://v8.1c.ru/8.1/data/enterprise/current-config — типы объектов текущей конфигурации (Справочники, Документы и т.д.).Если искомый URI относится к этим пространствам имен, вы не найдете их в списке Метаданные.ПакетыXDTO, так как они встроены в ядро платформы. Работа с ними осуществляется напрямую через объект ФабрикаXDTO.
Для разовых задач по анализу структуры XDTO удобно использовать специализированные внешние обработки, такие как «Консоль анализа XDTO». В таких инструментах реализовано дерево всех доступных в текущем сеансе типов. Мы можем просто вставить интересующий нас URI в поле фильтра, и консоль покажет не только сам пакет, но и все входящие в него типы значений и объектные типы, что значительно упрощает отладку сложных интеграционных решений.