Оцените, пожалуйста, статью, мы стараемся:
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Хитрости запросов: сравнения и проверки в запросах 1С. Отбор не заполненного значения. Отбор в запросе документов конкретного типа при составном типе и т.п. ( 1С: 8.1: Язык программирования: Запросы)

18

Вопрос Как в языке запросов 1С отобрать не заполненное значение? Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Ответ См. примеры запросов и комментарии к ним:

admin

18 thoughts on “Хитрости запросов: сравнения и проверки в запросах 1С. Отбор не заполненного значения. Отбор в запросе документов конкретного типа при составном типе и т.п. ( 1С: 8.1: Язык программирования: Запросы)

  1. Если проверка на не заполненную строку (недавно у меня была задача отсечь) поэтому условие сработало
    |ГДЕ усЕдиницыХранения.АктивнаяОбластьОтбора > «»»»

    как-то так

  2. Составной тип можно проверить через конкатенацию: ИЛИ, ИЛИ, ИЛИ… перечисляя по очереди внутри конструкции ЗНАЧЕНИЕ(…) все допустимые типы. Про любую ссылку — надо подумать. Есть идеи?

  3. Т.е. указываем
    |ГДЕ
    | усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
    | ИЛИ усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усДругойСправочник.ПустаяСсылка)»;

    А как указать, если тип в этом реквизите совсем не задан (не выбирался, и равен Неопределено)? ЕСТЬ NULL не прокатывает..

  4. Если в операции «ГДЕ» нужно каким-то определенным образом учесть не определенное значение, то (в зависимости от смысла ограничения) можно использовать что-то вроде такого:
    |ГДЕ
    | ВЫБОР
    | КОГДА &ОбластьПодпитки = НЕОПРЕДЕЛЕНО
    | ТОГДА ИСТИНА
    | ИНАЧЕ тбПолучатели.ОбластьПодпитки = &ОбластьПодпитки
    | КОНЕЦ

    или такого:
    |ГДЕ
    | И СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО

    Т.е. условие зависит от того, что именно все-таки нужно.

  5. Добавлен Пример 5. если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре «ВыполняемыеЗадания» ресурс «Задание» имеет составной тип, среди значений которого возможен документ «Отбор»

  6. Я использовал такое выражение, для выборки строк, где не заполнен реквизит Документ. Этот реквизит составного типа.

    ГДЕ
    (НЕ РегистрСведений.ИмяРегистра.Документ ЕСТЬ NULL)

    1. Baduin, для проверки на незаполнненное поле типа «документ» подходят примеры 3а и 3б, т.е. Вы ошибаетесь, условие «ЕСТЬ NULL» не подходит для проверки на то, что значение просто не заполнено.
      «ЕСТЬ NULL» подойдет только в двух случаях:
      1. Этим условием проверяется наличие битой ссылки (см. http://www.1c-h.ru/?p=935)
      2. Значением NULL заполняются поля присоединяемых в запросе таблиц, когда по условию соединения запроса отсутствуют подходящие значения.

      Вероятно, у вас выполняется соединение в запросе? Что-то вроде этого:


      РегистрСведений.Документ,

      ИЗ …
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИмяРегистра КАК РегистрСведений

      Суть «ЕСТЬ NULL» в том, что берутся строки, в которых по условию соединения нет подходящего Документа
      Т.е. предположим, есть две таблицы:

      Таблица1:

      Параметр1
      Х
      У
      Z

      И есть Таблица2:

      Параметр2 Документ
      Х Док1
      Z Док2

      При левом присоединении Таблицы2 к Таблице1 по условию
      Параметр1 = Параметр2

      Получим строки

      Параметр Документ
      Х Док1
      У NULL
      Z Док2

      Т.е., как видите, для значения «У» Таблицы 1 не нашлось подходящего Документа. Теперь если выбрать из этой результирующей таблицы строки по условию, что Документ ЕСТЬ NULL, то получим таблицу:

      Параметр Документ
      У NULL

      А если выбрать по условию НЕ Документ ЕСТЬ NULL, то получим таблицу:

      Параметр Документ
      Х Док1
      Z Док2

      Таким образом, причина попадания или непопадания в результат запроса конкретной строки не в том, что документ не заполнен в исходной таблице, а в том, что не подобралось документа по условию соединения. Т.е., как видите, это несколько другая задача.

  7. А зачем используется такая конструкция:

    ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор

    Я всегда пользовался:

    РегистрСведенийВыполняемыеЗадания.Задание ССЫЛКА Документ.Отбор

    И это великолепно работает. ВЫРАЗИТЬ тут в лучшем случае — не будет обрабатываться. В Худшем — создаст дополнительную ненужную нагрузку.
    Или от меня ускользнула некая непостижимая моему разумению житейская мудрость?

    1. «ВЫРАЗИТЬ» используется во всех случаях, когда исходное значение может оказаться не того типа, который нужен, например, в указанном примере «Задание» — измерение составного типа и может содержать не только документы «Отбор», но и другие виды документов.

      См. так же http://www.1c-h.ru/?p=1553 или http://www.1c-h.ru/?p=89 — другие примеры применения(и обоснвания применения) метода «ВЫРАЗИТЬ».

      1. так а для чего вы тогда где поставили вы и сравниваете тип вашего документа с отбором,а тут вы сначала приводите к значению отбора ,пытаетесь а потом сравниваете..

  8. Решал вопрос с незаполненными полями в регистрах вот таким образом :

    Запрос.УстановитьПараметр(«ПустаяСсылка»,);

    ……………..
    ИмяРегистра.Ссылка = &ПустаяСсылка»
    ……………..

    Работает отлично, побочных эфектов пока не наблюдаю 🙂

  9. Пример 3б. выборка по условию не заполненного поля, имеющего тип «документы разных типов» (составное поле)
    |ГДЕ
    | (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)
    | ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)
    | ИЛИ …(и т.д. — последовательно перечисляем условия для всех возможных типов этого составного поля))
    ———————————————————————————————————————————————-

    За такой быдлокод сразу кол в дневник и линейкой по пальцам….
    Каждое ИЛИ создает неявное соединение таблиц. Дядя гугл детальней расскажет вам о данном косяке запросов в 1С.
    Альтернатива например:
    |ГДЕ
    | НашРегистрСведений.Документ В (ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка), ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка) , и т.д.)

Добавить комментарий для Ильдар Отменить ответ

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

Next Post

Как установить 1С: Предприятие. Установка 1С:Предприятия 8.0 (8.1) в варианте "клиент-сервер" (SQL) (1С)

Вт Май 18 , 2010
Вопрос Как установить 1С: Предприятие в клиент-серверном варианте. Ответ Раздел содержит практические рекомендации по решению проблем, возникающих при установке и настройке клиент-серверного варианта 1С:Предприятия