В 1С:Предприятие перечисления часто используются для хранения ограниченного набора значений (например‚ виды занятости‚ статусы документов и т.д.). Иногда требуется определить‚ содержит ли реквизит‑перечисление пустое значение (то есть не выбрано ни одного элемента). В обычном коде это делается с помощью функции ЗначениеЗаполнено или сравнения с Перечисления.ИмяПеречисления.ПустаяСсылка. В запросах язык 1С предоставляет аналогичные возможности‚ но синтаксис немного отличается.
Основные способы проверки пустого перечисления в запросе
- Сравнение с пустой ссылкой – используем функцию
ПустаяСсылкау нужного перечисления. - Функция
ЗНАЧЕНИЕЗАПОЛНЕНО– возвращаетИстина‚ если значение не пустое. - Оператор
ЕСТЬNULL– полезно‚ когда реквизит может содержатьNULL(например‚ при левом соединении).
Пример 1: Прямое сравнение с пустой ссылкой
Допустим‚ у нас есть регистр сведений КадроваяИсторияСотрудников с реквизитом ВидЗанятости (перечисление ВидыЗанятости). Нужно выбрать только те записи‚ где вид занятости не выбран (пустое значение).
ВЫБРАТЬ Кадры.Сотрудник КАК Сотрудник‚ Кадры.ВидЗанятости КАК ВидЗанятости ИЗ РегистрСведений.КадроваяИсторияСотрудников КАК Кадры ГДЕ Кадры.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ПустаяСсылка)
В этом запросе функция ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ПустаяСсылка) возвращает именно пустую ссылку перечисления‚ и условие выполняется только для тех строк‚ где реквизит действительно пуст.
Пример 2: Использование функции ЗНАЧЕНИЕЗАПОЛНЕНО
Если требуется обратное условие – выбрать записи‚ где вид занятости выбран (не пустой)‚ удобно применить ЗНАЧЕНИЕЗАПОЛНЕНО:
ВЫБРАТЬ Кадры.Сотрудник КАК Сотрудник‚ Кадры.ВидЗанятости КАК ВидЗанятости ИЗ РегистрСведений.КадроваяИсторияСотрудников КАК Кадры ГДЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Кадры.ВидЗанятости) = ИСТИНА
Функция возвращает Истина‚ если значение реквизита не является пустой ссылкой перечисления.
Пример 3: Комбинация с левым соединением и проверкой на NULL
Иногда реквизит перечисления может отсутствовать в результате соединения (например‚ при левом соединении с другой таблицей‚ где совпадений нет). В таких случаях значение будет NULL‚ и прямое сравнение с пустой ссылкой не сработает. Нужно добавить проверку на NULL:
ВЫБРАТЬ Сотр.Сотрудник КАК Сотрудник‚ Кадры.ВидЗанятости КАК ВидЗанятости ИЗ Справочник.Сотрудники КАК Сотр ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников КАК Кадры ПО Кадры.Сотрудник = Сотр.Ссылка ГДЕ (Кадры.ВидЗанятости IS NULL) // нет записи в регистре ИЛИ (Кадры.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ПустаяСсылка)) // запись есть‚ но значение пустое
Здесь используется условие IS NULL для обнаружения отсутствующих строк после левого соединения‚ а также стандартная проверка на пустую ссылку.
Полезные советы и типичные ошибки
- Всегда указывайте полное имя перечисления в функции
ЗНАЧЕНИЕ‚ иначе запрос не скомпилируется. - Не путайте
ПустаяСсылкаиNULL– первое относится к типу перечисления‚ второе – к отсутствию значения вообще. - Для проверки «не пустое» удобно использовать отрицание:
НЕ ЗНАЧЕНИЕЗАПОЛНЕНО(Реквизит)илиРеквизит <> ЗНАЧЕНИЕ(Перечисление.Имя.ПустаяСсылка). - При работе с параметрами запроса передавайте значение перечисления так же‚ как и обычное значение:
Параметры.Вставить("ВидЗанятости"‚ Перечисления.ВидыЗанятости.Неопределено)– но помните‚ чтоНеопределено– это не пустая ссылка‚ а специальное значение‚ указывающее на отсутствие выбора в форме.
Проверка перечисления на пустое значение в запросе 1С выполняется либо через прямое сравнение с результатом функции ПустаяСсылка у нужного перечисления‚ либо через функцию ЗНАЧЕНИЕЗАПОЛНЕНО. При использовании соединений‚ где может появиться NULL‚ необходимо дополнительно проверять отсутствие значения через оператор IS NULL. Правильное применение этих приёмов позволяет гибко фильтровать данные в отчетах‚ обработках и других объектах конфигурации‚ не прибегая к избыточному коду в модулях.
Надеюсь‚ представленные примеры и рекомендации помогут вам эффективно работать с пустыми значениями перечислений в запросах 1С.