Работа с уникальными идентификаторами (GUID / УникальныйИдентификатор), частая задача при интеграции 1С с внешними системами, обмене данными или анализе ссылочных объектов․ Долгое время платформа не позволяла получить GUID напрямую в тексте запроса, что заставляло разработчиков использовать обходные пути․ Однако, начиная с недавних версий платформы 1С:Предприятие 8․3, появилась встроенная функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР, кардинально упростившая эту задачу․
В этой статье мы подробно разберем все актуальные способы получения идентификатора в запросе, их нюансы, производительность и примеры кода․
Способ 1: Функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР (Рекомендуемый, современный)
Начиная с версии платформы 8․3․20 (точную версию стоит уточнить в заметках к релизу, функция появилась в 2023-2024 гг․), в языке запросов доступна функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР; Она принимает на вход ссылку и возвращает значение типа УникальныйИдентификатор (GUID)․ Если передана пустая ссылка — возвращается NULL․
Синтаксис
УНИКАЛЬНЫЙИДЕНТИФИКАТОР(<Ссылка>) Пример использования
Получим GUID для элементов справочника Номенклатура:
Запрос = Новый Запрос;
Запрос․Текст =
"ВЫБРАТЬ
| Номенклатура․Ссылка КАК Ссылка,
| УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Номенклатура․Ссылка) КАК GUID
|ИЗ
| Справочник․Номенклатура КАК Номенклатура";
Результат = Запрос․Выполнить;
Выборка = Результат․Выбрать;
Пока Выборка․Следующий Цикл
// Выборка․GUID имеет тип УникальныйИдентификатор
// Для передачи во внешние системы часто нужно строковое представление:
СтрокаGUID = Строка(Выборка․GUID); // Формат: 9712e912-d0b9-11e1-b37b-0050568458ce
Сообщить(Выборка․Ссылка + " -> " + СтрокаGUID);
КонецЦикла; Преимущества
- Производительность: Выполняется на уровне СУБД, не требует обхода выборки на клиенте/сервере 1С для извлечения GUID․
- Читаемость: Код становится декларативным и понятным․
- Типизация: Результат имеет нативный тип
УникальныйИдентификатор, что удобно для дальнейшей работы (сравнение, запись в реквизиты типа UUID);
Способ 2: Получение GUID через обход результата запроса (Классический, для старых версий)
Если вы используете старую версию платформы, где функции УНИКАЛЬНЫЙИДЕНТИФИКАТОР нет, или если по какой-то причине нужно получить GUID уже после выполнения запроса, используется метод объекта Ссылка․УникальныйИдентификатор․
Алгоритм
- Выполнить запрос, выбирая Ссылку (не код, не наименование, а именно поле
Ссылка)․ - Выгрузить результат в выборку или таблицу значений․
- В цикле вызвать метод
УникальныйИдентификатору каждой ссылки․
Пример кода
Запрос = Новый Запрос;
Запрос․Текст =
"ВЫБРАТЬ
| Контрагенты․Ссылка
|ИЗ
| Справочник․Контрагенты КАК Контрагенты";
Результат = Запрос․Выполнить;
Выборка = Результат․Выбрать;
Пока Выборка․Следующий Цикл
// Выборка․Ссылка — это объект типа СправочникСсылка․Контрагенты
GUID = Выборка․Ссылка․УникальныйИдентификатор; // Возвращает УникальныйИдентификатор
// Если нужно в строку:
СтрокаGUID = Строка(GUID);
// Дальнейшая обработка․․․
КонецЦикла; Недостатки
- Нагрузка на клиент/сервер 1С: Требует материализации ссылок и вызова метода для каждой строки․
- Сложность в СКД: В отчетах СКД требует использования вычисляемых полей или программного заполнения набора данных․
- «Запрос в цикле» (антипаттерн): Новички часто пытаются сделать вложенный запрос для каждой строки, чтобы получить GUID, что катастрофически бьет по производительности․ Правильно — получить все ссылки одним запросом, а потом обойти выборку․
Способ 3: Хранение GUID в реквизите (Для высоконагруженных систем и СКД)
Если GUID объекта запрашивается очень часто (например, в отчетах СКД, построенных на больших таблицах), вызов функции в запросе или обход выборки могут быть медленными․ Оптимальный архитектурный подход, хранить GUID в отдельном реквизите справочника/документа (тип УникальныйИдентификатор) и заполнять его при записи объекта․
Реализация
- Создать реквизит
GUIDОбъекта(типУникальныйИдентификатор)․ - В модуле объекта (ПриЗаписи):
Если ОбменДанными․Загрузка Тогда // При загрузке из XML/JSON GUID может прийти извне Если Не ЗначениеЗаполнено(Объект․GUIDОбъекта) Тогда Объект․GUIDОбъекта = Новый УникальныйИдентификатор; КонецЕсли; Иначе // При интерактивном создании или программном — генерируем новый, если пуст Если Не ЗначениеЗаполнено(Объект․GUIDОбъекта) Тогда Объект․GUIDОбъекта = Новый УникальныйИдентификатор; КонецЕсли; КонецЕсли; - В запросе просто выбирать этот реквизит:
ВЫБРАТЬ Номенклатура․GUIDОбъекта ИЗ Справочник․Номенклатура․
Плюсы
- Мгновенное чтение без вычислений․
- Идеально для СКД (доступно как обычное поле)․
- Стабильный идентификатор для интеграций (не меняется при перезаписи объекта, если логика корректна)․
Работа с GUID в условиях и параметрах запроса
Частая задача — найти объект по известному GUID (строке), полученному из внешней системы․
Преобразование строки в УникальныйИдентификатор
В коде 1С (не в тексте запроса) строку конвертируют через конструктор:
СтрокаGUID = "9712e912-d0b9-11e1-b37b-0050568458ce";
МойGUID = Новый УникальныйИдентификатор(СтрокаGUID); Передача в запрос как параметр
Запрос = Новый Запрос;
Запрос․Текст =
"ВЫБРАТЬ Ссылка
|ИЗ Справочник․Номенклатура
|ГДЕ УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) = &МойGUID";
Запрос․УстановитьПараметр("МойGUID", МойGUID); // Передаем объект УникальныйИдентификатор
Результат = Запрос․Выполнить; Важно: В параметр запроса нужно передавать значение типа УникальныйИдентификатор, а не строку․ Платформа сама корректно преобразует его в литерал СУБД․
Использование оператора В (ВХОДИТ В СПИСОК)
Если нужно отобрать по массиву GUID:
МассивGUID = Новый Массив;
МассивGUID․Добавить(Новый УникальныйИдентификатор("․․․"));
МассивGUID․Добавить(Новый УникальныйИдентификатор("․․․"));
Запрос․Текст =
"ВЫБРАТЬ Ссылка
|ИЗ Справочник;Номенклатура
|ГДЕ УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) В(&МассивGUID)";
Запрос․УстановитьПараметр("МассивGUID", МассивGUID); Особенности типов данных и преобразований
| Тип / Контекст | Представление | Как получить строку |
|---|---|---|
| УникальныйИдентификатор (встроенный тип 1С) | 16-байтовое значение | Строка(GUID) -> «xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx» |
| Ссылка на объект (СправочникСсылка, ДокументСсылка и т․д․) | Ссылка на запись в БД | Ссылка․УникальныйИдентификатор -> УникальныйИдентификатор |
| Результат функции УНИКАЛЬНЫЙИДЕНТИФИКАТОР в запросе | Поле типа УникальныйИдентификатор | При выгрузке в ТЗ/Выборку — объект УникальныйИдентификатор․ Строка(Поле) |
Частые ошибки и ловушки
- Попытка использовать CAST/ВЫРАЗИТЬ КАК Строка в запросе:
ВЫРАЗИТЬ(УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) КАК СТРОКА(36))— не работает корректно во всех СУБД или возвращает внутреннее бинарное представление․ Лучше получать типУникальныйИдентификатори преобразовывать в строку в коде 1С (Строка)․ - Пустые ссылки: Функция
УНИКАЛЬНЫЙИДЕНТИФИКАТОР(ПустаяСсылка)возвращаетNULL․ МетодПустаяСсылка․УникальныйИдентификаторгенерирует исключение или возвращает нулевой GUID (зависит от версии)․ Всегда проверяйте:ЕСТЬNULL(УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка), Новый УникальныйИдентификатор)или проверяйте заполненность ссылки заранее․ - Сравнение со строкой в запросе: Не пишите
ГДЕ УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) = "строка"․ Только через параметр типаУникальныйИдентификатор․ - Производительность на больших таблицах: Функция
УНИКАЛЬНЫЙИДЕНТИФИКАТОРв условииГДЕможет не использовать индексы эффективно (зависит от СУБД: PostgreSQL, MS SQL, Oracle)․ Для частых поисков по GUID — см․ Способ 3 (хранение в реквизите с индексом)․
Резюме: что выбрать?
- Современные проекты (Платформа 8․3․20+): Используйте УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) прямо в тексте запроса․ Это стандарт, чистый код и хорошая производительность для большинства задач․
- Старые платформы / Разовые скрипты: Выбирайте Ссылку в запрос, обходите выборку и вызывайте
․УникальныйИдентификатор․ - Высоконагруженные отчеты / СКД / Частый поиск по GUID: Заведите реквизит
GUID(тип УникальныйИдентификатор), заполняйте при записи, вешайте индекс в БД․ Выбирайте реквизит напрямую․ - Интеграция (Поиск по GUID): Преобразуйте входящую строку в
Новый УникальныйИдентификатор(Строка), передавайте как параметр запроса в функциюУНИКАЛЬНЫЙИДЕНТИФИКАТОРили в реквизит (если используете Способ 3)․
Использование нативной функции запроса УНИКАЛЬНЫЙИДЕНТИФИКАТОР — это текущий best practice разработки на 1С, который исключает лишние циклы, упрощает код и делает его переносимым между разными СУБД, поддерживаемыми платформой․