Узнать идентификатор в 1с в запросе

Забудьте о долгих поисках! Узнайте, как мгновенно вытащить идентификатор в 1С запросе простым способом. Экономия времени гарантирована.

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Работа с уникальными идентификаторами (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 уже после выполнения запроса, используется метод объекта Ссылка․УникальныйИдентификатор․

Алгоритм

  1. Выполнить запрос, выбирая Ссылку (не код, не наименование, а именно поле Ссылка)․
  2. Выгрузить результат в выборку или таблицу значений․
  3. В цикле вызвать метод УникальныйИдентификатор у каждой ссылки․

Пример кода

Запрос = Новый Запрос;
Запрос․Текст = 
 "ВЫБРАТЬ
 | Контрагенты․Ссылка
 |ИЗ
 | Справочник․Контрагенты КАК Контрагенты";

Результат = Запрос․Выполнить;
Выборка = Результат․Выбрать;

Пока Выборка․Следующий Цикл
 // Выборка․Ссылка — это объект типа СправочникСсылка․Контрагенты
 GUID = Выборка․Ссылка․УникальныйИдентификатор; // Возвращает УникальныйИдентификатор
 
 // Если нужно в строку:
 СтрокаGUID = Строка(GUID); 
 // Дальнейшая обработка․․․
КонецЦикла;

Недостатки

  • Нагрузка на клиент/сервер 1С: Требует материализации ссылок и вызова метода для каждой строки․
  • Сложность в СКД: В отчетах СКД требует использования вычисляемых полей или программного заполнения набора данных․
  • «Запрос в цикле» (антипаттерн): Новички часто пытаются сделать вложенный запрос для каждой строки, чтобы получить GUID, что катастрофически бьет по производительности․ Правильно — получить все ссылки одним запросом, а потом обойти выборку․

Способ 3: Хранение GUID в реквизите (Для высоконагруженных систем и СКД)

Если GUID объекта запрашивается очень часто (например, в отчетах СКД, построенных на больших таблицах), вызов функции в запросе или обход выборки могут быть медленными․ Оптимальный архитектурный подход, хранить GUID в отдельном реквизите справочника/документа (тип УникальныйИдентификатор) и заполнять его при записи объекта․

Реализация

  1. Создать реквизит GUIDОбъекта (тип УникальныйИдентификатор)․
  2. В модуле объекта (ПриЗаписи):
    Если ОбменДанными․Загрузка Тогда
     // При загрузке из XML/JSON GUID может прийти извне
     Если Не ЗначениеЗаполнено(Объект․GUIDОбъекта) Тогда
     Объект․GUIDОбъекта = Новый УникальныйИдентификатор;
     КонецЕсли;
    Иначе
     // При интерактивном создании или программном — генерируем новый, если пуст
     Если Не ЗначениеЗаполнено(Объект․GUIDОбъекта) Тогда
     Объект․GUIDОбъекта = Новый УникальныйИдентификатор;
     КонецЕсли;
    КонецЕсли;
  3. В запросе просто выбирать этот реквизит: ВЫБРАТЬ Номенклатура․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 (хранение в реквизите с индексом)․

Резюме: что выбрать?

  1. Современные проекты (Платформа 8․3․20+): Используйте УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) прямо в тексте запроса․ Это стандарт, чистый код и хорошая производительность для большинства задач․
  2. Старые платформы / Разовые скрипты: Выбирайте Ссылку в запрос, обходите выборку и вызывайте ․УникальныйИдентификатор․
  3. Высоконагруженные отчеты / СКД / Частый поиск по GUID: Заведите реквизит GUID (тип УникальныйИдентификатор), заполняйте при записи, вешайте индекс в БД․ Выбирайте реквизит напрямую․
  4. Интеграция (Поиск по GUID): Преобразуйте входящую строку в Новый УникальныйИдентификатор(Строка), передавайте как параметр запроса в функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР или в реквизит (если используете Способ 3)․

Использование нативной функции запроса УНИКАЛЬНЫЙИДЕНТИФИКАТОР — это текущий best practice разработки на 1С, который исключает лишние циклы, упрощает код и делает его переносимым между разными СУБД, поддерживаемыми платформой․