Три константные строки дают 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С пример не запускался.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.