Синтаксис и применение NULL в платформе 1С:Предприятие. Описание и примеры кода.
Полное описание, параметры и ограничения
NULL
Значения данного типа используются исключительно для определения отсутствующего значения при работе с базой данных, например, при соединении таблиц.
Практические примеры
Литералы запроса: отличить дату, тип, NULL и Неопределено
В одной собственной строке запроса создаём значения разных типов, а затем проверяем фактические значения в BSL. ЕСТЬNULL даёт заранее выбранную замену, не стирая различие двух видов отсутствия.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.
Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.
В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.
Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.
HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.
Процедура ВыполнитьПример() Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ""Азбука"" КАК Товар,
| 3.50 КАК Число,
| ДАТАВРЕМЯ(2026, 10, 6, 12, 30, 0) КАК УчебнаяДата,
| ИСТИНА КАК Принята,
| ЛОЖЬ КАК Отменена,
| НЕОПРЕДЕЛЕНО КАК НетЗначения,
| NULL КАК НетСтроки,
| ТИП(Число) КАК ОжидаемыйТип,
| ЕСТЬNULL(NULL, 0) КАК ЗаменаNull";
Таблица = Запрос.Выполнить().Выгрузить();
Если Таблица.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна собственная строка литералов";
КонецЕсли;
СтрокаЛитералов = Таблица[0];
Сообщить(Таблица.Колонки.Количество() = 9);
Сообщить(СтрокаЛитералов.Товар = "Азбука");
Сообщить(ТипЗнч(СтрокаЛитералов.Число) = Тип("Число") И СтрокаЛитералов.Число = 3.50);
Сообщить(СтрокаЛитералов.УчебнаяДата = Дата(2026, 10, 6, 12, 30, 0));
Сообщить(СтрокаЛитералов.Принята И Не СтрокаЛитералов.Отменена);
Сообщить(ТипЗнч(СтрокаЛитералов.НетЗначения) = Тип("Неопределено"));
Сообщить(ТипЗнч(СтрокаЛитералов.НетСтроки) = Тип("Null"));
Сообщить(СтрокаЛитералов.ОжидаемыйТип = Тип("Число"));
Сообщить(СтрокаЛитералов.ЗаменаNull = 0);
КонецПроцедурыРазбор по шагам
Текст запроса — строка BSL. Поэтому кавычки строкового литерала Азбука внутри текста удвоены: в языке самого запроса остаются обычные двойные кавычки.
3.50 — число запроса, а не строка 3.50. ТипЗнч результата проверяется отдельно от его представления в сообщениях.
Дата в языке запросов задаётся ДАТАВРЕМЯ(год,месяц,день,час,минута,секунда). Это иной синтаксис, чем BSL-литерал в одинарных кавычках; сравнить с конструктором Дата на стороне BSL.
ИСТИНА и ЛОЖЬ дают булевы значения. ТИП(Число) даёт значение типа Тип, а не число 0 и не строку Число.
НЕОПРЕДЕЛЕНО — отдельное отсутствие значения. NULL используется для отсутствующих данных, например отсутствующей стороны соединения; здесь он явно задан для изучения, без настоящего соединения.
Не проверять значение NULL сравнением с числом. Проверить его тип и отдельно вызвать ЕСТЬNULL(NULL,0): результат замены — число 0, исходное поле НетСтроки всё ещё имеет тип Null.
Все девять полей относятся к одной строке; псевдонимы не повторяются. Перед чтением [0] проверить размер таблицы.
Как проверить результат
Девять проверок Истина. В отладчике сравните типы НетЗначения, НетСтроки и ЗаменаNull: Неопределено, Null и Число соответственно.
Замените первый аргумент ЕСТЬNULL на 7: результат будет 7, не запасной 0. Уберите последние три аргумента ДАТАВРЕМЯ: получится начало дня 06.10.2026, поэтому проверку времени 12:30 надо изменить.
Ожидаемый результат
Литералы, типовые значения и замена NULL изучены на полном выполнении собственного запроса, а не на недостающих таблицах конфигурации.
На что обратить внимание
У BSL и языка запросов разные записи даты и отдельные функции. Копирование ДАТАВРЕМЯ как обычного BSL-конструктора вне текста запроса неверно.
NULL, Неопределено, пустая строка и число 0 не являются одним универсальным пустым значением. Замена NULL должна быть осмысленным правилом конкретного отчёта.
ЕСТЬNULL не заменяет всякий ложный или незаполненный результат. Для числа/строки второй аргумент может преобразовываться к типу первого; произвольная замена неизвестного поля без проверки его типа опасна.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
NULL: отсутствие, известный ноль и замена — три разных задачи
Три константные строки дают 10, 0 и NULL. Сравниваем проверку отсутствия, обычные сравнения и ЕСТЬNULL, не превращая неизвестное количество в будто известный ноль.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.
Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.
В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.
Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.
HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.
У этого урока ровно три собственные константные строки, а не четыре продажи предыдущих уроков. NULL появляется из литерала языка запросов; колонка BSL не заполняется фиктивным пустым объектом.
Процедура ВыполнитьПример() Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Строки.Товар, Строки.Количество
|ИЗ
|(ВЫБРАТЬ ""Книга"" КАК Товар, 10 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 0
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""НетДанных"", NULL) КАК Строки
|ГДЕ Строки.Количество ЕСТЬ NULL";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 1);
Запрос.Текст = "ВЫБРАТЬ Строки.Товар, Строки.Количество
|ИЗ
|(ВЫБРАТЬ ""Книга"" КАК Товар, 10 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 0
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""НетДанных"", NULL) КАК Строки
|ГДЕ Строки.Количество ЕСТЬ НЕ NULL";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 2);
Запрос.Текст = "ВЫБРАТЬ Строки.Товар, Строки.Количество
|ИЗ
|(ВЫБРАТЬ ""Книга"" КАК Товар, 10 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 0
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""НетДанных"", NULL) КАК Строки
|ГДЕ Строки.Количество = NULL";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 0);
Запрос.Текст = "ВЫБРАТЬ Строки.Товар, Строки.Количество
|ИЗ
|(ВЫБРАТЬ ""Книга"" КАК Товар, 10 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 0
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""НетДанных"", NULL) КАК Строки
|ГДЕ Строки.Количество <> NULL";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 0);
Запрос.Текст = "ВЫБРАТЬ Строки.Товар, Строки.Количество
|ИЗ
|(ВЫБРАТЬ ""Книга"" КАК Товар, 10 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 0
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""НетДанных"", NULL) КАК Строки
|ГДЕ Строки.Количество ЕСТЬ НЕ NULL И Строки.Количество <> 0";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 1);
Запрос.Текст = "ВЫБРАТЬ Строки.Товар, Строки.Количество
|ИЗ
|(ВЫБРАТЬ ""Книга"" КАК Товар, 10 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 0
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""НетДанных"", NULL) КАК Строки
|ГДЕ ЕСТЬNULL(Строки.Количество, 0) = 0";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить(Результат.Количество() = 2);
Запрос.Текст = "ВЫБРАТЬ Строки.Товар,
| Строки.Количество ЕСТЬ NULL КАК Отсутствует,
| ЕСТЬNULL(Строки.Количество, -1) КАК КоличествоСЗаменой
|ИЗ
|(ВЫБРАТЬ ""Книга"" КАК Товар, 10 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Ручка"", 0
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""НетДанных"", NULL) КАК Строки
|";
Итог = Запрос.Выполнить().Выгрузить();
Если Итог.Количество() <> 3 Тогда
ВызватьИсключение "Ожидались три собственные строки";
КонецЕсли;
Отсутствующих = 0;
Нулевых = 0;
ИзвестныхНенулевых = 0;
Для Каждого СтрокаИтога Из Итог Цикл
Если СтрокаИтога.Отсутствует Тогда
Отсутствующих = Отсутствующих + 1;
Сообщить(СтрокаИтога.Товар = "НетДанных" И СтрокаИтога.КоличествоСЗаменой = -1);
ИначеЕсли СтрокаИтога.КоличествоСЗаменой = 0 Тогда
Нулевых = Нулевых + 1;
Сообщить(СтрокаИтога.Товар = "Ручка");
Иначе
ИзвестныхНенулевых = ИзвестныхНенулевых + 1;
Сообщить(СтрокаИтога.Товар = "Книга" И СтрокаИтога.КоличествоСЗаменой = 10);
КонецЕсли;
КонецЦикла;
Сообщить(Отсутствующих = 1 И Нулевых = 1 И ИзвестныхНенулевых = 1);
КонецПроцедурыРазбор по шагам
Вложенный собственный источник создаёт Книга/10, Ручка/0 и НетДанных/NULL. Конфигурационные таблицы и менеджер временных таблиц не нужны.
ЕСТЬ NULL выбирает одну отсутствующую величину; ЕСТЬ НЕ NULL выбирает две известные. Оператор возвращает логический результат проверки отсутствия.
Обычные = NULL и <> NULL не выполняют проверку отсутствия. Согласно правилам справки сравнения с участием NULL не дают положительного условия отбора; оба запроса возвращают ноль строк.
ЕСТЬ НЕ NULL И Количество<>0 выбирает только известное ненулевое количество 10. Не делаем неизвестную строку положительной без проверки.
ЕСТЬNULL(Количество,0)=0 выбирает две строки: реальный ноль и заменённое отсутствие. Для бизнес-смысла они не становятся одним фактом.
В последней проекции отдельно сохраняем признак Отсутствует, а отсутствующее количество заменяем диагностическим -1. Ноль остаётся нулём; -1 здесь только учебная метка, не заказ или остаток.
Перебор трёх строк не зависит от порядка результата. Каждую категорию считаем и проверяем её собственное имя и значение.
Как проверить результат
Шесть проверок количества Истина: 1, 2, 0, 0, 1, 2. Затем три проверки строк и итог категорий также Истина.
В итоговой проекции: Книга — Отсутствует=Ложь и 10; Ручка — Ложь и 0; НетДанных — Истина и -1.
Не называйте НетДанных нулевым запасом или заказом. Замена позволяет вывести значение, но не доказывает исходное наличие данных.
Ожидаемый результат
Проверка отсутствия отделена от сравнения, замены и действительного нуля на полностью собственном источнике.
На что обратить внимание
ЕСТЬ NULL — оператор, ЕСТЬNULL(...) — функция замены. Похожие слова решают разные задачи.
NULL не равен Неопределено BSL и не пустой ссылке объекта конфигурации. Этот урок не смешивает их в один случай.
Не выводите поведение сложного НЕ над сравнением NULL из аналогии с другой СУБД. Здесь проверяются только явные указанные отборы.
Диагностическая замена -1 и нулевой отбор не являются рекомендацией скрывать отсутствие цены, количества или прав доступа. В 1С пример не запускался.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.