При разработке интерфейсов на управляемых формах 1С нередко возникает задача отобразить уникальный идентификатор (GUID) объекта непосредственно в динамическом списке. Это может требоваться по техническому заданию для сопоставления данных с внешними информационными системами, отладки интеграций или быстрого копирования идентификатора пользователем. Разберем подробно, как решить эту задачу в запросе динамического списка, какие ограничения накладывает платформа 1С и какие существуют альтернативные пути реализации.
Начиная с версии платформы 8.3.22, в язык запросов и язык выражений СКД была добавлена штатная функция УникальныйИдентификатор. Она принимает ссылочный тип данных и возвращает системный идентификатор объекта.
Рассмотрим по шагам, как применить данную функцию в произвольном запросе динамического списка:
Посмотрим на пример текста запроса для справочника Номенклатура:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование,
УникальныйИдентификатор(Номенклатура.Ссылка) КАК УникальныйИдентификатор
ИЗ
Справочник.Номенклатура КАК Номенклатура
Проанализируем ключевые особенности работы этого механизма:
УникальныйИдентификатор, а не примитивную строку.ВЫРАЗИТЬ(УникальныйИдентификатор(Ссылка) КАК Строка), поскольку явное приведение идентификаторов к строке на уровне запроса не поддерживается.УникальныйИдентификатор переносится в колонки таблицы динамического списка на форме, платформа автоматически формирует стандартное строковое представление GUID с дефисами (формата xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).Если конфигурация работает на режиме совместимости ниже 8.3.22, получить GUID внутри запроса динамического списка штатными средствами нельзя. В таких ситуациях разберем практичный подход с обработчиком события ПриПолученииДанныхНаСервере таблицы формы.
Этот метод позволяет вычислять GUID только для тех строк, которые фактически отображаются на экране пользователя в текущий момент, без лишней нагрузки на базу данных:
КолонкаУникальныйИдентификатор, и укажем для неё строковый тип.ПриПолученииДанныхНаСервере.XMLСтрока() или метода УникальныйИдентификатор() ссылки.Посмотрим на пример кода в модуле формы:
&НаСервере
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Для Каждого СтрокаСписка Из Строки Цикл
ТекущаяСсылка = СтрокаСписка.Ключ;
СтрокаСписка.Оформление["КолонкаУникальныйИдентификатор"].УстановитьТекст(XMLСтрока(ТекущаяСсылка));
КонецЦикла;
КонецПроцедуры
Данный вариант работает абсолютно на всех версиях платформы 1С:Предприятие 8.3 и не требует изменения текста запроса списка.
Динамический список построен на механизмах Системы компоновки данных. Если в списке используется схема компоновки данных, мы можем добавить вычисляемое поле. В выражении вычисляемого поля на вкладке настроек СКД можно указать вызов экспортной функции общего модуля, которая вернет строковый GUID переданной ссылки, либо использовать штатные механизмы СКД, если версия платформы поддерживает работу с идентификаторами.
Выясним важные технические нюансы, с которыми можно столкнуться при выводе GUID в динамическом списке:
Справочник.Номенклатура). Если основная таблица не указана, динамический список перестает считывать данные динамическими порциями, теряет оптимизацию и не обновляется автоматически при вызове метода ОповеститьОбИзменении().УникальныйИдентификатор(Ссылка), является вычисляемым на лету выражением. Если пользователь установит отбор, попытается отсортировать список по этой колонке или воспользуется стандартным поиском, СУБД не сможет применить индекс по полю ссылки. Это приведет к полному сканированию таблицы (full scan) и заметным задержкам интерфейса на больших объемах данных.