Как проверить строковое поле на пустоту в запросе 1С и подставить другое значение?

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

При работе с запросами в системе 1С:Предприятие разработчики и пользователи часто сталкиваются с необходимостью проверки значений полей на пустоту или отсутствие данных, а затем подстановки альтернативных значений. Это особенно актуально для строковых полей, которые могут быть как пустыми строками (""), так и неопределенными значениями (NULL) в результате соединений таблиц.

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

Понимание различных типов "пустых" значений в 1С

Прежде чем приступить к решению, давайте разберемся, какие бывают "пустые" значения в контексте 1С и как они соотносятся друг с другом. Это критически важно для выбора правильного метода проверки.

Пустая строка ("")

Это самое простое и очевидное "пустое" значение для строковых полей. Пустая строка представляет собой строковое значение нулевой длины. В языке запросов 1С она обозначается как две кавычки без символов между ними.

Значение NULL

Значение NULL (часто произносится как "нал") — это концепция уровня SQL, которая означает отсутствие какого-либо значения. Оно не равно пустой строке, нулю или логическому "Ложь". NULL указывает на то, что данные неизвестны или отсутствуют.

Оно возникает, когда запись из одной таблицы, участвующей в соединении (например, ЛЕВОЕ СОЕДИНЕНИЕ или ПОЛНОЕ СОЕДИНЕНИЕ), не находит соответствующей записи в другой таблице. В результате поля из несопоставленной таблицы для этой записи будут иметь значение NULL.

Значение Неопределено

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

Важно помнить, что Неопределено не является аналогом NULL в языке SQL запросов, хотя и несет схожий смысл отсутствия конкретного значения. Для его обработки в запросах используется прямое сравнение.

Пустая ссылка

Для ссылочных типов данных (например, элементов справочника, документов) существует понятие Пустой ссылки. Это специальное значение, которое указывает на то, что ссылочное поле не указывает ни на один существующий объект информационной базы.

Не путайте пустую ссылку с NULL или Неопределено. Пустая ссылка — это конкретное, хоть и "пустое", значение для ссылочных типов, которое имеет свой уникальный идентификатор в базе данных.

Решение 1: Проверка на пустую строку ("") с использованием оператора ВЫБОР КОГДА

Для проверки строкового поля на пустую строку и подстановки другого значения, как в случае с проблемой автора, мы используем оператор ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Этот оператор является фундаментальным инструментом для условной логики в языке запросов 1С.

Изначальная попытка автора была близка к решению:


Выбор Когда Справочник.ОсновныеСредства.ЗаводскойНомер = "" 
    Тогда "Моё значение" 
    Иначе Справочник.ОсновныеСредства.ЗаводскойНомер 
Конец

Проблема могла быть связана с синтаксисом или использованием полного имени поля без алиасов, что не всегда корректно вне секции ИЗ или при отсутствии алиаса таблицы. В секции ВЫБРАТЬ мы обычно используем поля, которые уже выбраны из таблиц и, возможно, переименованы через алиасы.

Давайте рассмотрим этот пример подробнее, как он был предложен в качестве рабочего решения на форуме:


ВЫБРАТЬ
    Ссылка,
    ВЫБОР КОГДА ЗаводскойНомер = "" ТОГДА "<Заводской номер не указан>" ИНАЧЕ ЗаводскойНомер КОНЕЦ КАК ЗаводскойНомер
ИЗ
    Справочник.ОсновныеСредства

Здесь ЗаводскойНомер — это поле из таблицы Справочник.ОсновныеСредства. Мы сначала выбираем это поле, а затем в секции ВЫБРАТЬ используем оператор ВЫБОР КОГДА:

  1. КОГДА ЗаводскойНомер = "": Если значение поля ЗаводскойНомер равно пустой строке...
  2. ТОГДА "<Заводской номер не указан>": ...то мы подставляем строку "Заводской номер не указан".
  3. ИНАЧЕ ЗаводскойНомер: ...в противном случае (если строка не пуста), мы оставляем оригинальное значение поля ЗаводскойНомер.
  4. КОНЕЦ КАК ЗаводскойНомер: Завершаем оператор ВЫБОР КОГДА и присваиваем полученному полю псевдоним ЗаводскойНомер, переопределяя исходное поле или создавая новое.

Таким образом, мы успешно проверяем строковое поле на пустоту и подставляем заданное значение.

Решение 2: Обработка значений NULL с функцией ЕСТЬNULL()

Когда наши данные могут содержать NULL, особенно после использования левых (или полных) соединений, оператор ВЫБОР КОГДА также может быть использован с условием ЕСТЬ NULL. Однако в языке запросов 1С существует более лаконичная и специализированная функция для работы с NULL — ЕСТЬNULL().

Функция ЕСТЬNULL(<ПроверяемоеВыражение>, <ВыражениеЗамены>) предназначена именно для этого: если <ПроверяемоеВыражение> является NULL, функция возвращает <ВыражениеЗамены>; в противном случае она возвращает само <ПроверяемоеВыражение>.

Рассмотрим ситуацию, когда мы хотим получить информацию о заводском номере из дополнительной таблицы, связанной с основным средством ЛЕВЫМ СОЕДИНЕНИЕМ. Если для основного средства не найдется записи во второй таблице, поле с заводским номером будет иметь значение NULL.


ВЫБРАТЬ
    ОС.Ссылка,
    ЕСТЬNULL(ДопСведения.ЗаводскойНомер, "Не указан (NULL)") КАК ЗаводскойНомер
ИЗ
    Справочник.ОсновныеСредства КАК ОС
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведенияОС КАК ДопСведения
        ПО ОС.Ссылка = ДопСведения.ОсновноеСредство

В этом примере, если для ОсновноеСредство не найдется соответствующей записи в регистре ДополнительныеСведенияОС, поле ДопСведения.ЗаводскойНомер будет NULL. В этом случае функция ЕСТЬNULL() подставит строку "Не указан (NULL)". Если же запись найдена и ЗаводскойНомер имеет какое-либо значение (включая пустую строку ""), то будет возвращено это значение.

Важное отличие: ЕСТЬNULL() более лаконична и часто предпочтительнее для обработки именно NULL-значений по сравнению с развернутым оператором ВЫБОР КОГДА ... ЕСТЬ NULL ТОГДА ... ИНАЧЕ ... КОНЕЦ.

Она также стремится привести тип выражения замены к типу проверяемого выражения, если оно имеет строковый или числовой тип, что может быть удобно.

Проверка на значение Неопределено и Пустую ссылку в запросах

Хотя исходный вопрос касался пустой строки, важно рассмотреть и другие типы "пустых" значений, которые могут встретиться в запросах.

Проверка на Неопределено

Если в результате запроса или из виртуальных таблиц могут приходить значения типа Неопределено, их можно проверить с помощью оператора ВЫБОР КОГДА:


ВЫБРАТЬ
    ПолеИсточника,
    ВЫБОР КОГДА ПолеИсточника = Неопределено ТОГДА "Значение не установлено" ИНАЧЕ ПолеИсточника КОНЕЦ КАК РезультатПоля
ИЗ
    НекаяВиртуальнаяТаблица

Здесь мы явно сравниваем поле со значением Неопределено. Это полезно, например, при работе с некоторыми параметрами запросов или специфическими полями регистров, где 1С может хранить такие значения.

Проверка на Пустую ссылку

Для ссылочных полей, когда нам нужно определить, указывает ли ссылка на несуществующий объект (или пуста), мы используем функцию ЗНАЧЕНИЕ(<ТипСправочника>.<ТипОбъекта>.ПустаяСсылка):


ВЫБРАТЬ
    Номенклатура,
    ВЫБОР КОГДА Номенклатура.Ссылка = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
        ТОГДА "Номенклатура не выбрана"
        ИНАЧЕ Номенклатура.Наименование
    КОНЕЦ КАК НаименованиеНоменклатуры
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары

Использование функции ЗНАЧЕНИЕ() позволяет получить конкретное системное значение пустой ссылки для указанного типа справочника или документа, что необходимо для корректного сравнения в запросе.

Дополнительные рекомендации

Использование алиасов (синонимов таблиц)

Как было отмечено в одном из сообщений форума, всегда полезно использовать алиасы (псевдонимы) для таблиц в запросах. Это делает запрос более читаемым, сокращает его длину и позволяет избежать неоднозначностей, особенно при работе со сложными соединениями или когда поля в разных таблицах имеют одинаковые имена.


ВЫБРАТЬ
    ОС.Ссылка,
    ВЫБОР КОГДА ОС.ЗаводскойНомер = "" ТОГДА "<Заводской номер не указан>" ИНАЧЕ ОС.ЗаводскойНомер КОНЕЦ КАК ЗаводскойНомер
ИЗ
    Справочник.ОсновныеСредства КАК ОС

Здесь ОС — это алиас для Справочник.ОсновныеСредства, и мы обращаемся к полю ЗаводскойНомер как ОС.ЗаводскойНомер.

Функция ПустаяСтрока()

Стоит упомянуть, что в языке 1С существует функция ПустаяСтрока(). Однако она используется во встроенном языке 1С, а не в языке запросов. Ее назначение — проверка, не содержит ли строка значащих символов, включая пробелы, что немного отличается от простого сравнения с "" (двумя кавычками).


// Пример использования ПустаяСтрока() во встроенном языке 1С
ПеременнаяСтрока = "  "; // Строка содержит пробелы
Если ПустаяСтрока(ПеременнаяСтрока) Тогда
    Сообщить("Строка пуста или содержит только пробелы"); // Это сообщение будет показано
Иначе
    Сообщить("Строка не пуста");
КонецЕсли;

ПеременнаяСтрока = "";
Если ПустаяСтрока(ПеременнаяСтрока) Тогда
    Сообщить("Строка пуста или содержит только пробелы"); // Это сообщение тоже будет показано
КонецЕсли;

В запросах для проверки на пустую строку всегда используем прямое сравнение с "".

Заключение

Мы подробно рассмотрели различные подходы к проверке полей на пустоту в запросах 1С. Выяснили, что для строковых полей и их проверки на пустую строку ("") эффективно использовать оператор ВЫБОР КОГДА. Для обработки NULL-значений, которые часто появляются в результате внешних соединений, более предпочтительной и лаконичной является функция ЕСТЬNULL().

Правильный выбор метода зависит от типа "пустого" значения, с которым мы имеем дело: NULL, Неопределено, "" или ПустаяСсылка. Понимание этих различий и умение применять соответствующие инструменты языка запросов 1С позволят вам создавать более надежные, гибкие и эффективные запросы.

← На главную