Как в запросе динамического списка вывести уникальный идентификатор (GUID)?

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

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

Способ 1. Использование встроенной функции языка запросов «УникальныйИдентификатор»

Начиная с версии платформы 8.3.22, в язык запросов и язык выражений СКД была добавлена штатная функция УникальныйИдентификатор. Она принимает ссылочный тип данных и возвращает системный идентификатор объекта.

Рассмотрим по шагам, как применить данную функцию в произвольном запросе динамического списка:

  1. Откроем форму со списком справочника или документа в конфигураторе.
  2. В свойствах динамического списка установим флаг ПроизвольныйЗапрос.
  3. Перейдем к тексту запроса и вызовем функцию от поля ссылки.

Посмотрим на пример текста запроса для справочника Номенклатура:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
    Номенклатура.Код КАК Код,
    Номенклатура.Наименование КАК Наименование,
    УникальныйИдентификатор(Номенклатура.Ссылка) КАК УникальныйИдентификатор
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Проанализируем ключевые особенности работы этого механизма:

  1. Режим совместимости: для использования функции режим совместимости конфигурации должен быть установлен не ниже версии 8.3.22. Если режим совместимости ниже, платформа выдаст синтаксическую ошибку при разборе текста запроса.
  2. Тип возвращаемого значения: функция возвращает значение специального системного типа УникальныйИдентификатор, а не примитивную строку.
  3. Ограничение преобразования типов: в языке запросов 1С невозможно применить конструкцию вида ВЫРАЗИТЬ(УникальныйИдентификатор(Ссылка) КАК Строка), поскольку явное приведение идентификаторов к строке на уровне запроса не поддерживается.
  4. Отображение в интерфейсе: когда поле с типом УникальныйИдентификатор переносится в колонки таблицы динамического списка на форме, платформа автоматически формирует стандартное строковое представление GUID с дефисами (формата xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
  5. Источники данных: функция работает со стандартными ссылочными типами конфигурации (справочники, документы, планы видов характеристик и др.), но не поддерживает таблицы внешних источников данных.

Способ 2. Получение идентификатора через обработчик «ПриПолученииДанныхНаСервере»

Если конфигурация работает на режиме совместимости ниже 8.3.22, получить GUID внутри запроса динамического списка штатными средствами нельзя. В таких ситуациях разберем практичный подход с обработчиком события ПриПолученииДанныхНаСервере таблицы формы.

Этот метод позволяет вычислять GUID только для тех строк, которые фактически отображаются на экране пользователя в текущий момент, без лишней нагрузки на базу данных:

  1. Добавим в таблицу формы новую колонку, например с именем КолонкаУникальныйИдентификатор, и укажем для неё строковый тип.
  2. Для таблицы формы создадим обработчик события ПриПолученииДанныхНаСервере.
  3. Заполним идентификаторы для видимых строк с помощью вызова XMLСтрока() или метода УникальныйИдентификатор() ссылки.

Посмотрим на пример кода в модуле формы:


&НаСервере
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    Для Каждого СтрокаСписка Из Строки Цикл
        ТекущаяСсылка = СтрокаСписка.Ключ;
        СтрокаСписка.Оформление["КолонкаУникальныйИдентификатор"].УстановитьТекст(XMLСтрока(ТекущаяСсылка));
    КонецЦикла;
КонецПроцедуры

Данный вариант работает абсолютно на всех версиях платформы 1С:Предприятие 8.3 и не требует изменения текста запроса списка.

Способ 3. Использование вычисляемых полей СКД

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

Влияние на производительность и тонкости работы динамического списка

Выясним важные технические нюансы, с которыми можно столкнуться при выводе GUID в динамическом списке:

  1. Свойство «Основная таблица»: при включении произвольного запроса всегда проверяйте заполнение свойства Основная таблица (например, Справочник.Номенклатура). Если основная таблица не указана, динамический список перестает считывать данные динамическими порциями, теряет оптимизацию и не обновляется автоматически при вызове метода ОповеститьОбИзменении().
  2. Поиск, отборы и сортировка: поле, полученное функцией УникальныйИдентификатор(Ссылка), является вычисляемым на лету выражением. Если пользователь установит отбор, попытается отсортировать список по этой колонке или воспользуется стандартным поиском, СУБД не сможет применить индекс по полю ссылки. Это приведет к полному сканированию таблицы (full scan) и заметным задержкам интерфейса на больших объемах данных.
  3. Хранение в реквизите как альтернатива: если по GUID требуется регулярный быстрый поиск или фильтрация в огромных массивах данных, оптимальным архитектурным решением будет создание отдельного строкового реквизита объекта (длиной 36 символов) либо независимого регистра сведений, заполняемого при записи объекта. В таком случае идентификатор индексируется базой данных и выбирается простым чтением реквизита.
← На главную