При работе с типом данных УникальныйИдентификатор (GUID) в среде 1С:Предприятие разработчики часто сталкиваются с неожиданным ограничением: в языке запросов для этого типа не существует литерала пустого значения. Если для ссылочных типов мы можем легко написать ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка), то для GUID такой синтаксис не предусмотрен. В этой статье мы подробно разберем, почему так происходит, и какими способами можно реализовать проверку на «пустой» идентификатор (состоящий из одних нулей) в различных механизмах платформы.
Прежде всего, проанализируем ситуацию с точки зрения архитектуры платформы. В отличие от ссылок, которые являются комплексными объектами, УникальныйИдентификатор в 1С рассматривается как более примитивный тип, но при этом он не обладает встроенными константами в языке запросов. Рассмотрим основные ограничения, с которыми мы сталкиваемся:
ВЫРАЗИТЬ или создать объект прямо в тексте запроса.BINARY(16). Это означает, что простое сравнение со строкой "00000000-0000-0000-0000-000000000000" внутри запроса приведет к ошибке несовместимости типов.ПОДСТРОКА не применимы к полям этого типа, что закрывает путь к «хитрым» проверкам первых символов на равенство нулю.Таким образом, единственным легитимным способом работы с этим типом в запросе остается использование параметров.
Самый распространенный и надежный метод — это передача эталонного пустого идентификатора в качестве параметра запроса. Разберем по шагам, как это реализовать в коде программного модуля.
Сначала мы создаем объект пустого идентификатора. В 1С это можно сделать, передав в конструктор строку из нулей или воспользовавшись методами БСП. Проанализируем пример кода:
// Вариант 1: Прямое создание пустого УИД
ПустойУИД = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
// Вариант 2: Если в конфигурации используется БСП
ПустойУИД = ОбщегоНазначенияКлиентСервер.ПустойИдентификатор();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МояТаблица.Ссылка,
| МояТаблица.РеквизитУИД
|ИЗ
| Справочник.МойСправочник КАК МояТаблица
|ГДЕ
| МояТаблица.РеквизитУИД = &ПустойУИД";
Запрос.УстановитьПараметр("ПустойУИД", ПустойУИД);
Результат = Запрос.Выполнить();
Важный нюанс: Обратите внимание, что просто вызов Новый УникальныйИдентификатор() без параметров в некоторых контекстах может генерировать новый случайный GUID. Для надежности всегда указывайте строку из нулей или используйте функции библиотек.
Если задача стоит в рамках динамического списка или отчета на базе Системы компоновки данных (СКД), у нас есть больше маневров. Рассмотрим, как избежать необходимости постоянно прописывать параметр в коде вызова формы.
В СКД мы можем настроить параметр на закладке «Параметры». Чтобы сделать его «пустым» по умолчанию и при этом типизированным, выполним следующие действия:
ПустойУИД.УникальныйИдентификатор.НОВЫЙ УникальныйИдентификатор("00000000-0000-0000-0000-000000000000").Такой подход позволяет запросу внутри СКД автоматически подхватывать нужное значение, не требуя программной установки параметра через Список.Параметры.УстановитьЗначениеПараметра. Это значительно упрощает поддержку кода и делает схему компоновки самодостаточной.
Проанализируем критически важную деталь, которую часто упускают начинающие разработчики. В запросах 1С «пустое» значение GUID и отсутствие значения (NULL) — это абсолютно разные вещи.
Рассмотрим ситуацию с ЛЕВЫМ СОЕДИНЕНИЕМ. Если во второй таблице не найдена соответствующая запись, поле с типом УникальныйИдентификатор примет значение NULL. В этом случае проверка ГДЕ РеквизитУИД = &ПустойУИД вернет Ложь, так как NULL не равен пустому идентификатору.
Правильная логика комплексной проверки должна выглядеть так:
ГДЕ (МояТаблица.РеквизитУИД = &ПустойУИД ИЛИ МояТаблица.РеквизитУИД ЕСТЬ NULL)
Это позволит корректно обрабатывать как физически записанные в базу «нулевые» идентификаторы, так и результаты отсутствующих связей в соединениях.
Подводя итог нашему разбору, выделим главные правила:
ЗНАЧЕНИЕ() для GUID не существует.ОбщегоНазначенияКлиентСервер.ПустойИдентификатор() для повышения читаемости кода.Следуя этим рекомендациям, вы сможете эффективно работать с уникальными идентификаторами в любых, даже самых сложных запросах 1С.