Запрос в 7.7

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

В ВыбНоменклатура группа справочника из которой нужно выбрать все элементы и группы.
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. DWZ2 20.12.16 05:53 Сейчас в теме
(1)

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


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

А что конкретно не работает / работает не так?
2. Harry_udm 2 18.12.16 22:23 Сейчас в теме
Ну так и проверьте: работает ли? Должно работать...
Конструктор запросов выдает практически такую же структуру:
	ТекстЗапроса = "
	|Спр = Справочник.Номенклатура.ТекущийЭлемент;
	|Группировка Спр все;
	|Условие(Спр в ВыбНоменклатура);
	|;";
6. 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С.

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

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


а

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


или

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


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

Кстати, если будете смотреть текст ВНЕ отладчика, делайте через Предупреждение(), а не через Сообщить(). Не забудьте только убрать :))), а то пользователи будут недовольны.
5. DWZ2 20.12.16 06:14 Сейчас в теме
(3)

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

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

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

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


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


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

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

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

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


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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)