Как проверить поле типа УникальныйИдентификатор на пустое значение в запросе 1С

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

При работе с типом данных УникальныйИдентификатор (GUID) в среде 1С:Предприятие разработчики часто сталкиваются с неожиданным ограничением: в языке запросов для этого типа не существует литерала пустого значения. Если для ссылочных типов мы можем легко написать ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка), то для GUID такой синтаксис не предусмотрен. В этой статье мы подробно разберем, почему так происходит, и какими способами можно реализовать проверку на «пустой» идентификатор (состоящий из одних нулей) в различных механизмах платформы.

Особенности типа УникальныйИдентификатор в языке запросов

Прежде всего, проанализируем ситуацию с точки зрения архитектуры платформы. В отличие от ссылок, которые являются комплексными объектами, УникальныйИдентификатор в 1С рассматривается как более примитивный тип, но при этом он не обладает встроенными константами в языке запросов. Рассмотрим основные ограничения, с которыми мы сталкиваемся:

  1. Отсутствие конструктора в запросе: Мы не можем использовать функцию ВЫРАЗИТЬ или создать объект прямо в тексте запроса.
  2. Типизация в СУБД: На уровне базы данных (например, MS SQL Server) этот тип обычно хранится как BINARY(16). Это означает, что простое сравнение со строкой "00000000-0000-0000-0000-000000000000" внутри запроса приведет к ошибке несовместимости типов.
  3. Невозможность строковых операций: Функции типа ПОДСТРОКА не применимы к полям этого типа, что закрывает путь к «хитрым» проверкам первых символов на равенство нулю.

Таким образом, единственным легитимным способом работы с этим типом в запросе остается использование параметров.

Способ 1: Использование параметров в обычном запросе

Самый распространенный и надежный метод — это передача эталонного пустого идентификатора в качестве параметра запроса. Разберем по шагам, как это реализовать в коде программного модуля.

Сначала мы создаем объект пустого идентификатора. В 1С это можно сделать, передав в конструктор строку из нулей или воспользовавшись методами БСП. Проанализируем пример кода:


// Вариант 1: Прямое создание пустого УИД
ПустойУИД = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");

// Вариант 2: Если в конфигурации используется БСП
ПустойУИД = ОбщегоНазначенияКлиентСервер.ПустойИдентификатор();

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	МояТаблица.Ссылка,
    |	МояТаблица.РеквизитУИД
    |ИЗ
    |	Справочник.МойСправочник КАК МояТаблица
    |ГДЕ
    |	МояТаблица.РеквизитУИД = &ПустойУИД";

Запрос.УстановитьПараметр("ПустойУИД", ПустойУИД);
Результат = Запрос.Выполнить();

Важный нюанс: Обратите внимание, что просто вызов Новый УникальныйИдентификатор() без параметров в некоторых контекстах может генерировать новый случайный GUID. Для надежности всегда указывайте строку из нулей или используйте функции библиотек.

Способ 2: Работа в динамическом списке и СКД

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

В СКД мы можем настроить параметр на закладке «Параметры». Чтобы сделать его «пустым» по умолчанию и при этом типизированным, выполним следующие действия:

  1. Добавим параметр с именем ПустойУИД.
  2. Установим ему тип УникальныйИдентификатор.
  3. В колонке «Выражение» пропишем: НОВЫЙ УникальныйИдентификатор("00000000-0000-0000-0000-000000000000").

Такой подход позволяет запросу внутри СКД автоматически подхватывать нужное значение, не требуя программной установки параметра через Список.Параметры.УстановитьЗначениеПараметра. Это значительно упрощает поддержку кода и делает схему компоновки самодостаточной.

Различие между NULL и Пустым GUID

Проанализируем критически важную деталь, которую часто упускают начинающие разработчики. В запросах 1С «пустое» значение GUID и отсутствие значения (NULL) — это абсолютно разные вещи.

Рассмотрим ситуацию с ЛЕВЫМ СОЕДИНЕНИЕМ. Если во второй таблице не найдена соответствующая запись, поле с типом УникальныйИдентификатор примет значение NULL. В этом случае проверка ГДЕ РеквизитУИД = &ПустойУИД вернет Ложь, так как NULL не равен пустому идентификатору.

Правильная логика комплексной проверки должна выглядеть так:

ГДЕ (МояТаблица.РеквизитУИД = &ПустойУИД ИЛИ МояТаблица.РеквизитУИД ЕСТЬ NULL)

Это позволит корректно обрабатывать как физически записанные в базу «нулевые» идентификаторы, так и результаты отсутствующих связей в соединениях.

Резюме

Подводя итог нашему разбору, выделим главные правила:

Следуя этим рекомендациям, вы сможете эффективно работать с уникальными идентификаторами в любых, даже самых сложных запросах 1С.

← На главную