- Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL())
- Использование функции ЕСТЬNULL()
- Функция ЕСТЬNULL
- Использование операции ВЫБОР
- Особенности функции ЕСТЬNULL
- Не работает есть null в запросе, почему?
- 1С 8.3 : Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL())
- Использование функции ЕСТЬNULL()
- Функция ЕСТЬNULL
- Использование операции ВЫБОР
- Особенности функции ЕСТЬNULL
Значения 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()
При работе с языком запросов иногда возникает ситуация, когда требуется заменить значение 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 в запросе, почему?
Нужно выбрать номенклатуру, у которой приход — документ поступление товаров и услуг. По факту выбирает все подряд.
Пробовала выбрать все документы списком, которые не нужны — тоже не работает.
А теперь вопрос, товарищи знатоки — что не так?
Запрос:
ВЫБРАТЬ
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура,
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Склад,
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.ХарактеристикаНоменклатуры.ГВ КАК ГодВыпуска,
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура.Код КАК Код,
СУММА(ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток,
СУММА(ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.КоличествоПриход) КАК КоличествоПриход,
СУММА(ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
СУММА(ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет.ОстаткиИОбороты(&НачалоПериодаФормирования, &КонецПериодаФормирования, , , ) КАК ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ПартииТоваровНаСкладахБухгалтерскийУчетОбороты.Номенклатура КАК Номенклатура
ИЗ
РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет.Обороты(&НачалоПериодаФормирования, &НачалоПериодаБезДвижения, Регистратор, ) КАК ПартииТоваровНаСкладахБухгалтерскийУчетОбороты
ГДЕ
ПартииТоваровНаСкладахБухгалтерскийУчетОбороты.КоличествоПриход > 0
И НЕ ПартииТоваровНаСкладахБухгалтерскийУчетОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладахБухгалтерскийУчетОбороты.Номенклатура) КАК ВложенныйЗапрос
ПО ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура = ВложенныйЗапрос.Номенклатура
ГДЕ
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.КоличествоКонечныйОстаток > 0
И ВложенныйЗапрос.Номенклатура ЕСТЬ NULL
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Склад,
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура,
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.ХарактеристикаНоменклатуры.ГВ,
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура.Код
(15) но может так и стоит сделать. Буквально в топике так и сказано, но в коде не сделано.
Выбрать по справочнику Номенклатура
Соединять выборки из регистров с выборкой по Номенклатуре и там где будет нул в соединении, там оборота не было.
А так, как написано сейчас = выборка всех и остатков и оборотов. Нечеткое условие. Сейчас к полученным остаткам и оборотам чего-то прикручено еще раз обороты и что? Масло масленное какое-то
(25) Ваш вложенный запрос проверяет не наличие поступлений, а отсутствие поступления в КОНКРЕТНОЙ записи регистра. Затем вся такая номенклатура группируется.
Возьмем например яблочко, оно поступило и было перемещено. Вложенный запрос увидит 2 записи в регистре, одну пропустит по условию, вторую возьмет в результат. И вот ваше яблочко уже считается не поступавшим по вашей логике?
Перепишите запрос корректно — вложенным запросом выберите всю номенклатуру по которой БЫЛО поступление, а затем сделайте ВНУТРЕННЕЕ соединение с таблицей верхнего уровня.
Источник
1С 8.3 : Значения 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()
При работе с языком запросов иногда возникает ситуация, когда требуется заменить значение 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).
Источник