1с запрос где null
В запрос передаю значение Контрагент из ПолеВыбора, в запросе значение проверяется на NULL но почему то не работает проверка. Вот код сравнения:
ВЫБОР
КОГДА &Контрагент = Документы2.Контрагент
ТОГДА Документы2.Контрагент
ИНАЧЕ ВЫБОР
КОГДА &Контрагент ЕСТЬ NULL
ТОГДА NULL
ИНАЧЕ ЛОЖЬ
КОНЕЦ
КОНЕЦ = &Контрагент
Когда не указан контрагент должны попадать все записи, а не попадает не одна, а когда указываю контрагента то все работает нормально.
null и пустая ссылка это разыне понятия
= Неопределено
(1) значит передается пустая ссылка
(2) попробую
(2) в запросе не работает, ты уверен в написанном?
а вообще на кой ляд в запросе делать проверку чего передали ему в качестве параметра
(4) передай в запрос параметр типа &КонтрагентНеВыбран и пиши в условии &КонтрагентНеВыбран ИЛИ Документы2.Контрагент=&Контрагент
(5) чтобы не делать несколько запросов
(6) смотри (0) уже использую
(8)ихмается мне вы чего-то не так делаете
поле = значение(тип.пустаяссылка)
ВЫБОР КОГДА &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА.
(7) я при не заданном значении контрагента могу передать туда Ложь к примеру, но мне хотелось бы нечего не передавать туда, а просто там проверить, но если так нельзя сделать то это другое дело =)
(8) «чтобы не делать несколько запросов » — а с этого места можно поподробнее? Чего делается-то?
А то интересный запросик, который в одну колонку должен увернуть контрагента, NULL и Ложь.
(13) это просто сравнение, часть запроса для отчета по расчетам с поставщиками, вот делаю отбор по контрагенту
(11) Спасибо, все работает!
Вот код:
ВЫБОР
КОГДА &Контрагент = Документы2.Контрагент
ТОГДА Документы2.Контрагент
ИНАЧЕ ВЫБОР
КОГДА &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ТОГДА ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ИНАЧЕ ЛОЖЬ
КОНЕЦ
КОНЕЦ = &Контрагент
(15) А при чём тут NULL.
(15) обманывать не хорошо, это не может работать
(15) имхо, если в условии запроса фильтр нужен по контрагенту то пишу так
ВЫБОР КОГДА &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА
ИСТИНА
ИНАЧЕ
ВЫБОР КОГДА Документы2.Контрагент = &Контрагент ТОГДА
ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ
КОНЕЦ
(18) Что мешает применить простое ГДЕ? Зачем нужны эти ВЫБОР КОГДА ТОГДА Ложь ИНАЧЕ Истина КОНЕЦ КОНЕЦ.
есть же конструкция «НЕ» или <>
(19) потому что, например если контрагент = пустаяссылка то берем все. хз все время так пишу 🙂
(21) Очень неоптимально. Описано на ИТС ещё в лохматом 2003 году. Учите матчасть
(22) приведите пож-ста пример, как сделать без выбор когда. я понимаю что, как-то так — &ПоВсемКонтрагентам ИЛИ Документы.Контрагент = &Контрагент.
(21) Сформируй текст запроса динамически перед выполнением запроса
(24) обычно так и делаю — но когда отлаживаю, пишу выбором. чтобы в консольке запросов легче было бы посмотреть
(23) Именно так.
(27) я бы переименовал статью в «Путь неудачника» ибо такие штуки православно как минимум построителем делать.
Которые тут ходатайствуют за «сформируй запрос динамический» — апс. не правы тоже, в общем
Сабж решается построителем.
В текст запроса добавить:
«»
в процедуру, выполняющую запрос:
Построитель = Новый ПостроительЗапроса;
Построитель = «текст запроса, всключа описанную выше конструкцию в фигурных скобках»;
Построитель.Параметры.Вставить(вот тут парамемтры устанавливаем)
Если не ЗначениеЗаполнено(Контрагент) Тогда
Построитель.Отбор.Контрагент.Утсановить(Контрагент);
КонецЕсли;
// круть-верть с результатом, как обычно
PS Описанное выше сверить с синтаксис-помощником, поскольку писАно из головы и из под шофе. Работать ОБЯЗАНО
(28) Я терпеть не могу построитель отчетов. Компоновка — правильная вещь, а построитель органически не перевариваю. Он мне тут свинью подложил, не знаю, с какой стороны взяться.
Отсутствие проверки на NULL для полей из присоединяемых таблиц (FieldsFromJoinsWithoutIsNull)¶
Диагностика проверяет поля из левых, правых, полных соединений, для которых не выполняется проверка с помощью ЕСТЬNULL() или НЕ ЕСТЬ NULL или или ЕСТЬ НЕ NULL .
В запросах нельзя использовать реквизиты из присоединяемых слева или справа таблиц без проверки значений на NULL . Указанное обращение может приводить к ошибкам, если условие соединения не выполнено и нет подходящих записей в левой или правой таблице. В итоге в результате запроса можно получить неожиданные данные и система может повести себя неверным образом.
Важно помнить, что любое сравнение значения NULL с любым другими выражением всегда ложно, даже сравнение NULL и NULL всегда ложно. Смотрите ниже пример подобных неверных сравнений. Поэтому нужно правильно выполнять сравнение с NULL — или через оператор ЕСТЬ NULL или через функцию ЕСТЬNULL() .
Также достаточно часто используются левые\правые соединения, хотя данные позволяют использовать внутреннее соединение, в этом случае не нужны проверки на NULL .
Или дополнительные проверки реквизитов выполняются в коде 1С, а не в тексте запроса. Подобные обращения затрудняют чтение кода и рефакторинг кода, т.к. контекст обращения к реквизиту приходится учитывать в нескольких местах. В дополнение нужно учитывать, что простые проверки в запросе выполняются чуть быстрее и проще, чем в интерпретируемом коде 1С.
Указанные проблемы являются одними из самых частых ошибок разработчиков 1С самого разного уровня компетенций.
Примеры¶
Пример, показывающий проблемы сравнения с NULL — в примере 2 таблицы соединяются заведомо неверно и приведены разные способы сравнения
ВЫБРАТЬ ВЫБОР КОГДА Левая.Поле2 = 0 ТОГДА "Равно 0 - не работает" КОГДА Левая.Поле2 <> 0 ТОГДА "НЕ Равно 0 - не работает" КОГДА Левая.Поле2 = NULL ТОГДА "Равно NULL - не работает" КОГДА Левая.Поле2 ЕСТЬ NULL ТОГДА "ЕСТЬ NULL - этот вариант работает" КОГДА ЕСТЬNULL(Левая.Поле2, 0) = 0 ТОГДА "ЕСТЬNULL() - этот вариант также работает" ИНАЧЕ "Иначе" КОНЕЦ ИЗ Первая КАК Первая ЛЕВОЕ СОЕДИНЕНИЕ Левая КАК Левая ПО Ложь // чтобы не было соединения
Подозрительный код обращения к реквизиту присоединенной таблицы
ВЫБРАТЬ ДокументыПродажи.Ссылка КАК ДокПродажи, РегистрПродажи.Сумма КАК Сумма // здесь ошибка ИЗ Документ.РеализацияТоваровУслуг КАК ДокументыПродажи ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК РегистрПродажи ПО ДокументыПродажи.Ссылка = РегистрПродажи.Документ
ВЫБРАТЬ ДокументыПродажи.Ссылка КАК ДокПродажи, ЕстьNULL(РегистрПродажи.Сумма, 0) КАК Сумма ИЗ Документ.РеализацияТоваровУслуг КАК ДокументыПродажи ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК РегистрПродажи ПО ДокументыПродажи.Ссылка = РегистрПродажи.Документ
Также правильно
ВЫБРАТЬ ДокументыПродажи.Ссылка КАК ДокПродажи, ВЫБОР КОГДА РегистрПродажи.Сумма Есть NULL ТОГДА 0 ИНАЧЕ РегистрПродажи.Сумма КОНЕЦ КАК Сумма ИЗ Документ.РеализацияТоваровУслуг КАК ДокументыПродажи ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК РегистрПродажи ПО ДокументыПродажи.Ссылка = РегистрПродажи.Документ
И еще возможный вариант
ВЫБРАТЬ ДокументыПродажи.Ссылка КАК ДокПродажи, РегистрПродажи.Сумма КАК Сумма ИЗ Документ.РеализацияТоваровУслуг КАК ДокументыПродажи ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК РегистрПродажи ПО ДокументыПродажи.Ссылка = РегистрПродажи.Документ ГДЕ РегистрПродажи.Документ ЕСТЬ НЕ NULL //или НЕ РегистрПродажи.Документ ЕСТЬ NULL
Последний вариант — не самый лучший, т.к. в нем фактически эмулируется внутреннее соединение. И проще явно указать ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо использования левого соединения с проверкой ЕСТЬ НЕ NULL или НЕ ЕСТЬ NULL
Источники¶
- Использование функции ЕСТЬNULL() — Стандарт
- Понятие «пустых» значений — Методические рекомендации 1С
- Чем отличается значение типа Неопределено и значение типа Null? — Методические рекомендации 1С
- Как получить записи иерархической таблицы и расположить их в порядке иерархии — Методические рекомендации 1С
Сниппеты¶
Экранирование кода¶
// BSLLS:FieldsFromJoinsWithoutIsNull-off // BSLLS:FieldsFromJoinsWithoutIsNull-on
Параметр конфигурационного файла¶
"FieldsFromJoinsWithoutIsNull": false
Программирование 1С 8.х для начинающих
- Вы здесь:
- Главная
- Статьи
- Общие вопросы
- Запрос
- Null в запросе
Поделитесь в соцсетях
Общие вопросы
Null в запросе
Подробности Категория: Запрос
-
- Значение NULL и методы работы с ним «Есть Null» и «ЕстьNull».
- Есть Null
- ЕстьNull
Null в запросе
Значение NULL и методы работы с ним «Есть Null» и «ЕстьNull».
Значение Null означает что переменная(поле) не содержит значения. Возникает оно например, при левом соединении таблиц, когда в правой таблице нет подходящего значения для левой таблицы. Присоединим к таблице Контрагенты таблицу Договоры:
"ВЫБРАТЬ | Контрагенты.Ссылка КАК Контрагент, | ДоговорыКонтрагентов.Ссылка КАК Договор |ИЗ | Справочник.Контрагенты КАК Контрагенты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов | ПО Контрагенты.ОсновнойДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка"
Если при выполнении данного текста запроса у контрагента не будет договора, то тогда в результате будет примерно следующее:
Контрагент Договор Интенсивник ООО Договор подряда Рога и копыта АО NULL Колобок и Ко Договор поставки Значение Null не имеет визуального представления — будет показываться как пустая строка.
Чтобы корректно обрабатывать такие ситуации и созданы методы «Есть Null» и «ЕстьNull».
Есть Null
Данное логическое выражение проверяет является ли значение значением Null. При проверке обязательно нужно использовать данное выражение т.к. сравнивать значение с Null(Договор.Ссылка = Null) не имеет смысла, это не даст необходимого результата.
"ВЫБРАТЬ | Контрагенты.Ссылка КАК Контрагент, | ВЫБОР | КОГДА ДоговорыКонтрагентов.Ссылка ЕСТЬ NULL | ТОГДА ""Договора нет"" | ИНАЧЕ ДоговорыКонтрагентов.Ссылка | КОНЕЦ КАК Договор |ИЗ | Справочник.Контрагенты КАК Контрагенты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов | ПО Контрагенты.ОсновнойДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка |ГДЕ | (НЕ ДоговорыКонтрагентов.Ссылка ЕСТЬ NULL )"
Здесь выражение используется в условии и в конструкции выбора в одном из выбираемых полей. Конечно бессмысленно в выбираемом поле ставить конструкцию выбора т.к. такие значения отсекаются в условии, это сделано только для ознакомления.
ЕстьNull
Метод позволяет заменять значение Null на выбранное нами значение.
"ВЫБРАТЬ | Контрагенты.Ссылка КАК Контрагент, | ЕСТЬNULL(ДоговорыКонтрагентов.Ссылка, ""Договора нет"") КАК Договор |ИЗ | Справочник.Контрагенты КАК Контрагенты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов | ПО Контрагенты.ОсновнойДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка"
Недостаточно прав для комментирования
1с запрос где null
Если выбрать запросом из ТЧ выбранного документа поля номенклатура, количество, а затем выгрузить их в таблицу значений то тип значений колонок полученной ТЗ будет содержать тип NULL.
Почему это происходит ?
скажем так — колонки будут иметь составной тип, один из которых будет NULL.
Потому что так работает платформа. Воспринимай это как данность)(2)а как можно красиво избавиться от значения NULL?
Выразить() не работает. Пока приходиться копировать все строки в новую ТЗ. не кашерно 🙁(4) если полученную ТЗ потом использовать в запросе, то 1С ругается на поля с типом значения NULL
(5) Неправда.(6) постараюсь найти когда такое было, но было.
из последнего — если таким образом получить ТЗ, где есть колонка с типом число, то при добавлении новой строки по умолчанию тип значения с этой строке будет Неопределено а не 0(7) Ну понятно, тип же составной. Ну прописывай явно.
(6) А вот это: (5) — частично правда.
При использовании тз с колонками, содержащими в типах null, в качестве описания источника данных для построителя запроса или построителя отчета — ругается.(9) Запрос и Построитель с ИсточникомДанных — не одно и то же. В (5) речь о запросе. В запросе не ругается.
- Значение NULL и методы работы с ним «Есть Null» и «ЕстьNull».