Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL())
NULL – отсутствующие значения.
Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено.
NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа.
NULL значения появляются в запросе в следующих ситуациях:
а) Внешнее соединение, при котором не было найдено соответствующей записи в другой таблице (при левом – во второй, при правом – в первой, при полном – в обоих)
б) Обращение к реквизитам элементов для группы и наоборот.
в) NULL в списке полей выборки (ВЫБРАТЬ)
г) Обращение к реквизитам для битой ссылки
ЕСТЬ NULL используется в операторе ВЫБРАТЬ (как бы проверя, что значение это есть пустое ( Значение ЕСТЬ NULL )):
Код 1C v 8.х
еще пример:
Код 1C v 8.х
Функция ЕСТЬNULL (значение, РезультатЕслиNULL) возвращает значение своего первого параметра, в случае если он не равен NULL, и значение второго параметра в противном случае
Является свернутым ВЫБОР…КОНЕЦ, но ЕСТЬNULL предпочтительнее.
Код 1C v 8.х
еще пример:
Код 1C v 8.х
В данном примере получаются все элементы справочника номенклатуры, после чего, для каждой номенклатуры из регистра накопления получаются текущие остатки. Т.к. для номенклатуры, по которой отсутствуют остатки, виртуальная таблица остатков не запись вернет, то в результате соединения в поле "УчетНоменклатурыОстатки.КоличествоОстаток" будут значения NULL для номенклатуры, по которой не было остатков. Для того чтобы вместо значения NULL в результате запроса присутствовало значение 0, мы использовали функцию ЕСТЬNULL(), которая осуществит желаемую замену.
ЕСТЬNULL отличается от ВЫБОР по следующим причинам:
а) При ЕСТЬNULL лучше читается запрос (проще)
б) При ЕСТЬNULL, если проверяется сложное выражение, то работает быстрее, поскольку вычисляется один раз
в) При ЕСТЬNULL выражение замены приводится к типу проверяемого выражения, если оно имеет тип Строка (длина) или Число (разрядность).
Нельзя проверять значения на NULL обычным равенством, потому что в SQL действует трехзначная логика – Истина, Ложь, NULL, и результатом такого сравнения будет UNKNOWN, что в 1С 8.0 аналогично ЛОЖЬ.
NULL <> 0, поэтому при левых внешних соединениях спр. Номенклатура с таблицами остатков, цен, Контрагентов со взаиморасчетами при отсутствии таких записей там будет NULL, который не равен 0. Лучшее решение – ЕСТЬNULL
ЕСТЬNULL в запросе 1С 8.3 (8.2)
NULL – это не что иное, как отсутствие значения. Многие путают его со значением «0» типа число, пустой ссылкой на какой-либо объект или же с пустой строкой. Из-за этого заблуждения возникает много ошибок.
Значение NULL будет появляться в том случае, если в запросе будет обращение к несуществующему полю, свойству или к битой ссылке.
Язык запросов в 1С основан на SQL, который не позволяет проверять на значение NULL обычным равенством. Ниже описаны два способа проверки на NULL в 1С 8.3.
Функция ЕСТЬNULL()
Функция языка запросов 1С 8.3 ЕСТЬNULL() имеет два входных параметра:
- проверяемое выражение;
- выражение замены.
Если проверяемое значение будет NULL, то эта функция вернет значение выражения замены. Если же значение будет отлично от NULL, то вернется само проверяемое выражение.
Ниже рассмотрен пример. В нем выбираются все номенклатурные позиции табличной части товара из документа «Поступление товаров и услуг». При помощи левого соединения каждой номенклатуре проставляется последняя цена из регистра сведений «Цены номенклатуры».
В данном случае может возникнуть такая ситуация, что для какой-либо позиции может просто не быть цены в регистре. В таком случае функция ЕСТЬNULL вернет нам привычный ноль. Если ей не воспользоваться, то при попытке произвести арифметические операции над полем «Цена» со значением NULL мы получим ошибку.
ВЫБРАТЬ
Товары.Номенклатура КАК Товар,
ЕСТЬNULL(Цены.Цена, 0) КАК АктуальнаяЦена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ПО Товары.Номенклатура = Цены.Номенклатура
ГДЕ
Товары.Ссылка = &СсылкаНаДокумент
ЕСТЬ NULL в операторе ВЫБОР
Аналогом функции ЕСТЬNULL() является «ЕСТЬ NULL», которая используется в операторе ВЫБОР и проверяет, является ли значение NULL. «ЕСТЬ» в данном случае подразумевает равенство и запрос предыдущего примера будет выглядеть следующим образом:
ВЫБРАТЬ
Товары.Номенклатура КАК Товар,
ВЫБОР
КОГДА Цены.Цена ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Цены.Цена
КОНЕЦ КАК АктуальнаяЦена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ПО Товары.Номенклатура = Цены.Номенклатура
ГДЕ
Товары.Ссылка = &СсылкаНаДокумент
Отличия функции ЕСТЬNULL() от ЕСТЬ NULL
Как вы могли увидеть из предыдущих примеров, в обоих случаях запрос возвращает одни и те же данные. Функция ЕСТЬNULL() является сокращенным вариантом ВЫБОР КОГДА … ЕСТЬ NULL … КОНЕЦ, но она все же будет предпочтительнее по следующим причинам:
Условие в запросе по пустому значению ЕСТЬ NULL
вот полный текст запроса, который возвращает строки с незаполненым «Значением»
ВЫБРАТЬ
БИО_ПравилаПроверкиХозОперацийСрезПоследних.ХозОперация КАК ХозОперация,
БИО_ПравилаПроверкиХозОперацийСрезПоследних.ПравилоПроверки,
БИО_ПравилаПроверкиХозОперацийСрезПоследних.ПриЗаписи,
БИО_ПравилаПроверкиХозОперацийСрезПоследних.ПриПроведении,
БИО_ПравилаПроверкиХозОперацийСрезПоследних.Режим,
ПравилаПроверкиРеквизитов.ЗависимыйРеквизит КАК ЗависимыйРеквизит,
ПравилаПроверкиРеквизитов.ВидСравнения КАК ВидСравнения,
ПравилаПроверкиРеквизитов.ТабличнаяЧасть КАК ТабличнаяЧасть,
ВЫБОР
КОГДА (ПравилаПроверкиРеквизитов.ЗначениеПроверки <> Неопределено)
И (ПравилаПроверкиРеквизитов.ЗначениеПроверки ЕСТЬ НЕ NULL)
ТОГДА ПравилаПроверкиРеквизитов.ЗначениеПроверки
ИНАЧЕ «Пустое значение»
КОНЕЦ КАК Значение
ИЗ
РегистрСведений.БИО_ПравилаПроверкиХозОпераций.СрезПоследних(&Период, ) КАК БИО_ПравилаПроверкиХозОперацийСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
БИО_ПравилаПроверкиОбязательныеЗначения.ЗависимыйРеквизит КАК ЗависимыйРеквизит,
БИО_ПравилаПроверкиОбязательныеЗначения.ВидСравнения КАК ВидСравнения,
БИО_ПравилаПроверкиОбязательныеЗначения.Ссылка КАК ПравилоПроверки,
«Шапка» КАК ТабличнаяЧасть,
ЗначенияОбязательныхЗначений.Значение КАК ЗначениеПроверки
ИЗ
Справочник.БИО_ПравилаПроверки.ОбязательныеЗначения КАК БИО_ПравилаПроверкиОбязательныеЗначения
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
БИО_ПравилаПроверкиЗначенияОбязательныхЗначений.КлючСвязи КАК КлючСвязи,
БИО_ПравилаПроверкиЗначенияОбязательныхЗначений.Значение КАК Значение,
БИО_ПравилаПроверкиЗначенияОбязательныхЗначений.Ссылка КАК ПравилаПроверки
ИЗ
Справочник.БИО_ПравилаПроверки.ЗначенияОбязательныхЗначений КАК БИО_ПравилаПроверкиЗначенияОбязательныхЗначений) КАК ЗначенияОбязательныхЗначений
ПО БИО_ПравилаПроверкиОбязательныеЗначения.КлючСвязи = ЗначенияОбязательныхЗначений.КлючСвязи
И БИО_ПравилаПроверкиОбязательныеЗначения.Ссылка = ЗначенияОбязательныхЗначений.ПравилаПроверки
ГДЕ
БИО_ПравилаПроверкиОбязательныеЗначения.Использовать = ИСТИНА
ВЫБРАТЬ
БИО_ПравилаПроверкиТабличныеЧасти.ЗависимыйРеквизит,
БИО_ПравилаПроверкиТабличныеЧасти.ВидСравнения,
БИО_ПравилаПроверкиТабличныеЧасти.Ссылка,
БИО_ПравилаПроверкиТабличныеЧасти.ТабличнаяЧасть,
ЗначенияТабличныхЧастей.Значение
ИЗ
Справочник.БИО_ПравилаПроверки.ТабличныеЧасти КАК БИО_ПравилаПроверкиТабличныеЧасти
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
БИО_ПравилаПроверкиЗначенияТабличныхЧастей.КлючСвязи КАК КлючСвязи,
БИО_ПравилаПроверкиЗначенияТабличныхЧастей.Значение КАК Значение,
БИО_ПравилаПроверкиЗначенияТабличныхЧастей.Ссылка КАК ПравилоПроверки
ИЗ
Справочник.БИО_ПравилаПроверки.ЗначенияТабличныхЧастей КАК БИО_ПравилаПроверкиЗначенияТабличныхЧастей) КАК ЗначенияТабличныхЧастей
ПО БИО_ПравилаПроверкиТабличныеЧасти.КлючСвязи = ЗначенияТабличныхЧастей.КлючСвязи
И БИО_ПравилаПроверкиТабличныеЧасти.Ссылка = ЗначенияТабличныхЧастей.ПравилоПроверки
ГДЕ
БИО_ПравилаПроверкиТабличныеЧасти.Использовать = ИСТИНА) КАК ПравилаПроверкиРеквизитов
ПО БИО_ПравилаПроверкиХозОперацийСрезПоследних.ПравилоПроверки = ПравилаПроверкиРеквизитов.ПравилоПроверки
ГДЕ
БИО_ПравилаПроверкиХозОперацийСрезПоследних.Объект = &Объект
УПОРЯДОЧИТЬ ПО
ХозОперация,
ТабличнаяЧасть,
ЗависимыйРеквизит,
ВидСравнения
Запросы 1С:Предприятие 8. Прочие функции
В языке запросов 1С существует большое количество различных функций и операторов, облегчающих построение запроса. Часть из них мы рассмотрели в статьях Функции работы с датами, Группировки в запросах 1С, остальные рассмотрим сейчас.
Функции работы со строками в запросах 1С
Функций и операторов для работы со строковыми данными в запросах 1С немного.
Во-первых, строки в запросах можно складывать. Для этого используется оператор «+»:
Во-вторых, можно выделить часть строки. Для этого используется функция ПОДСТРОКА. Функция аналогична функции СРЕД () встроенного языка 1С. У нее три параметра:
- Строка-источник.
- Номер символа, с которого должна начинаться выделяемая строка.
- Количество символов.
И, наконец, существует оператор, которые позволяет сравнить строку с неким шаблоном. Это оператор ПОДОБНО. О его использовании читайте в нашей статье о парамертах и операторах сравнения в запросах 1С.
Функция ЕСТЬNULL
NULL — особый тип данных на платформе 1С:Предприятие. Он же является единственным возможным значением этого типа. NULL может возникать в запросах в нескольких случаях: при соединениях источников запроса, если не было найдено соответствующего значения в одной из таблиц; при обращении к реквизитам несуществующего объекта; если NULL был указан в списке полей запроса (например при объединении результатов выборки из нескольких таблиц) и т.д.
Поскольку NULL не является ни нулем, ни пустой строкой, ни даже значением Неопределено, его часто бывает полезно заменять на какой-то более полезный тип данных. Для этого и предназначена функция ЕСТЬNULL.
Она имеет два параметра:
- Проверяемое значение.
- Значение, на которое нужно заменить первый параметр, если он оказался равен NULL.
Функции ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ
Эти функции предназначены для получения строковых представлений различных значений. То есть, они преобразуют ссылки, числа, булево и т.д. в обычный текст. Разница между ними в том, что функция ПРЕДСТАВЛЕНИЕ преобразует в текст (строку) любые типы данных, а функция ПРЕДСТАВЛЕНИЕССЫЛКИ — только ссылки, а остальные значения возвращает как есть, не преобразованными.
Функции ТИП и ТИПЗНАЧЕНИЯ
Функция ТИП возвращает тип данных платформы 1С:Предприятие.
Функция ТИПЗНАЧЕНИЯ возвращает тип переданного в нее значения.
Эти функции удобно применять, например, когда нужно выяснить является ли полученное в запросе поле значением какого-то типа. Например, получим контактную информацию контрагентов из регистра сведений КонтактнаяИнформация (там хранятся контакты не только контрагентов, но и организаций, физических лиц и т.д.):
Функция ЗНАЧЕНИЕ
Функция Значение позволяет использовать в запросе объекты конфигурации 1С напрямую, без применения параметров запроса.
Дополним предыдущий пример еще одним условием. Необходимо получить только телефоны контрагентов.
Следует отметить, что эту функцию можно использовать только с предопределенными значениями, т.е. со значениями, к которым можно обратиться напрямую из конфигуратора. То есть функция ЗНАЧЕНИЕ не можно использоваться с элементами справочников, созданными пользователями, но может работать с перечислениями, с предопределенными элементами справочников, со значениями ПустаяСсылка.
Оператор ССЫЛКА
Оператор ССЫЛКА предназначен для проверки значений, получаемых запросом, на принадлежность к определенному ссылочному типу. Эту же задачу можно выполнить с помощью функций ТИП и ТИПЗНАЧЕНИЯ (которые имеют более широкую область применения и были рассмотрены выше).
Например, задачу выбора контактной информации контрагентов можно было решить и так:
Оператор ВЫРАЗИТЬ
Оператор ВЫРАЗИТЬ используется в запросах 1С в двух случаях:
- когда нужно изменить характеристики примитивного типа;
- когда нужно из поля с составным типом данных сделать поле с одиночным типом.
К примитивным типам данных относятся: число, строка, дата, булево. Некоторые из этих типов данных имеют дополнительные характеристики. Тип Число имеет длину и точность, тип Строка — длину или неограниченность.
Оператор ВЫРАЗИТЬ позволяет изменять не тип данных, а именно дополнительные характеристики. Например, он может из строки с неограниченной длиной сделать строку с длиной ограниченной. Это бывает полезно, если нужно сгруппировать результаты запроса по такому полю. Выполнять группировку по полям с неограниченной длиной нельзя, поэтому мы его преобразуем в строку с длиной 200 символов.
В ряде случаев, запросы к полям с составным типом данных могут обрабатываться платформой 1С неоптимально. Это приводит к увеличению времени выполнения запросов, поэтому бывает полезно заранее преобразовать составной тип в одиночный.
Операторы ВЫБОР и ЕСТЬ NULL
Оператор ВЫБОР аналогичен оператору ЕСЛИ во встроенном языке 1С, но имеет несколько урезанный функционал.
Допустим мы хотим получить контактные данные из регистра сведений КонтактнаяИнформация и при этом в отдельном поле запроса указать, принадлежат ли они контрагенту или физическому лицу.
Как видно из примера, в конструкции ВЫБОР всегда присутствует условие после слова КОГДА; значение, применяемое, если условие выполняется, после слова ТОГДА и значение, применяемое, если условие не выполняется, после слова ИНАЧЕ. Все три элемента конструкции ВЫБОР являются обязательными. Опустить элемент ИНАЧЕ, так же, как это делается при использовании оператора ЕСЛИ во встроенном языке 1С, нельзя. Также у оператора ВЫБОР отсутствует аналог конструкции ИНАЧЕЕСЛИ, зато можно вложить один ВЫБОР в другой, как и было сделано в нашем примере.
Оператор ЕСТЬ NULL используется в конструкции ВЫБОР для сравнения поля запроса с типом NULL.
Кроме того, оператор ЕСТЬ NULL можно использовать в условиях запроса, например в предложении ГДЕ.