Запрос в 7.7

1. niko (n_spb) 18.12.16 19:21 Сейчас в теме
Подскажите по запросу в 7.7. Нужно выбрать все элементы справочника номенклатура из определенной группы.
Сделал так:
Запрос = СоздатьОбъект("Запрос");
		    ТекстЗапроса = "
		    |Обрабатывать Все;
		    |Спр   = Справочник.Номенклатура.ТекущийЭлемент;
		    |Условие(Спр в ВыбНоменклатура);
		    |Группировка Спр Все;
		    |";
...Показать Скрыть

В ВыбНоменклатура группа справочника из которой нужно выбрать все элементы и группы.
Ответы
2. Игорь Краюшкин (Harry_udm) 2 18.12.16 22:23 Сейчас в теме
Ну так и проверьте: работает ли? Должно работать...
Конструктор запросов выдает практически такую же структуру:
	ТекстЗапроса = "
	|Спр = Справочник.Номенклатура.ТекущийЭлемент;
	|Группировка Спр все;
	|Условие(Спр в ВыбНоменклатура);
	|;";
...Показать Скрыть
3. Сергей (Che) Коцюра (CheBurator) 3382 20.12.16 01:12 Сейчас в теме
4. Дмитрий Захаров (DWZ2) 20.12.16 05:53 Сейчас в теме
(1)

Я бы лично писал просто
|Группировка Спр;


ВыбНоменклатура, кстати, должна быть группой и не пустым значением, то есть должно быть ВыбНоменклатура.Выбран()=1.

А что конкретно не работает / работает не так?
5. Дмитрий Захаров (DWZ2) 20.12.16 06:14 Сейчас в теме
(3)

Там не про семёрочный запрос.
6. niko (n_spb) 20.12.16 21:02 Сейчас в теме
(2) Мой вариант, работает. Делал его без конструктора, сомневался просто, что грамотно его сделал. Подскажите, где про запросы и конструктор в 7.7 почитать.
(4) Работает. А где написать ВыбНоменклатура.Выбран()=1?
7. Дмитрий Захаров (DWZ2) 20.12.16 22:41 Сейчас в теме
(6)
Мой вариант, работает.


Значит, не страшно.

Делал его без конструктора, сомневался просто, что грамотно его сделал.


Просто обычно со словом "Группировка" пишут КОГДА НАДО или "Без Групп" или "Упорядочить По". А когда не надо - ничего не пишут.

Подскажите, где про запросы и конструктор в 7.7 почитать.


В ЖКК - жёлто-красных книжках, то есть в документации по Конфигуратору (2 тома) и по языку (тоже 2 тома).

А где написать ВыбНоменклатура.Выбран()=1?


Нигде :). Я просто хотел сказать, что элемент управления ВыбНоменклатура не должен быть пустым, то есть должен содержать ссылку на конкретную группу справочника "Номенклатура". Некоторые думают, что если он будет пустым, отбор по номенклатуре работать не будет, и они получат весь справочник. А на самом деле будут только элементы, у которых пустой родитель, то есть те, которые находятся в корне справочника. Часто таких не бывает - и на выходе запроса пусто.

А вообще "в лучших домах" пишут так:


Если ВыбНоменклатура.Выбран()=1 Тогда
    // 
    Если ВыбНоменклатура.ЭтоГруппа()=1 Тогда
         ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";
    Иначе
         ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр = ВыбНоменклатура);";
   КонецЕсли;
КонецЕсли;

...Показать Скрыть


Обратите внимание, что в условиях точка с запятой стоит 2 раза до и после кавычки. Первый раз она относится к тексту запроса, а второй - к программе 1С.

Также рекомендую разбивать запрос на строчки, то есть писать НЕ

ТекстЗапроса=ТекстЗапроса+"Условие (Спр В ВыбНоменклатура);";


а

ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";


или

ТекстЗапроса=ТекстЗапроса+РазделительСтрок+"Условие (Спр В ВыбНоменклатура);";


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

Кстати, если будете смотреть текст ВНЕ отладчика, делайте через Предупреждение(), а не через Сообщить(). Не забудьте только убрать :))), а то пользователи будут недовольны.
8. Дмитрий Захаров (DWZ2) 20.12.16 22:53 Сейчас в теме
Кстати, если не нужно группировать, и данные хранятся в виде DBF, то будет быстрее через цикл с ВыбратьЭлемент()/ПолучитьЭлемент(). Так как:

1) С запросом у Вас будет 2 прохода по базе, а так один. (Правда, второй может быть меньше, если в запросе стоит "мощное" условие)

2) Можно будет использовать индекс в БД через свойство "Сортировка" у реквизита. Запрос по справочникам индексы НЕ использует.
9. Дмитрий Захаров (DWZ2) 21.12.16 12:24 Сейчас в теме
Кстати, в запросе можно фильтровать по списку значений, в том числе в виде органа управления в форме. В этом списке могут быть и элементы и группы в любом сочетании. Тут уж "В" работает в обоих случаях. Если элемент списка - элемент справочника, то 1С автоматически проверяет на равенство, а если группа - на вхождение. То есть можно писать

Если ВыбНоменклатура.РазмерСписка()>0 Тогда
         ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";
КонецЕсли;
...Показать Скрыть


Для отчетов можно написать:
Если ВыбНоменклатура.РазмерСписка()>0 Тогда
      ЗаголовокПоНоменклатуре  ="По всей номенклатуре";
      ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";
Иначе
      ЗаголовокПоНоменклатуре  ="По номенклатуре из списка: " +    ВыбНоменклатура.ВСтрокуСРазделителями();
КонецЕсли;
...Показать Скрыть


Естественно, в таблице отчёта должна быть переменная "ЗаголовокПоНоменклатуре", которая будет показывать пользователю, есть ли у него отбор по номенклатуре и какой.

Лично мне лень переключать алфавит для печать знака ">", поэтому я пишу наоборот:
Если ВыбНоменклатура.РазмерСписка()=0 Тогда
      ЗаголовокПоНоменклатуре  ="По номенклатуре из списка: " +    ВыбНоменклатура.ВСтрокуСРазделителями();

Иначе
      ЗаголовокПоНоменклатуре  ="По всей номенклатуре";
      ТекстЗапроса=ТекстЗапроса+"
                                  |Условие (Спр В ВыбНоменклатура);";

КонецЕсли;
...Показать Скрыть


К тому же это в стиле кого-то из корифеев программирования - чтобы не запутаться, делать первую ветку условия короче или заменять вторую по обстоятельствам на "Продолжить", "Прервать" или "Возврат".
Оставьте свое сообщение