Проверка на пустой результат выполнения запроса
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. Проверку того, что результат выполнения запроса не содержит строк следует выполнять с помощью метода Пустой . Поскольку на получение выборки из результата запроса (выгрузка его в таблицу значений) будет затрачиваться дополнительное время.
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Возврат НЕ Запрос.Выполнить().Пустой()
Методическая рекомендация (полезный совет)
2. В то же время если требуется выбрать (или выгрузить) результат запроса, то предварительный вызов метода Пустой не требуется.
Например, вместо:
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда // избыточный вызов
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
.
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
.
Пустая ссылка в запросе 1с проверка и использование
В статье вы узнаете, как применяется пустая ссылка в запросе 1с. Пустые ссылки можно использовать в различных конструкциях языка запросов:
- условиях раздела ГДЕ;
- в качестве значения поля запроса;
- конструкциях ВЫБОР КОГДА…;
- конструкциях ЕСТЬNULL;
- условиях связей таблиц.
Пустая ссылка в условиях запросов 1с
Для использования пустой ссылки ее необходимо передать ее в запрос при помощи параметра. Также можно использовать конструкцию ЗНАЧЕНИЕ.
ЗНАЧЕНИЕ(.ПустаяСсылка)
Здесь ОбъектМетаданных выражение вида:
- Документ.ИмяДокумента;
- Справочник.ИмяДокумента и т.д.
Пример 1. При помощи запроса получить верхний уровень иерархии справочника Номенклатура.
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)";
Пример 2. При помощи запроса получить все элементы справочника Номенклатура, кроме тех, у кого нет родителя.
Запрос = Новый Запрос; ПустаяСсылка = Справочники.Номенклатура.ПустаяСсылка; Запрос.УстановитьПараметр("ПустаяСсылка", ПустаяСсылка); Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | НЕ Номенклатура.Родитель = &ПустаяСсылка";
Следует помнить, что в запросе нельзя реализовать проверку сразу на все пустые ссылки. Всегда требуется указывать, пустую ссылку какого справочника, документа вы имеете в виду.
Пустая ссылка в качестве значения поля
Пустая ссылка в запросе 1с может использоваться в качестве значения поля. Как в чистом виде, так и в конструкциях ВЫБОР КОГДА… или ЕСТЬNULL.
Пример 3. Создать пустую временную таблицу ТаблицаНоменклатуры.
Запрос.Текст = "ВЫБРАТЬ | ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура, | 0 КАК Цена |ПОМЕСТИТЬ ТаблицаНоменклатуры |ГДЕ | ЛОЖЬ
Пример 4. При помощи запроса получить список номенклатуры со значениями дополнительного сведения Цвет.
Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка, | ЕСТЬNULL(Сведения.Значение, | ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка)) КАК Цвет |ИЗ | Справочник.Номенклатура КАК Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК Сведения | ПО Номенклатура.Ссылка = Сведения.Объект | И Сведения.Свойство = &СвойствоЦвет";
Пример 5. В запросе из предыдущего примера использовать конструкцию ВЫБОР КОГДА… вместо ЕСТЬNULL.
Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка, | ВЫБОР | КОГДА НЕ Сведения.Значение ЕСТЬ NULL | ТОГДА Сведения.Значение | ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка) | КОНЕЦ КАК Цвет |ИЗ | Справочник.Номенклатура КАК Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК Сведения | ПО Номенклатура.Ссылка = Сведения.Объект | И Сведения.Свойство = &СвойствоЦвет";
Пустая ссылка в связях запроса 1с
Проверку на пустую ссылку можно использовать и в условиях связи таблиц.
Пример 6. Получить список номенклатуры, а также значения дополнительного сведения Индекс. Индекс выводить только для номенклатуры с заполненным реквизитом СтранаПроисхождения.
Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка, | Сведения.Значение КАК ПочтовыйИндекс |ИЗ | Справочник.Номенклатура КАК Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК Сведения | ПО (Номенклатура.Ссылка = Сведения.Объект | И Сведения.Свойство = &СвойствоИндекс | И Номенклатура.СтранаПроисхождения | <> ЗНАЧЕНИЕ(Справочник.СтраныМира.ПустаяСсылка))";
Также прочитайте статью о структуре оператора Выбрать, языка запросов: Язык запросов 1с — оператор Выбрать
1с запросы если параметр пустой выбор когда
Делаю через консоль отчетов в ЗУП. Есть запрос:
ВЫБРАТЬ
СотрудникиОрганизаций.Ссылка
ИЗ
Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ГДЕ
СотрудникиОрганизаций.Ссылка В ИЕРАРХИИ(&ГруппаСотрудников)
Если я параметр не выбираю, то ругается что не заполнен параметр. Как сделать так чтобы отображались все сотрудники при не заполнении параметра?
P.S. Надо именно через параметр, отбор не нужен.
ГДЕ &Группа=Значение(. ПустаяСсылка) ИЛИ далее по тексту
(0) никак, либо текст запроса модифицируй, либо как в (1) и параметр заполняй
Использую консоль отчетов, там нет возможности программно установить параметр равный пустой ссылке.
Используй обычный отбор в консоли отчета, а не параметр.
щас полетят миллионы камней ))
ВЫБРАТЬ
СотрудникиОрганизаций.Ссылка
ИЗ
Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ГДЕ
СотрудникиОрганизаций.Ссылка В ИЕРАРХИИ(&ГруппаСотрудников) ИЛИ &НеХочуВыбирать
Запрос.УстановитьПараметр(Справочники.СотрудникиОрганизаций.ПустаяСсылка);
То есть в консоли отчетов никак?
Используй правильную консоль отчетов.
(8) Не поделишься? я в типовой делаю
(7) чем в (1) вариант не устроил.
(10) он видимо список параметров не заполняет
Сделай большую желтую папку для всех :)))
http://ubuntuone.com/6iURUgZ5RyNmTLFlqiWMjW первое что нашел.
в ир вроде есть
(5) Ну ты в курсе сомнительности эстетичности такой реализации 😀
(7) чем (6) не устраивает.
(13) Спасибо за запросник, хорошая обработка, удобная. Но все таки это больше для программистов, аналог стандартной «консоль запросов». В данном случае типовая обработка «консоль отчетов» используется для конечных пользователей, там есть список отчетов, они ими пользуются, удобный механизм отключения группировок (можно на ненужных группировках галочки отметить), отборы и т.п.
(17) В консоли отчетов нет возможности программный код добавить.
P.S. Может кто посоветует, есть какие обработки, что-то типа универсальных отчетов по СКД, то есть задаешь СКД, обработка подстраивается, показывает группировки, отборы, параметры и плюс можно было бы программный код добавить. В типовой ЗУП для бюджета не нашел, хотя в БГУ есть такой отчет.
(18) На ИТС смотри консоль отчетов СКД
(19) Если не сложно выложи тут, а то я дома, нет под рукой дисков.
(18) значит ты не умеешь его готовить.
(0) Юзай ПостроительЗапроса.
(19) Посмотрел на ИТС, один в один который
(19) Посмотрел на ИТС, один в один который я использую
ВЫБРАТЬ
СотрудникиОрганизаций.Ссылка
ИЗ
Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ГДЕ
ВЫБОР
&ГруппаСотрудников = Значение(Справочник.СотрудникиОрганизаций.ПустаяСсылка)
ТОГДА
Истина
ИНАЧЕ
СотрудникиОрганизаций.Ссылка В ИЕРАРХИИ(&ГруппаСотрудников)
КОНЕЦ
(25) чем лучше (1)?
вообще-то, если параметр — пустая ссылка, то
СотрудникиОрганизаций.Ссылка В ИЕРАРХИИ(&ГруппаСотрудников)
не должно ругаться, а просто взять весь справочник.
Кому интересно пока придумал такой вариант.
Текст запроса оставляю прежний:
ВЫБРАТЬ
СотрудникиОрганизаций.Ссылка
ИЗ
Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ГДЕ
СотрудникиОрганизаций.Ссылка В ИЕРАРХИИ(&ГруппаСотрудников)
Далее создаю еще один параметр «ОтборПоГруппе», тип Булево.
У параметра «ГруппаСотрудников» в поле Выражение пишу следующее:
ВЫБОР КОГДА &ОтборПоГруппе ТОГДА &ГруппаСотрудников ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СотрудникиОрганизаций.ПустаяСсылка) КОНЕЦ
Теперь по крайней мере можно сделать так, чтобы в отчет попадали все сотрудники.
1с запросы если параметр пустой выбор когда
Есть запрос с параметром(список значений)
как проверить что параметр пустой?
(1) В последней версии платформы у объекта запрос есть свойство, «параметры» кажеться — тип Структура — там все параметры
(1) можно просто список значений взять и проверить.
Уточню, мне это надо ВНУТРИ ЗАПРОСА проверить,
ЕСТЬ NULL не катит — ругается, количество строк в списке не знаю как проверить
Запрос.Текст =
«Выбрать
.
.
ГДЕ » +?(Список.Количество() = 0, «ИСТИНА», «Таблица.Номенклатура В (&Список)») + И .
. «;
(5) В запросе так нельзя
(5)а понял сформировать текст так можно,
только у меня компановка там нет у меня возможности текст запроса менять
Еще уточню задачу,
Нужны к примеру остатки ТМЦ из регистраНакопления,
ТМЦ должно быть в спискеТМЦ или все остатки если список ТМЦ не задан
(8) а зачем тебе проверять? С пустым списком вроде нормально отбабатывает.
.
.
ГДЕ » +?(Список.Количество() = 0, «ИСТИНА», «Таблица.Номенклатура В (&Список)») + и
.
А конструкция
Выбрать
когда
.
тогда
.
иначе
.
конец
неподходит?
(10) не подходит
(10) не подходит
конструкция
Выбрать
когда
а условие какое?
Вобще я точно не знаю но можно вообще не ставить условий =)
Далее уже в настройках отчёта ставиш ОТБОР . и выбираеш что тебе нужно .
(0) проверяй снаружи запроса и генерируй разный текст в зависимости от результата проверки
И ещё . создаёш форму .
Процедура ПриОткрытии()
там можно отловить текст запроса. (я видел но делать с ним чтонибудь я не пробовал)
В типовой конфе ЗУП используется следующая методика — В запросе надо проверить на пустоту ВидРасчета, так это делается следующим образом (у вида расчета составной тип):
ВЫБОР
КОГДА ВидРасчета.Код ЕСТЬ NULL ТОГДА
.
ИНАЧЕ
.
КОНЕЦВЫБОРА
если тип определен (в 8 — ке не знаю, а в 8.1 это работает)
тогда
ВЫБОР
КОГДА ТвоеЗначение = ЗНАЧЕНИЕ(Справочник.ТвойСправочник.ПустаяССылка) ну и т.д.
(17) это не то
УсловиеНаПустотуСписка = ?(ТвойСписок.Количество() > 0, » И ИСТИНА», «И ЛОЖЬ»);
ТекстЗапроса =
«.
ВЫБОР
КОГДА ИСТИНА» + УсловиеНаПустотуСписка + »
.
ИНАЧЕ
.
КОНЕЦВЫБОРА
>>Еще уточню задачу,
>>Нужны к примеру остатки ТМЦ из регистраНакопления,
>>ТМЦ должно быть в спискеТМЦ или все остатки если список ТМЦ не задан
Номенклатура В
(ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура,
(ВЫБРАТЬ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номенклатура.Ссылка) КАК ЕстьНоменклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В (&СписокТМЦ)
) КАК ВложенныйЗапрос
ГДЕ
(Номенклатура.Ссылка В (&СписокТМЦ)
ИЛИ ВложенныйЗапрос.ЕстьНоменклатура = 0))
дык Условие В так и отрабатывает. Если список пустой то оно — всегда дает ИСТИНА, если не пустой, то ИСТИНА выдается только по условию вхождения в список.
Или я чего-то не понял?
