NULL

Язык запросов

Синтаксис и применение NULL в платформе 1С:Предприятие. Описание и примеры кода.

Полное описание, параметры и ограничения

NULL

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

Практические примеры

Литералы запроса: отличить дату, тип, NULL и Неопределено

В одной собственной строке запроса создаём значения разных типов, а затем проверяем фактические значения в BSL. ЕСТЬNULL даёт заранее выбранную замену, не стирая различие двух видов отсутствия.

Где и как запускать

Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. 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);
КонецПроцедуры

Разбор по шагам

  1. Текст запроса — строка BSL. Поэтому кавычки строкового литерала Азбука внутри текста удвоены: в языке самого запроса остаются обычные двойные кавычки.

  2. 3.50 — число запроса, а не строка 3.50. ТипЗнч результата проверяется отдельно от его представления в сообщениях.

  3. Дата в языке запросов задаётся ДАТАВРЕМЯ(год,месяц,день,час,минута,секунда). Это иной синтаксис, чем BSL-литерал в одинарных кавычках; сравнить с конструктором Дата на стороне BSL.

  4. ИСТИНА и ЛОЖЬ дают булевы значения. ТИП(Число) даёт значение типа Тип, а не число 0 и не строку Число.

  5. НЕОПРЕДЕЛЕНО — отдельное отсутствие значения. NULL используется для отсутствующих данных, например отсутствующей стороны соединения; здесь он явно задан для изучения, без настоящего соединения.

  6. Не проверять значение NULL сравнением с числом. Проверить его тип и отдельно вызвать ЕСТЬNULL(NULL,0): результат замены — число 0, исходное поле НетСтроки всё ещё имеет тип Null.

  7. Все девять полей относятся к одной строке; псевдонимы не повторяются. Перед чтением [0] проверить размер таблицы.

Как проверить результат

  1. Девять проверок Истина. В отладчике сравните типы НетЗначения, НетСтроки и ЗаменаNull: Неопределено, Null и Число соответственно.

  2. Замените первый аргумент ЕСТЬNULL на 7: результат будет 7, не запасной 0. Уберите последние три аргумента ДАТАВРЕМЯ: получится начало дня 06.10.2026, поэтому проверку времени 12:30 надо изменить.

Ожидаемый результат

Литералы, типовые значения и замена NULL изучены на полном выполнении собственного запроса, а не на недостающих таблицах конфигурации.

На что обратить внимание

  1. У BSL и языка запросов разные записи даты и отдельные функции. Копирование ДАТАВРЕМЯ как обычного BSL-конструктора вне текста запроса неверно.

  2. NULL, Неопределено, пустая строка и число 0 не являются одним универсальным пустым значением. Замена NULL должна быть осмысленным правилом конкретного отчёта.

  3. ЕСТЬNULL не заменяет всякий ложный или незаполненный результат. Для числа/строки второй аргумент может преобразовываться к типу первого; произвольная замена неизвестного поля без проверки его типа опасна.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

NULL: отсутствие, известный ноль и замена — три разных задачи

Три константные строки дают 10, 0 и NULL. Сравниваем проверку отсутствия, обычные сравнения и ЕСТЬNULL, не превращая неизвестное количество в будто известный ноль.

Где и как запускать

Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

  6. У этого урока ровно три собственные константные строки, а не четыре продажи предыдущих уроков. 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);

КонецПроцедуры

Разбор по шагам

  1. Вложенный собственный источник создаёт Книга/10, Ручка/0 и НетДанных/NULL. Конфигурационные таблицы и менеджер временных таблиц не нужны.

  2. ЕСТЬ NULL выбирает одну отсутствующую величину; ЕСТЬ НЕ NULL выбирает две известные. Оператор возвращает логический результат проверки отсутствия.

  3. Обычные = NULL и <> NULL не выполняют проверку отсутствия. Согласно правилам справки сравнения с участием NULL не дают положительного условия отбора; оба запроса возвращают ноль строк.

  4. ЕСТЬ НЕ NULL И Количество<>0 выбирает только известное ненулевое количество 10. Не делаем неизвестную строку положительной без проверки.

  5. ЕСТЬNULL(Количество,0)=0 выбирает две строки: реальный ноль и заменённое отсутствие. Для бизнес-смысла они не становятся одним фактом.

  6. В последней проекции отдельно сохраняем признак Отсутствует, а отсутствующее количество заменяем диагностическим -1. Ноль остаётся нулём; -1 здесь только учебная метка, не заказ или остаток.

  7. Перебор трёх строк не зависит от порядка результата. Каждую категорию считаем и проверяем её собственное имя и значение.

Как проверить результат

  1. Шесть проверок количества Истина: 1, 2, 0, 0, 1, 2. Затем три проверки строк и итог категорий также Истина.

  2. В итоговой проекции: Книга — Отсутствует=Ложь и 10; Ручка — Ложь и 0; НетДанных — Истина и -1.

  3. Не называйте НетДанных нулевым запасом или заказом. Замена позволяет вывести значение, но не доказывает исходное наличие данных.

Ожидаемый результат

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

На что обратить внимание

  1. ЕСТЬ NULL — оператор, ЕСТЬNULL(...) — функция замены. Похожие слова решают разные задачи.

  2. NULL не равен Неопределено BSL и не пустой ссылке объекта конфигурации. Этот урок не смешивает их в один случай.

  3. Не выводите поведение сложного НЕ над сравнением NULL из аналогии с другой СУБД. Здесь проверяются только явные указанные отборы.

  4. Диагностическая замена -1 и нулевой отбор не являются рекомендацией скрывать отсутствие цены, количества или прав доступа. В 1С пример не запускался.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.