Использование функции естьnull(). Использование функции естьnull() Проверка значения на null 1с

NULL - отсутствующие значения.
Не путать с нулевым значением! NULL - это не число, не равно пробелу, пустой ссылке, Неопределено.

NULL - типообразующее значение, т.е. есть тип NULL и единственное значение этого типа.

NULL значения появляются в запросе в следующих ситуациях:
а) Внешнее соединение, при котором не было найдено соответствующей записи в другой таблице (при левом - во второй, при правом - в первой, при полном - в обоих)
б) Обращение к реквизитам элементов для группы и наоборот.
в) NULL в списке полей выборки (ВЫБРАТЬ)
г) Обращение к реквизитам для битой ссылки

ЕСТЬ NULL используется в операторе ВЫБРАТЬ (как бы проверя, что значение это есть пустое (Значение ЕСТЬ NULL)):
Код 1C v 8.х
ВЫБОР
КОГДА Значение ЕСТЬ NULL ТОГДА РезультатЕслиNULL
ИНАЧЕ Значение
КОНЕЦ

еще пример:
Код 1C v 8.х ВЫБРАТЬ
ВЫБОР КОГДА УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL ТОГДА 0
ИНАЧЕ УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ

ГДЕ

Функция ЕСТЬNULL (значение, РезультатЕслиNULL) возвращает значение своего первого параметра, в случае если он не равен NULL, и значение второго параметра в противном случае
Является свернутым ВЫБОР…КОНЕЦ, но ЕСТЬNULL предпочтительнее.
Код 1C v 8.х
ВЫБРАТЬ
ЕСТЬNULL(Справочник.Номенклатура.Артикул, "---") КАК Артикул,
Справочник.Номенклатура.Представление КАК Номенклатура

еще пример:
Код 1C v 8.х
ВЫБРАТЬ
СправочникНоменклатуры.Наименование,
ЕСТЬNULL(УчетНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = СправочникНоменклатуры.Ссылка
ГДЕ
СправочникНоменклатуры.ЭтоГруппа = ЛОЖЬ
В данном примере получаются все элементы справочника номенклатуры, после чего, для каждой номенклатуры из регистра накопления получаются текущие остатки. Т.к. для номенклатуры, по которой отсутствуют остатки, виртуальная таблица остатков не запись вернет, то в результате соединения в поле "УчетНоменклатурыОстатки.КоличествоОстаток" будут значения NULL для номенклатуры, по которой не было остатков. Для того чтобы вместо значения NULL в результате запроса присутствовало значение 0, мы использовали функцию ЕСТЬNULL(), которая осуществит желаемую замену.

ЕСТЬNULL отличается от ВЫБОР по следующим причинам:
а) При ЕСТЬNULL лучше читается запрос (проще)
б) При ЕСТЬNULL, если проверяется сложное выражение, то работает быстрее, поскольку вычисляется один раз
в) При ЕСТЬNULL выражение замены приводится к типу проверяемого выражения, если оно имеет тип Строка (длина) или Число (разрядность).

Нельзя проверять значения на NULL обычным равенством, потому что в SQL действует трехзначная логика - Истина, Ложь, NULL, и результатом такого сравнения будет UNKNOWN, что в 1С 8.0 аналогично ЛОЖЬ.
NULL <> 0, поэтому при левых внешних соединениях спр. Номенклатура с таблицами остатков, цен, Контрагентов со взаиморасчетами при отсутствии таких записей там будет NULL, который не равен 0. Лучшее решение - ЕСТЬNULL

NULL – отсутствующие значения.
Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено.

NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа.

NULL значения появляются в запросе в следующих ситуациях:
а) Внешнее соединение, при котором не было найдено соответствующей записи в другой таблице (при левом – во второй, при правом – в первой, при полном – в обоих)
б) Обращение к реквизитам элементов для группы и наоборот.
в) NULL в списке полей выборки (ВЫБРАТЬ)
г) Обращение к реквизитам для битой ссылки

ЕСТЬ NULL используется в операторе ВЫБРАТЬ (как бы проверя, что значение это есть пустое (Значение ЕСТЬ NULL)):
Код 1C v 8.х
ВЫБОР
КОГДА Значение ЕСТЬ NULL ТОГДА РезультатЕслиNULL
ИНАЧЕ Значение
КОНЕЦ

еще пример:
Код 1C v 8.х ВЫБРАТЬ

ВЫБОР КОГДА УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL ТОГДА 0
ИНАЧЕ УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ



ГДЕ

Функция ЕСТЬNULL (значение, РезультатЕслиNULL) возвращает значение своего первого параметра, в случае если он не равен NULL, и значение второго параметра в противном случае
Является свернутым ВЫБОР…КОНЕЦ, но ЕСТЬNULL предпочтительнее.
Код 1C v 8.х
ВЫБРАТЬ
ЕСТЬNULL(Справочник.Номенклатура.Артикул, "---") КАК Артикул,
Справочник.Номенклатура.Представление КАК Номенклатура

еще пример:
Код 1C v 8.х
ВЫБРАТЬ
СправочникНоменклатуры.Наименование,
ЕСТЬNULL(УчетНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = СправочникНоменклатуры.Ссылка
ГДЕ
СправочникНоменклатуры.ЭтоГруппа = ЛОЖЬ
В данном примере получаются все элементы справочника номенклатуры, после чего, для каждой номенклатуры из регистра накопления получаются текущие остатки. Т.к. для номенклатуры, по которой отсутствуют остатки, виртуальная таблица остатков не запись вернет, то в результате соединения в поле "УчетНоменклатурыОстатки.КоличествоОстаток" будут значения NULL для номенклатуры, по которой не было остатков. Для того чтобы вместо значения NULL в результате запроса присутствовало значение 0, мы использовали функцию ЕСТЬNULL(), которая осуществит желаемую замену.

ЕСТЬNULL отличается от ВЫБОР по следующим причинам:
а) При ЕСТЬNULL лучше читается запрос (проще)
б) При ЕСТЬNULL, если проверяется сложное выражение, то работает быстрее, поскольку вычисляется один раз
в) При ЕСТЬNULL выражение замены приводится к типу проверяемого выражения, если оно имеет тип Строка (длина) или Число (разрядность).

Нельзя проверять значения на NULL обычным равенством, потому что в SQL действует трехзначная логика – Истина, Ложь, NULL, и результатом такого сравнения будет UNKNOWN, что в 1С 8.0 аналогично ЛОЖЬ.
NULL <> 0, поэтому при левых внешних соединениях спр. Номенклатура с таблицами остатков, цен, Контрагентов со взаиморасчетами при отсутствии таких записей там будет NULL, который не равен 0. Лучшее решение – ЕСТЬNULL

Функция ЕСТЬNULL(английский синоним ISNULL) используется для подмены нулевого(отсутствующего) значения при соединениях таблиц. Таблицы могут быть произвольными (как совпадающими по полям).

Null — это не число 0, а именно отсутствующее значение.

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

Быстрый переход

Результат ее выполнения:

  • Значение определенного типа, если оно существует.
  • Указанное вторым параметром значение (любого типа).

Синтаксис ISNULL

ЕстьNULL(<ПроверяемоеПоле>,<ЗначениеЗамены>)

Аналогом этой функции может быть конструкция:
ВЫБОР
КОГДА Таблица.Поле1 ЕСТЬ NULL ТОГДА "Некое значение"
ИНАЧЕ
Таблица.Поле1
КОНЕЦ

Как на практике используется ЕстьNULL

1. Подмена значения константой
ЕСТЬNULL(Таблица1.Поле1,"Некое значение")

ЕСТЬNULL(Таблица1.Количество, 0)

2. Подмена значения параметром

ЕСТЬNULL(Таблица1.Поле1,&Параметр)

3. Подмена значением из другой таблицы

ЕСТЬNULL (Таблица1.Поле1,Таблица2.Поле1)

4.Использование функции для получения предопределенного или пустого значения

ЕСТЬNULL(Таблица2.Поле1,ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))

Средства определения пустых ссылок, дат или строк. Рассмотрим, как проверить на пустую ссылку, дату или строку в запросе 1С.

Определить нулевые данные можно путем использования специальных операторов.

Информацию из базы данных 1С запрашивают (а потом получают) с помощью такого инструмента, как язык запросов (Query, англ.). Они составляются на латинице и кириллице. А одним из ключевых слов-команд (операторов) при получении информации является слово-команда ВЫБРАТЬ (SELECT, англ.) в сочетании с некоторыми конструкциями. Приведём примеры построения интересующих нас по теме запрашиваемых заданий:

Проверка на содержание NULL

Такое задание выполняется оператором ВЫБРАТЬ в сочетании с конструкцией «ЕСТЬ NULL»:

SELECT
ЗаказыОстатки.Заказчик,
ЗаказыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.Заказы.Остатки КАК ЗаказыОстатки
ГДЕ
ЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL

Контроль даты

Пустая дата в запросе 1С вносится построением «ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)»:

SELECT
СчетВходящийПоставщика.Link,
СчетВходящийПоставщика.ДатаПрихода
ИЗ
Документ. СчетВходящийПоставщика КАК СчетВходящийПоставщика
ГДЕ
СчетВходящийПоставщика.ДатаПрихода = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Ссылочная проверка

Проверка несуществующих внутриссылочных значений (на планы счетов, справочники и пр.) производится с использованием конструкции «VALUE(Справочник.Имя…ПустаяСсылка)»:

Проверка строки

Пустота в строках обнаруживается с применением пробела в кавычках «»:

SELECT
Покупатели.Link
ИЗ
Справочник.Покупатели КАК Покупатели
ГДЕ
Покупатели.Код = «»

Ещё о битых и обычных линках

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

Платформы 1С не обладают внутренними средствами чтобы их отсечь. Ещё нужно понимать, что вне «битых» в системе живут специальные «пустые линки», которые следует различать одни от других.
Это можно выяснить и без запросов к базе данных:

В системе 1С-7.7

Для «битой» - методом Link.Selected() и функцией ПустоеЗначение() возвращается ноль. Для «пустой» - в первом случае ноль, а во втором - единица. Для «нормальной» - единица и ноль. Получается, в 1С-7.7 «битая» - не является несуществующим значением, которое не считается выбранным.

В системе 1С-8.x

Всё по-другому - в обоих случаях (для «битых» и «обычных») метод возвращает Ложь, а функция - Истину. Решение такое: Для «битой» методом Ссылка.ПолучитьОбъект() возвращается функция «Неопределено». Для «пустой» - выбрасывается «Ошибка метода контекста». Для «нормальной» - возвращается значение согласно документации; Выходит, в 1С-8.х «битая» - не будет несуществующей функцией ссылочного типа, которая возвращает Неопределённое значение объекта.

Откуда они берутся

При переходе по несуществующему адресу битой линки пользователю в лучшем случае показано уведомление о том, что объект не найден, в худшем - изображение страницы сервера. Наихудшей их чертой является скрытость. Отсюда - сложность в проверке их корректности. Во время работы с конфигурацией она постоянно дорабатывается, обновляется. Какие-то объекты подлежат удалению, изменяется структура. А ссылка на удалённый элемент остаётся в конструкциях и алгоритмах. Таким образом, несуществующие адреса остаются в системе после удаления самого элемента (вместе с адресом).

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

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

Функция ЕСТЬNULL

В языке запросов реализована функция ЕСТЬNULL(), предназначение которой - заменять выражение на другое выражение в случае, если выражения имело значение NULL. Синтаксическая диаграмма данной функции выглядит так:

ЕСТЬNULL(<Проверяемое выражение>, <Выражение замены>)

Данная функция вернет значение первого параметра, в случае, если оно не является NULL, и значение второго выражения, в противном случае.


ВЫБРАТЬ
ЕСТЬNULL(УчетНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
ИЗ

ГДЕ

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

Использование операции ВЫБОР

Для решения описанной ранее задачи можно воспользоваться операцией языка запросов ВЫБОР. Пример, как будет выглядеть запрос, аналогичный предыдущему, будет выглядеть так:


ВЫБРАТЬ
СправочникНоменклатуры.Наименование,
ВЫБОР КОГДА УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL ТОГДА 0
ИНАЧЕ УчетНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = СправочникНоменклатуры.Ссылка
ГДЕ
СправочникНоменклатуры.ЭтоГруппа = ЛОЖЬ

Результат данного запроса будет идентичен результату запроса, приведенного в предыдущем разделе.

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

Особенности функции ЕСТЬNULL

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

Так, например, в случае когда проверяемое выражение имеет тип Строка(5), а выражение замены тип Строка(10), тип результата будет преобразован к типу Строка(5). В результате, когда функция будет возвращать выражение замены, значение будет обрезано до пяти символов.

С числовыми выражениями ситуация аналогична: значение заменяемого выражения будет преобразовано к типу проверяемого, т.е. заменяемое выражение может быть обрезано. В случае если значение не может быть преобразовано, язык запросов закончит выполнение запроса с ошибкой. Например, с ошибкой закончится попытка преобразования числа 1000 в тип Число(2).

Текстовые