Как вывести уникальный идентификатор (GUID) объекта в отчете СКД?

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

При разработке отчетов на Системе компоновки данных (СКД) (помогут инструменты отладки и консоль СКД) часто возникает необходимость вывести не просто строковое представление объекта (его наименование или номер), а его внутренний уникальный идентификатор — GUID. Это может потребоваться для интеграции с внешними системами, сверки данных в SQL-базах или для отладки сложных механизмов. Рассмотрим подробнее все существующие способы решения этой задачи, от самых простых до продвинутых программных методов.

Способ 1: Использование функции XMLСтрока в вычисляемых полях

Это самый популярный и универсальный метод, который работает на большинстве версий платформы 1С:Предприятие 8. Разберем по шагам, как его реализовать. Функция XMLСтрока() предназначена для преобразования значений в формат, пригодный для XML, и для ссылочных типов она возвращает именно строковое представление уникального идентификатора.

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

XMLСтрока(Ссылка)

Здесь Ссылка — это имя поля из вашего набора данных, содержащее объект (справочник, документ и т.д.). Проанализируем ситуацию: этот метод хорош тем, что не требует изменения конфигурации и работает во внешних отчетах — для этого есть выгрузка результатов запросов в файлы. Однако при выполнении отчета может возникнуть ошибка "Функция не найдена XMLСтрока". Это происходит потому, что СКД ограничивает использование функций глобального контекста из соображений безопасности.

Способ 2: Программная инициализация процессора компоновки

Если при использовании XMLСтрока() вы столкнулись с синтаксической ошибкой, выясним причину. Система блокирует вызов внешних функций. Чтобы это исправить, нам потребуется программно инициализировать ПроцессорКомпоновкиДанных в модуле объекта отчета. Посмотрим на пример кода, который нужно разместить в процедуре ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Формируем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    
    // Важный момент: четвертый параметр Истина разрешает использование внешних функций
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Установка четвертого параметра метода Инициализировать в значение Истина позволяет СКД обращаться к глобальным функциям 1С и функциям общих модулей. Это решает проблему с XMLСтрока.

Способ 3: Встроенная функция в платформе 8.3.22 и выше

Начиная с версии платформы 8.3.22, разработчики 1С добавили прямую поддержку получения GUID в языке выражений СКД. Теперь нам не нужно использовать "хаки" с XML. Мы можем просто использовать функцию УникальныйИдентификатор().

В поле выражения на вкладке вычисляемых полей или даже в пользовательских полях теперь можно писать:

УникальныйИдентификатор(Номенклатура)

Рассмотрим преимущество этого метода: он работает быстрее и является штатным. Однако помните, что если база работает в режиме совместимости с более ранними версиями (например, 8.3.21 и ниже), эта функция будет недоступна. Всегда проверяйте режим совместимости вашей конфигурации перед использованием новых возможностей платформы.

Способ 4: Получение GUID через навигационную ссылку (для сложных случаев)

Если по каким-то причинам стандартные методы недоступны, или вы работаете в условиях жестких ограничений безопасности, можно воспользоваться методом извлечения GUID из навигационной ссылки. Навигационная ссылка объекта всегда содержит его идентификатор. Проанализируем выражение, которое можно вставить в вычисляемое поле (вместо ИмяПоля подставьте ваше поле-ссылку):


Подстрока(Подстрока(ПолучитьНавигационнуюСсылку(ИмяПоля, ""), ДлинаСтроки(ПолучитьНавигационнуюСсылку(ИмяПоля, "")) - 31, 32), 25, 8) + "-" + 
Подстрока(Подстрока(ПолучитьНавигационнуюСсылку(ИмяПоля, ""), ДлинаСтроки(ПолучитьНавигационнуюСсылку(ИмяПоля, "")) - 31, 32), 21, 4) + "-" + 
Подстрока(Подстрока(ПолучитьНавигационнуюСсылку(ИмяПоля, ""), ДлинаСтроки(ПолучитьНавигационнуюСсылку(ИмяПоля, "")) - 31, 32), 17, 4) + "-" + 
Подстрока(Подстрока(ПолучитьНавигационнуюСсылку(ИмяПоля, ""), ДлинаСтроки(ПолучитьНавигационнуюСсылку(ИмяПоля, "")) - 31, 32), 1, 4) + "-" + 
Подстрока(Подстрока(ПолучитьНавигационнуюСсылку(ИмяПоля, ""), ДлинаСтроки(ПолучитьНавигационнуюСсылку(ИмяПоля, "")) - 31, 32), 5, 12)

Важно: Этот метод основан на разборе строки и перестановке байтов, так как формат GUID в навигационной ссылке может отличаться от стандартного строкового представления. Мы рекомендуем использовать его только в крайних случаях, так как он сильно нагружает процессор при больших объемах данных.

Способ 5: Функция в общем модуле

Если конфигурация открыта для редактирования, наиболее "чистым" с точки зрения архитектуры будет создание экспортной функции в общем модуле. Создадим модуль, например, РаботаСОтчетами, установим у него флаги Сервер, Вызов сервера и пропишем код:


Функция ПолучитьГуид(Ссылка) Экспорт
    Возврат Строка(Ссылка.УникальныйИдентификатор());
КонецФункции

После этого в СКД в вычисляемом поле мы сможем просто вызвать: РаботаСОтчетами.ПолучитьГуид(Ссылка). Не забудьте, что для этого также может потребоваться программная инициализация процессора компоновки с разрешением внешних функций, как мы разбирали во втором способе.

Нюансы производительности

Выясним важную деталь: расчет GUID в вычисляемых полях происходит после того, как основной запрос выполнен к базе данных. Если ваш отчет выводит 100 000 строк, система будет 100 000 раз вызывать функцию преобразования. Если вам важна скорость работы отчета на огромных массивах данных, лучше подготовить GUID заранее в коде (например, через временные таблицы в запросе, если используется внешний набор данных) и передать в СКД уже готовую строку.

Выбирайте подходящий метод исходя из вашей версии платформы и возможности вносить изменения в конфигурацию. В большинстве случаев достаточно XMLСтрока() или новой функции УникальныйИдентификатор().

← На главную