Получение уникального идентификатора объекта из ссылки в запросе
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Планируется в версии 8.3.22
По многочисленным просьбам в версии 8.3.22 в язык запросов и в язык выражений СКД добавится функция УникальныйИдентификатор(Ссылка). Параметр Ссылка — выражение, результатом которого является ссылка (кроме ссылок на таблицы внешних источников данных). Функция возвращает уникальный идентификатор переданной ссылки или NULL, если передано значение NULL.
Это нововведение, в частности, упростит задачи интеграции систем на платформе 1С:Предприятие с внешними системами.
Рассмотрим пример. У нас есть интеграция с внешней системой на уровне данных – таблица внешней системы ссылается на справочник Товары в нашей инфобазе.
Структура таблицы внешней системы:
Идентификатор | Ключ (число) |
Наименование | Название товара на английском языке (строка) |
УникальныйИдентификатор | Ссылка на элемент справочника Товары (уникальный идентификатор) |
Нам нужно на стороне 1С вывести содержимое справочника Товары и для каждого товара показать его название на английском языке.
Предположим, мы получили содержимое внешней таблицы в виде таблицы значений (через веб-сервис или внешний источник данных или ещё каким-то образом).
Сейчас связать записи внешней таблицы (лежащие в таблице значений) с элементами справочника Товары можно так:
- Добавить в таблицу значений колонку, которую надо заполнить ссылкой на элементы справочника Товары, обойдя все записи таблицы значений в цикле.
- Полученную таблицу значений с помощью запроса объединить со справочником Товары.
В версии 8.3.22 это можно будет сделать гораздо проще.
Проиллюстрируем это кодом. Содержимое внешней таблицы помещено в таблицу значений ТЗ_ТоварыВнешняя.
Заполнение дополнительных полей, которые запрашивает контрагент
В ЭДО часто используются дополнительные данные, которые не предусмотрены форматами ФНС, такие как номера и даты заказов, номера партий, спецификаций, доверенностей, т.е. любая дополнительная информация, которую может затребовать поставщик или покупатель. В стандартном функционале 1С-ЭДО можно добавлять поля для разных видов документов.
Заполнения дополнительных полей настраивается в разрезе видов исходящих электронных документов. Для этого необходимо перейти в справочник Контрагенты. Из списка выбрать контрагента, от которого поступило требование заполнения дополнительной информации в электронном документе, нажать ЭДО – Настройки отправки
Затем открыть соответствующую настройку ЭДО
В таблице документов учёта необходимо выбрать соответствующий вид документа и перейти по ссылке регламента ЭДО.
В открывшемся окне необходимо развернуть другие настройки и перейти по ссылке «не установлены» в настройках заполнения дополнительных полей
Открывшийся конструктор позволяет определить состав и правила заполнения полей для соответствующего раздела формата электронного документа.
На вкладке «Документ» можно задать дополнительные поля для вида электронного документа. «Сведения об отгрузке» служат для информации по передаваемой продукции. На вкладке «Товары/услуги/права» можно задать дополнительные поля для строк товаров или услуг в табличной части.
- Имя поля — значение, которое используется в качестве идентификатора в электронном документе.
- Правила заполнения — список предопределенных правил для заполнения значения дополнительного поля.
- Представление поля — заголовок дополнительного поля при заполнении значения вручную.
- Описание поля — подсказка дополнительного поля при заполнении значения вручную.
Используя соответствующие кнопки, можно выгрузить созданный файл настроек для использования в другой информационной базе и загрузить ранее созданный.
Заполнение дополнительных полей происходит в момент формирования электронного документа. Если в качестве правил заполнения указана формула, то значение будет автоматически рассчитано и подставлено в электронный документ. В случае, когда установлен другой вариант правил или при вычислении формулы произошла ошибка, значение необходимо заполнить вручную.
Для отображения дополнительной информации в форме просмотра электронного документа необходимо нажать Ещё – Настройка отображения – Отображать дополнительную информацию.
Также вам может быть интересно:
Ваша проблема решена?
Ваше сообщение отправлено.
Программное создание характеристик с дополнительными реквизитами в УНФ 1.6
Создаю категорию с указанием использования общих характеристик и значения единицы измерения по умолчанию.
Код создания категории
обКатегория = Справочники.КатегорииНоменклатуры.СоздатьЭлемент(); обКатегория.Наименование = "Обувь"; обКатегория.ТипНоменклатурыПоУмолчанию = Перечисления.ТипыНоменклатуры.Запас; обКатегория.ИспользоватьХарактеристики = Истина; обКатегория.ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.шт; обКатегория.Записать();
Дополнительные реквизиты
Хранятся в «ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения».
В элементе указывается набор «НаборСвойств» в от которого был создан. При использовании информация о принадлежности берется из ТЧ «ДополнительныеРеквизиты» спр. «НаборыДополнительныхРеквизитовИСведений».
На форме пользователь видит «Наименование», по факту заполняется «Заголовок»
Скриншот формы из конфигуратора
Для коррекной работы кроме наименования нужно заполнить
- тип данных
- идентификатор для формул
- Имя (Требуется для программного обращения к дополнительным реквизитам и сведениям. Аналог имени обычного реквизита.)
Заполнение идентификатора происходит на форме
Модуль формы элемента
ЗаголовокДляИдентификатора = ЗаголовокДляФормированияИдентификатора(Объект.Заголовок, Объект.Представления); Объект.ИдентификаторДляФормул = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.УникальныйИдентификаторДляФормул( ЗаголовокДляИдентификатора, Объект.Ссылка);
«Имя» заполняется в модуле объекта в процедуре «ПередЗаписью()»
Модуль объекта
Процедура КонтрольЗаполнениеИдентификатораДляФормул(Отказ) Если НЕ ДополнительныеСвойства.Свойство("ПроверкаИдентификатораДляФормулВыполнена") Тогда // Программная запись. Если ЗначениеЗаполнено(ИдентификаторДляФормул) Тогда ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПроверитьУникальностьИдентификатора(ИдентификаторДляФормул, Ссылка, Отказ); Иначе // Установка идентификатора. ИдентификаторДляФормул = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.УникальныйИдентификаторДляФормул( ЗаголовокДляФормированияИдентификатора(), Ссылка); КонецЕсли; КонецЕсли; КонецПроцедуры
Пример создания с типом «Дополнительное значение». Реквизиты «Доступен», «Виден» используются для управлением отображением в форме элемента спр. «Характерисики».
Код создания доп реквизита
обСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент(); обСвойство.Наименование = "Размер"; обСвойство.Заголовок = обСвойство.Наименование; обСвойство.Доступен = Истина; обСвойство.Виден = Истина; ЗаголовокДляИдентификатора = ЗаголовокДляФормированияИдентификатора(обСвойство.Заголовок, обСвойство.Представления); обСвойство.ИдентификаторДляФормул = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.УникальныйИдентификаторДляФормул( ЗаголовокДляИдентификатора, обСвойство.Ссылка); обСвойство.НаборСвойств = обКатегория.НаборСвойствХарактеристики; //обСвойство.ТипЗначения = Новый ОписаниеТипов("Строка"); обСвойство.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ЗначенияСвойствОбъектов"); обСвойство.Записать(); обНаборСвойствХарактеристики = обКатегория.НаборСвойствХарактеристики.ПолучитьОбъект(); СтрДопРеквизит = обНаборСвойствХарактеристики.ДополнительныеРеквизиты.Добавить(); СтрДопРеквизит.Свойство = обСвойство.Ссылка; обНаборСвойствХарактеристики.Записать();
Значения дополнительных реквизитов
Хранятся в справочнике «ЗначенияСвойствОбъектов» с владельцем «ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения»
Код создания значения доп реквизита
обЗначениеСвойстваОбъекта = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент(); обЗначениеСвойстваОбъекта.Владелец = обСвойство.Ссылка; обЗначениеСвойстваОбъекта.Наименование = "42"; обЗначениеСвойстваОбъекта.Записать();
Характеристики номенклатуры
Характеристики могут быть привязаны к:
- спр. КатегорииНоменклатуры, можно выбирать в документах для любой номенклатцры в рамках категории.
- спр. Номенклатура, можно выбирать в документах для номенклатуры владельца
Выбор харктеристик сделан через «нестандартную» форму выбора с фильтром, относительно неудобная для пользователей.
Создаем характеристику общую для категории, добавляем в нее значение доп реквизита
Код создания характеристики
обХарактеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент(); обХарактеристика.Владелец = обКатегория.Ссылка; обХарактеристика.Наименование = "42"; обХарактеристика.НаименованиеДляПечати = обХарактеристика.Наименование; СтрДопРеквизит = обХарактеристика.ДополнительныеРеквизиты.Добавить(); СтрДопРеквизит.Свойство = обСвойство.Ссылка; СтрДопРеквизит.Значение = обЗначениеСвойстваОбъекта.Ссылка; обХарактеристика.Записать();
Для формирования наимменования из значений доп. реквизитов можно использовать функцию
ШаблоныНаименований.СформироватьНаименования(ЭтотОбъект, КатегорияНоменклатуры);
Итог
В структуре данных по доп реквизитам в УНФ есть своя специфика, учитывая которую можно программно создавать элементы для последующего использования.
Метаданные и их идентификаторы
Каждый объект метаданных конфигурации имеет собственный уникальный идентификатор, который невозможно получить простым способом. Платформа 1С не предоставляет методов работы с этими внутренними свойствами, которые иногда все же нужны. Из штатных механизмов платформы для работы с метаданными мы имеем только метод «ПолноеИмя()», который вернет нам почти удобочитаемый идентификатор объекта.
ПолноеИмя = Метаданные.Документы.ЗаказКлиента.ПолноеИмя() Сообщить(ПолноеИмя); // Выведет "Документ.ЗаказКлиента"
Нужно ли еще что-то? Иногда могут встать такие задачи, хоть и нестандартные:
- Нужно отследить фактическую замену объекта метаданных. Например, если удалили справочник из конфигурации, но при этом добавили новый с таким же именем.
- При возникновении ошибок, связанных с кэшем, в них может фигурировать идентификатор метаданных. Для расследования нужно распознать что это за объект.
- Для собственного решения по хранению информации о метаданных в конфигурации. Аналог справочника «ИдентификаторыОбъектовМетаданных» из БСП, в котором каждому объекту конфигурации (ну, почти каждому — только верхнеуровневым) соответствует элемент этого справочника по полному имени. По тому самому значению, полученному с помощью «ПолноеИмя()».
- Или Вам просто интересно узнать, как подобную информацию получить.
- Другие причины.
Сегодня мы рассмотрим некоторые особенности работы с метаданными в БСП, способы получения расширенной информации в ручном режиме, а также программный путь получения дополнительной информации о метаданных.
Путь БСП
Как уже упоминалось выше, в БСП есть справочник «Идентификаторы объектов метаданных», который содержит информацию об объектах метаданных конфигурации.
Обновляется автоматически в процедурах обновления БСП. Также обновление может быть запущено вручную.
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();
Сопоставление элемента этого справочника с объектом метаданных конфигурации выполняется с помощью поля «ПолноеИмя», в которое записывается результат вызова функции «ПолноеИмя()» для объекта метаданных (см. начало статьи). Вот пример заполнения элемента из демобазы БСП для документа «Заказ клиента».
Кроме этого поля также есть «ЗначениеПустойСсылки», «НоваяСсылка», «ИмяПредопределенныхДанных» и «КлючОбъектаХранилища», но в их назначение погружаться сейчас не будем. Отмечу лишь, что они помогают провести «умное» обновление справочника с учетом переименований и других особенностей:
// Порядок обновления: // 1. Переименование объектов метаданных (с учетом нижестоящих подсистем). // 2. Обновление предопределенных идентификаторов (коллекций объектов метаданных). // 3. Обновление идентификаторов объектов метаданных, которые имеют ключ объекта метаданных. // 4. Обновление идентификаторов объектов метаданных, которые не имеют ключа объекта метаданных. // 5. В процессе 3 и 4 пометка удаления дублей идентификаторов (по полным именам). // 6. Добавление новых идентификаторов объектов метаданных. // 7. Обновление родителей идентификаторов объектов метаданных и запись обновленных.
Подробнее Вы можете посмотреть самостоятельно в процедуре «ОбновитьДанныеСправочника», о которой мы уже говорили ранее.
Главное, что стоит сказать — это отсутствие необходимости сохранять уникальный идентификатор объекта метаданных для этого справочника и механизмов его обновления. Разработчики БСП нашли альтернативный путь и используют его.
Ручная работа
Но представим, что для нашей задачи все-таки нужен уникальный идентификатор объекта метаданных. Как его получить?
Самый простой способ — сделать вручную выгрузку конфигурации в файлы и посмотреть идентификатор самостоятельно. Для платформы 8.3 есть возможность выгружать конфигурацию в XML.
Файлы выгружаются в каталог, там мы и сможем найти нужную для нас информацию. Например, в демобазе БСП есть документ «_ДемоЗаказПокупателя». Идем в каталог с файлами конфигурации, переходим во вложенный каталог «Documents» и находим файл «_ДемоЗаказПокупателя.xml». Вот его содержимое (не все, только самая важная для нас часть):
eb4c3baa-9f3f-4988-b1cc-ebb9a21105ca bf5eaf96-437c-417c-96bd-5b4e968ab66b 6e094677-52bb-4e65-8322-5fbd75bbdd8e ac0e6277-d79a-4c3d-aa88-9edcdaaeff3a 26d4fa62-e00f-4fb9-acaf-44033d6cf1d8 7a336f96-3af1-4177-923a-579783b96811 11c10634-2427-4654-8c12-f68386be6e27 b18e5dd3-3e87-4698-90b5-b79eae1ad923 dca0d409-e137-46a7-8ca8-6408b204142e 08f7715a-0036-463e-b649-22a98fb140e0
В первом узле, подчиненном «MetaDataObject», мы видим имя вида объекта (в нашем случае «Document», т.е. документ), а также его уникальный идентификатор. Да, в нашей конфигурации у документа «_ДемоЗаказПокупателя» идентификатор объекта метаданных — «4eee25b1-2da6-459b-953b-4c8d519c9bce». На самом деле тут можно узнать не только GUID объекта метаданных, но и другую служебную информацию:
- Идентификатор различных связанных типов данных (объекта, ссылки, менеджера и др.).
- Состав объекта (поля, типы и т.д.)
- И кое-что другое.
Фактически это полная информация об объекте.
Таким же образом можно узнать GUID любого объекта метаданных конфигурации. Но это очень неудобно выполнять вручную каждый раз, когда это значение понадобится, поэтому идем дальше.
Извлекаем из журнала регистрации
Есть еще один необычный способ получения идентификаторов метаданных — это использование файлов журнала регистрации. Да, именно файлов, т.к. штатными средствами прочитать GUID объекта метаданных из них платформа 1С не позволяет.
Есть два формата журнала регистрации:
- Текстовый формат, который хорошо описан в публикации «Формат файлов журнала регистрации 1С 8.1/8.2 — ELF/LOG/LGF/LGP».
- SQLite формат, структуру которого можно посмотреть в публикации «Все, что вы хотели знать о журнале регистрации».
Например, для SQLite-формата идентификатор объекта метаданных хранится в таблице «MetadataCodes».
В текстовом формате идентификатор метаданных хранится в файле «1Cv8.lgf», который содержит информацию о ссылочных данных журнала. Записи с идентификатором «5» как раз и содержат информацию о метаданных. Вот пример такой записи.
Как именно читать данные из этих источников подробно останавливаться не будем. Но кратко перечислю основные варианты:
- Для SQLite формата делать запросы через ODBC-драйвер к файлу журнала.
- Для текстового формата — парсить файл «1Cv8.lgf».
В публикации «Экспорт журнала регистрации. Набор инструментов (приложения + исходный код)» как раз есть информация о парсинге обоих форматов журнала регистрации и открытый исходный код. Также там есть пример конфигурации с внешним источником данных для получения данных журнала регистрации, но уже из внешнего хранилища.
Программные маневры
Предыдущие способы рабочие, но очень неудобные, да и не всегда подходят.
Минусы ручного анализа очевидны:
- Большие трудозатраты для анализа, не говоря уже о случаях, когда нужно получить идентификаторы всех объектов метаданных.
- Задача сама по себе требует автоматизации
- Нет возможности программной работы
Для получения данных из журнала регистрации также есть недостатки:
- Не все метаданные могли участвовать в событиях журнала, а значит их и не будет в исходных файлах
- Необходимость парсинга / подключения к файлам журнала, что не всегда возможно для файлов с рабочего окружения
Но есть и третий способ — это программное получение GUID’ов метаданных с помощью программного кода. Для этого нужно выполнить следующую последовательность действий:
- Выгружаем конфигурацию в файлы
- Парсим основные файлы описания метаданных
- Обрабатываем результат
- Получаем таблицу метаданных с полями «Полное имя» и «GUID».
Рассмотрим кратко реализацию каждого шага.
Выгружаем и парсим
Для выгрузки конфигурации в файлы из кода встроенного языка платформы 1С запустим конфигуратор в пакетном режиме с указанием параметра «DumpConfigToFiles», который как раз и сделает то, что нам нужно. Вот простейший пример процедуры для этого.
Процедура ВыгрузитьКонфигурациюВКаталог(ИмяСервера, ИмяБазы, ИмяПользователь, ПарольПользователя, КаталогВыгрузи) КаталогСерверногоПриложения = КаталогПрограммы(); ПриложениеТолстыйКлиент = КаталогСерверногоПриложения + "1cv8.exe"; КомандаКонфигуратора = """" + ПриложениеТолстыйКлиент + """" + " DESIGNER" + " /S""" + ИмяСервера + "\" + ИмяБазы + """" + " /N""" + ИмяПользователь + """" + " /P""" + ПарольПользователя + """" + " /DumpConfigToFiles """ + КаталогВыгрузи + """" + " "; РезультатВыполнения = ВыполнитьПриложение(КомандаКонфигуратора); Если ЗначениеЗаполнено(РезультатВыполнения.Ошибки) Тогда ВызватьИсключение "Не удалось выгрузить конфигурацию в файлы. |Подробно: |" + РезультатВыполнения.Ошибки; КонецЕсли; КонецПроцедуры
Мы формируем команду для запуска конфигуратора в пакетном режиме с указанием адреса информационной базы, а также данных для входа пользователя. Для параметра «DumpConfigToFiles» указывается каталог выгрузки. Вызвать процедуру очень просто, главное не забыть подставить в нее свои корректные параметры.
ИмяСервера = "localhost"; ИмяБазы = "bal_demo"; ИмяПользователь = "Администратор"; ПарольПользователя = ""; КаталогВыгрузкиКонфигурации = "C:\cfg"; ВыгрузитьКонфигурациюВКаталог( ИмяСервера, ИмяБазы, ИмяПользователь, ПарольПользователя, КаталогВыгрузкиКонфигурации);
Функция «ВыполнитьПриложение» — это еще одна добавленная процедура, которая запускает указанную команду с таймаутом выполнения. Это особенно важно, т.к. при выполнении подобного кода на сервере может произойти зависание сеанса, если с приложением что-то пошло не так.
Подробнее о безопасном запуске приложений из 1С для Windows и Linux шел разговор в публикации «Вы запускаете приложения, но делаете это без уважения». Ниже под спойлером приведу исходный код этой процедуры и всех вспомогательных ее частей.
Код для безопасного запуска приложений
Функция ВыполнитьПриложение(ТекстСкрипта, ТаймаутВыполненияКомандыСек = 600) // Структура результата выполнения команды РезультатВыполненияСкрипта = Новый Структура; РезультатВыполненияСкрипта.Вставить("Вывод", ""); РезультатВыполненияСкрипта.Вставить("Ошибки", ""); // Вспомогательные переменные ТекстСкриптаДляВыполнения = ""; ВременныйФайлСкрипта = ""; ВременныйФайлРезультат = ""; // Сохраняем команду в файл BAT-скрипта ВременныйФайлСкрипта = ПолучитьИмяВременногоФайла("bat"); ЗаписьТекстаСкрипта = Новый ТекстовыйДокумент; ЗаписьТекстаСкрипта.УстановитьТекст(ТекстСкрипта); ЗаписьТекстаСкрипта.Записать(ВременныйФайлСкрипта, "cp866"); ТекстСкриптаДляВыполнения = ВременныйФайлСкрипта; НачалоВыполненияКоманды = ТекущаяДата(); ЗавершениеВыполненияКоманды = НачалоВыполненияКоманды + ТаймаутВыполненияКомандыСек; // Инициализация объекта WScript.Shell Попытка objShell = Новый COMОбъект("WScript.Shell"); Исключение ВызватьИсключение "Не удалось инициализировать WScript.Shell. |Подробнее: |" + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; // Выполнение команды objWshScriptExec = objShell.Exec(ТекстСкриптаДляВыполнения); objStdOut = objWshScriptExec.StdOut; objStdErr = objWshScriptExec.StdErr; // Проверка истечения времени таймаута КомандаЗавершенаПоТаймауту = Ложь; Пока objWshScriptExec.Status = 0 Цикл Если ЗначениеЗаполнено(ТаймаутВыполненияКомандыСек) Тогда Если ЗавершениеВыполненияКоманды
После этого нам нужно выполнить парсинг выгруженных файлов, чтобы сформировать такую таблицу значений.
ТаблицаСИнформациеОМетаданных = Новый ТаблицаЗначений; ТаблицаСИнформациеОМетаданных.Колонки.Добавить("ПолноеИмяМетаданных"); ТаблицаСИнформациеОМетаданных.Колонки.Добавить("ИдентификаторОбъектаМетаданных");
Для обработки файлов сначала пробегаем в цикле все каталоги верхнего уровня. А уже после в каждом их них парсим файл XML для каждого отдельного объекта метаданных. Вот такой длинный и примитивный листинг кода получился. Процедура-монстр, но зато работает почти всегда (почти).
Процедура "ТаблицаИдентификаторовОбъектовМетаданных"
Функция ТаблицаИдентификаторовОбъектовМетаданных(КаталогВыгрузкиКонфигурации) ТаблицаСИнформациеОМетаданных = Новый ТаблицаЗначений; ТаблицаСИнформациеОМетаданных.Колонки.Добавить("ПолноеИмяМетаданных"); ТаблицаСИнформациеОМетаданных.Колонки.Добавить("ИдентификаторОбъектаМетаданных"); ВыгруженныеКаталоги = НайтиФайлы(КаталогВыгрузкиКонфигурации, "*.*"); Для Каждого ВыгруженныйФайл Из ВыгруженныеКаталоги Цикл // Обрабатываем только каталоги верхнего уровеня Если НЕ ВыгруженныйФайл.ЭтоКаталог() Тогда Продолжить; КонецЕсли; // Начинаем обработку XML-файлов ФайлыОписанияМетаданных = НайтиФайлы(ВыгруженныйФайл.ПолноеИмя, "*.xml"); Для Каждого ФайлОписанияМетаданных Из ФайлыОписанияМетаданных Цикл Если ФайлОписанияМетаданных.ЭтоКаталог() Тогда Продолжить; КонецЕсли; ИдентификаторМетаданных = Неопределено; ИмяТипаМетаданных = Неопределено; ИмяОбъектаМетаданных = Неопределено; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ФайлОписанияМетаданных.ПолноеИмя); Пока ЧтениеXML.Прочитать() Цикл Если ЧтениеXML.Имя = "MetaDataObject" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда Если ЧтениеXML.Прочитать() И НЕ ЧтениеXML.ПолучитьАтрибут("uuid") = Неопределено И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ИмяТипаМетаданных = ЧтениеXML.Имя; ИдентификаторМетаданных = ЧтениеXML.ПолучитьАтрибут("uuid"); Если ЧтениеXML.Прочитать() Тогда Если ЧтениеXML.Имя = "InternalInfo" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда Если ЧтениеXML.Прочитать() И ЧтениеXML.Имя = "xr:GeneratedType" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда СлужебноеИмя = ЧтениеXML.ПолучитьАтрибут("name"); ЧастиСлужебногоИмени = СтрРазделить(СлужебноеИмя, "."); Если ЧастиСлужебногоИмени.Количество() = 2 Тогда ИмяОбъектаМетаданных = ЧастиСлужебногоИмени.Получить(1); КонецЕсли; Прервать; КонецЕсли; // Для некоторых метаданных полное имя хранится в других узлах XML ИначеЕсли ЧтениеXML.Имя = "Properties" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда Если ЧтениеXML.Прочитать() И ЧтениеXML.Имя = "Name" Тогда Если ЧтениеXML.Прочитать() Тогда ИмяОбъектаМетаданных = ЧтениеXML.Значение; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; ЧтениеXML.Закрыть(); // Если удалось получить данные, то добавляем в таблицу значений Если ЗначениеЗаполнено(ИдентификаторМетаданных) И ЗначениеЗаполнено(ИмяТипаМетаданных) И ЗначениеЗаполнено(ИмяОбъектаМетаданных) Тогда // Ищем объект метаданных по частям имени из XML. // Это нужно для получения нормализованного имени ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяТипаМетаданных + "." + ИмяОбъектаМетаданных); ПолноеИмяМетаданных = ОбъектМетаданных.ПолноеИмя(); ЗаписьИнформация = ТаблицаСИнформациеОМетаданных.Добавить(); ЗаписьИнформация.ПолноеИмяМетаданных = ПолноеИмяМетаданных; ЗаписьИнформация.ИдентификаторОбъектаМетаданных = ИдентификаторМетаданных; Метаданные.Документы.ЗаказКлиента.ПолноеИмя() КонецЕсли; КонецЦикла; КонецЦикла; Возврат ТаблицаСИнформациеОМетаданных; КонецФункции
Теперь у нас есть таблица идентификаторов и мы можем решить поставленную задачу. Например, вывести идентификаторы в сообщении.
// Та самая задача, ради которой стоит все это делать Для Каждого Запись ИЗ ТаблицаСИнформациеОМетаданных Цикл Сообщить(Запись.ПолноеИмяМетаданных); Сообщить(Запись.ИдентификаторОбъектаМетаданных); КонецЦикла;
Конечно, у этого подхода есть большой минус - мы зависим от запуска конфигуратора, а также не малое время выгрузки конфигурации. А если конфигуратор будет занят в этот момент, то мы получим ошибку. С другой стороны, операции можно выполнять раз в сутки, а результат сохранять в базе (например, в регистр сведений) и обращаться к нему когда необходимо.
Представленные алгоритмы не идеальны, но для базового варианта реализации могут подойти. Никто не мешает Вам доработать их под свои нужды.
Стоит ли того
Все зависит от поставленной задачи и интереса к работе платформы 1С. Но если сомневаетесь, то скорее всего все вышеописанное Вам и не нужно.
Однако, выгрузка конфигурации в файлы может использоваться для широкого спектра задач, а не только получения идентификаторов объектов метаданных:
- Сохранение в системы контроля версий (внезапно!), таких как GIT.
- Чтение информации о метаданных сторонними приложениями.
- Задачи кодогенерации.
- И многое другое.
А Вы используете выгрузку конфигурации в файлы?
Удачи и успехов в делах!
Будьте в курсе!
Для Вас интересны темы по разработке на платформе 1С и связанные темы по разработке, администрированию? Присоединяйтесь в Telegram-канал, где будет появляться информация о моих новых статьях и разработках на Инфостарт, выходу обновлений, а также некоторые материалы по не1Сной тематике (СУБД, мониторинг, C# и кое-что другое).
Часть материалов, не подходящих сюда по темам, будут выходить на сайте. Там же можно ознакомиться с полным списком разработок для 1С. Думаю, что будет интересно.
Другие ссылки
- Вытаскиваем метаданные из буфера обмена 1С
- Метаданные ++ (для 1С 8.2 обычное приложение)
- Помощник работы с идентификаторами объектов
Авторские разработки (все разработки на одной странице)
- Транслятор запросов 1С в SQL - инструмент для трансляции запросов платформы 1С в SQL, а также их диагностики.
- Мастер создания копии информационной базы для отчетности - прототип инструмента для подготовки реплики в режиме только для чтения к использованию. Позволяет использовать "read-only" реплики как обычные информационные базы 1С.
- Просмотр и анализ структуры базы данных (отчет на СКД) - отчет для просмотра и анализа структуры базы данных с поддержкой файловых баз (ограниченный режим), а также баз на SQL Server и PostgreSQL.
- Просмотр и анализ журнала регистрации (отчет на СКД) - отчет на базе системы компоновки данных (СКД) для просмотра записей журнала регистрации.
- История работы пользователей (отчет на СКД) - отчет для просмотра истории работы пользователей (СКД, просмотр для любого пользователя).
- Экспорт журнала регистрации. Набор инструментов (приложения + исходный код) - набор инструментов для экспорта данных журнала регистрации во внешние хранилища для Windows и Linux. Готовые приложения и исходный код.
- Технические проверки данных регистров бухгалтерии (отчет на СКД) - отчет для технических проверок данных бухгалтерских регистров.
- Путеводитель по истории релизов - отчет по истории выпуска релизов продуктов фирмы "1С" и анализа информации по обновлениям.
Другие разработки (бесплатные и за $m)
- Помощник работы с идентификаторами объектов - инструмент для расширенного анализа идентификаторов объектов.
- Информация о пользователях информационной базы (отчет на СКД) - два простых отчета по пользователям информационной базы и информации по ним.
- Анализ производительности APDEX (бесплатный) - отчет для просмотра и анализа замеров производительности в конфигурациях на базе БСП.
- Обозреватель криптографии - отчет для просмотра доступных провайдеров и сертификатов криптографии на сервере и клиенте.
- Пакетная выгрузка / загрузка внешних отчетов и обработок - пакетная выгрузка / загрузка внешних отчетов и обработок для массовый манипуляций с ними.
- Мастер полнотекстового поиска - набор инструментов для работы с полнотекстовым индексом платформы 1С. Стандартные и расширенные возможности.
- Командный интерпретатор для 1С - инструмент для выполнения команд CMD / PowerShell из 1С
- Диагностика контекста выполнения (внешняя компонента)- небольшая экспериментальная внешняя компонента для получения дополнительной информации о контексте выполнения.