1с запрос где null
Перейти к содержимому

1с запрос где null

  • автор:

Программирование 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(ДоговорыКонтрагентов.Ссылка, ""Договора нет"") КАК Договор |ИЗ | Справочник.Контрагенты КАК Контрагенты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов | ПО Контрагенты.ОсновнойДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка"

      Недостаточно прав для комментирования

      Значения NULL ( ЕСТЬ NULL и ЕСТЬ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.х

      Аренда 1С в облаке

        
      ВЫБРАТЬ
      СправочникНоменклатуры.Наименование,
      ЕСТЬ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.
      Можно ли переписать запрос так, что бы колонки была строго определенного типа?

      Единственно, что пока приходит на ум, это создать ТЗ с такими же колонками с простым типом Строка/Белево и т.д. и просто в цикле заполнить эту ТЗ из выборки запроса. Но может есть более простой вариант?

      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) Я терпеть не могу построитель отчетов. Компоновка — правильная вещь, а построитель органически не перевариваю. Он мне тут свинью подложил, не знаю, с какой стороны взяться.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *