В процессе разработки отчетов на СКД в 1с предприятие часто возникает задача вывода нулей в пустые поля отчета. Дело в том, что, при отсутствии необходимых данных в базе, запрос возвращает не число 0, а специальное значение NULL, которое затем необходимо преобразовать в число. Например, если мы напишем
и регистр сведений окажется пустой, то в результате запроса в поле "Цена" будут значения NULL. И если нам по условиям задачи нужно в отчете вывести нули, то необходимо составить запрос следующим образом:
Но представим, что мы используем соединение 2 наборов данных в СКД, и результат одного из них оказывается пустым. В этом случае нам не поможет конструкция ЕСТЬNULL в тексте запроса этого набора, т.к. он вернет пустую выборку. Там не будет значений NULL, которые можно было бы преобразовать в 0, там вообще ничего не будет. NULL появляется только после соединения наборов данных, а за это отвечает система компоновки. Оставшийся выход - воспользоваться вычисляемыми полями. В нашем примере нам придется создать вычисляемое поле "Цена" и прописать в его выражение ЕСТЬNULL(Цена,0). К моменту срабатывания выражений вычисляемых полей уже произойдет соединение запросов, так что у нас уже будет поле "Цена", и оно будет содержать NULL. Создавая вычисляемое поле с таким же именем, мы по сути переопределяем поле, которое вернули нам наборы данных.
27.06.2017
NULL – это не что иное, как отсутствие значения. Многие путают его со значением «0» типа число, пустой ссылкой на какой-либо объект или же с пустой строкой. Из-за этого заблуждения возникает много ошибок.
Значение NULL будет появляться в том случае, если в запросе будет обращение к несуществующему полю, свойству или к битой ссылке.
Основан на SQL, который не позволяет проверять на значение NULL обычным равенством. Ниже описаны два способа проверки на NULL в 1С 8.3.
Функция языка запросов 1С 8.3 ЕСТЬNULL() имеет два входных параметра:
Если проверяемое значение будет NULL, то эта функция вернет значение выражения замены. Если же значение будет отлично от NULL, то вернется само проверяемое выражение.
Ниже рассмотрен пример. В нем выбираются все номенклатурные позиции табличной части товара из документа «Поступление товаров и услуг». При помощи левого соединения каждой номенклатуре проставляется последняя цена из регистра сведений «Цены номенклатуры».
В данном случае может возникнуть такая ситуация, что для какой-либо позиции может просто не быть цены в регистре. В таком случае функция ЕСТЬNULL вернет нам привычный ноль. Если ей не воспользоваться, то при попытке произвести арифметические операции над полем «Цена» со значением NULL мы получим ошибку.
ВЫБРАТЬ
ЕСТЬNULL(Цены.Цена, 0) КАК АктуальнаяЦена
ИЗ
ГДЕ
Аналогом функции ЕСТЬNULL() является «ЕСТЬ NULL», которая используется в операторе ВЫБОР и проверяет, является ли значение NULL. «ЕСТЬ» в данном случае подразумевает равенство и запрос предыдущего примера будет выглядеть следующим образом:
ВЫБРАТЬ
Товары.Номенклатура КАК Товар,
ВЫБОР
КОГДА Цены.Цена ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Цены.Цена
КОНЕЦ КАК АктуальнаяЦена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ПО Товары.Номенклатура = Цены.Номенклатура
ГДЕ
Товары.Ссылка = &СсылкаНаДокумент
Как вы могли увидеть из предыдущих примеров, в обоих случаях запрос возвращает одни и те же данные. Функция ЕСТЬNULL() является сокращенным вариантом ВЫБОР КОГДА … ЕСТЬ NULL … КОНЕЦ, но она все же будет предпочтительнее по следующим причинам:
При работе с языком запросов иногда возникает ситуация, когда требуется заменить значение 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).
Функция ЕСТЬNULL(английский синоним ISNULL) используется для подмены нулевого(отсутствующего) значения при соединениях таблиц. Таблицы могут быть произвольными (как совпадающими по полям).
Null — это не число 0, а именно отсутствующее значение.
Наиболее частое использование данной функции для подмены параметры функции Сумма() на 0, передача пустого значения может не вызывать ошибки исполнения, но приводить к некорректному результату, особенно при использовании в запросах СКД.
Быстрый переход
ЕстьNULL(<ПроверяемоеПоле>,<ЗначениеЗамены>)
Аналогом этой функции может быть конструкция:
ВЫБОР
КОГДА Таблица.Поле1 ЕСТЬ NULL ТОГДА "Некое значение"
ИНАЧЕ
Таблица.Поле1
КОНЕЦ
1. Подмена значения константой
ЕСТЬNULL(Таблица1.Поле1,"Некое значение")
ЕСТЬNULL(Таблица1.Количество, 0)
2. Подмена значения параметром
ЕСТЬNULL(Таблица1.Поле1,&Параметр)
3. Подмена значением из другой таблицы
ЕСТЬNULL (Таблица1.Поле1,Таблица2.Поле1)
4.Использование функции для получения предопределенного или пустого значения
ЕСТЬNULL(Таблица2.Поле1,ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))