Подскажите по запросу в 7.7. Нужно выбрать все элементы справочника номенклатура из определенной группы.
Сделал так:
В ВыбНоменклатура группа справочника из которой нужно выбрать все элементы и группы.
Сделал так:
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Обрабатывать Все;
|Спр = Справочник.Номенклатура.ТекущийЭлемент;
|Условие(Спр в ВыбНоменклатура);
|Группировка Спр Все;
|";
В ВыбНоменклатура группа справочника из которой нужно выбрать все элементы и группы.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Ну так и проверьте: работает ли? Должно работать...
Конструктор запросов выдает практически такую же структуру:
Конструктор запросов выдает практически такую же структуру:
ТекстЗапроса = "
|Спр = Справочник.Номенклатура.ТекущийЭлемент;
|Группировка Спр все;
|Условие(Спр в ВыбНоменклатура);
|;";
(6)
Значит, не страшно.
Просто обычно со словом "Группировка" пишут КОГДА НАДО или "Без Групп" или "Упорядочить По". А когда не надо - ничего не пишут.
В ЖКК - жёлто-красных книжках, то есть в документации по Конфигуратору (2 тома) и по языку (тоже 2 тома).
Нигде :). Я просто хотел сказать, что элемент управления ВыбНоменклатура не должен быть пустым, то есть должен содержать ссылку на конкретную группу справочника "Номенклатура". Некоторые думают, что если он будет пустым, отбор по номенклатуре работать не будет, и они получат весь справочник. А на самом деле будут только элементы, у которых пустой родитель, то есть те, которые находятся в корне справочника. Часто таких не бывает - и на выходе запроса пусто.
А вообще "в лучших домах" пишут так:
Обратите внимание, что в условиях точка с запятой стоит 2 раза до и после кавычки. Первый раз она относится к тексту запроса, а второй - к программе 1С.
Также рекомендую разбивать запрос на строчки, то есть писать НЕ
а
или
Так будет легче прочесть при отладке текст запроса, который сгенерировала программа, и не будет проблем, если решите закомментировать какую-то строчку в тексте запроса.
Кстати, если будете смотреть текст ВНЕ отладчика, делайте через Предупреждение(), а не через Сообщить(). Не забудьте только убрать :))), а то пользователи будут недовольны.
Мой вариант, работает.
Значит, не страшно.
Делал его без конструктора, сомневался просто, что грамотно его сделал.
Просто обычно со словом "Группировка" пишут КОГДА НАДО или "Без Групп" или "Упорядочить По". А когда не надо - ничего не пишут.
Подскажите, где про запросы и конструктор в 7.7 почитать.
В ЖКК - жёлто-красных книжках, то есть в документации по Конфигуратору (2 тома) и по языку (тоже 2 тома).
А где написать ВыбНоменклатура.Выбран()=1?
Нигде :). Я просто хотел сказать, что элемент управления ВыбНоменклатура не должен быть пустым, то есть должен содержать ссылку на конкретную группу справочника "Номенклатура". Некоторые думают, что если он будет пустым, отбор по номенклатуре работать не будет, и они получат весь справочник. А на самом деле будут только элементы, у которых пустой родитель, то есть те, которые находятся в корне справочника. Часто таких не бывает - и на выходе запроса пусто.
А вообще "в лучших домах" пишут так:
Если ВыбНоменклатура.Выбран()=1 Тогда
//
Если ВыбНоменклатура.ЭтоГруппа()=1 Тогда
ТекстЗапроса=ТекстЗапроса+"
|Условие (Спр В ВыбНоменклатура);";
Иначе
ТекстЗапроса=ТекстЗапроса+"
|Условие (Спр = ВыбНоменклатура);";
КонецЕсли;
КонецЕсли;
ПоказатьОбратите внимание, что в условиях точка с запятой стоит 2 раза до и после кавычки. Первый раз она относится к тексту запроса, а второй - к программе 1С.
Также рекомендую разбивать запрос на строчки, то есть писать НЕ
ТекстЗапроса=ТекстЗапроса+"Условие (Спр В ВыбНоменклатура);";
а
ТекстЗапроса=ТекстЗапроса+"
|Условие (Спр В ВыбНоменклатура);";
или
ТекстЗапроса=ТекстЗапроса+РазделительСтрок+"Условие (Спр В ВыбНоменклатура);";
Так будет легче прочесть при отладке текст запроса, который сгенерировала программа, и не будет проблем, если решите закомментировать какую-то строчку в тексте запроса.
Кстати, если будете смотреть текст ВНЕ отладчика, делайте через Предупреждение(), а не через Сообщить(). Не забудьте только убрать :))), а то пользователи будут недовольны.
Кстати, если не нужно группировать, и данные хранятся в виде DBF, то будет быстрее через цикл с ВыбратьЭлемент()/ПолучитьЭлемент(). Так как:
1) С запросом у Вас будет 2 прохода по базе, а так один. (Правда, второй может быть меньше, если в запросе стоит "мощное" условие)
2) Можно будет использовать индекс в БД через свойство "Сортировка" у реквизита. Запрос по справочникам индексы НЕ использует.
1) С запросом у Вас будет 2 прохода по базе, а так один. (Правда, второй может быть меньше, если в запросе стоит "мощное" условие)
2) Можно будет использовать индекс в БД через свойство "Сортировка" у реквизита. Запрос по справочникам индексы НЕ использует.
Кстати, в запросе можно фильтровать по списку значений, в том числе в виде органа управления в форме. В этом списке могут быть и элементы и группы в любом сочетании. Тут уж "В" работает в обоих случаях. Если элемент списка - элемент справочника, то 1С автоматически проверяет на равенство, а если группа - на вхождение. То есть можно писать
Для отчетов можно написать:
Естественно, в таблице отчёта должна быть переменная "ЗаголовокПоНоменклатуре", которая будет показывать пользователю, есть ли у него отбор по номенклатуре и какой.
Лично мне лень переключать алфавит для печать знака ">", поэтому я пишу наоборот:
К тому же это в стиле кого-то из корифеев программирования - чтобы не запутаться, делать первую ветку условия короче или заменять вторую по обстоятельствам на "Продолжить", "Прервать" или "Возврат".
Если ВыбНоменклатура.РазмерСписка()>0 Тогда
ТекстЗапроса=ТекстЗапроса+"
|Условие (Спр В ВыбНоменклатура);";
КонецЕсли;
Для отчетов можно написать:
Если ВыбНоменклатура.РазмерСписка()>0 Тогда
ЗаголовокПоНоменклатуре ="По всей номенклатуре";
ТекстЗапроса=ТекстЗапроса+"
|Условие (Спр В ВыбНоменклатура);";
Иначе
ЗаголовокПоНоменклатуре ="По номенклатуре из списка: " + ВыбНоменклатура.ВСтрокуСРазделителями();
КонецЕсли;
ПоказатьЕстественно, в таблице отчёта должна быть переменная "ЗаголовокПоНоменклатуре", которая будет показывать пользователю, есть ли у него отбор по номенклатуре и какой.
Лично мне лень переключать алфавит для печать знака ">", поэтому я пишу наоборот:
Если ВыбНоменклатура.РазмерСписка()=0 Тогда
ЗаголовокПоНоменклатуре ="По номенклатуре из списка: " + ВыбНоменклатура.ВСтрокуСРазделителями();
Иначе
ЗаголовокПоНоменклатуре ="По всей номенклатуре";
ТекстЗапроса=ТекстЗапроса+"
|Условие (Спр В ВыбНоменклатура);";
КонецЕсли;
ПоказатьК тому же это в стиле кого-то из корифеев программирования - чтобы не запутаться, делать первую ветку условия короче или заменять вторую по обстоятельствам на "Продолжить", "Прервать" или "Возврат".
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот