Более продвинутая работа со схемой запросов
Решил воспользоваться схемой запроса, чтобы опционально убирать группировки в запросе, текст которого было бы неудобно модифицировать операциями замены поисковых строк:
ВЫБРАТЬ
Блюда.ПриемПищи КАК ПриемПищи,
КоличествоБлюд.Подразделение КАК Подразделение,
СУММА(КоличествоБлюд.Количество) КАК Количество,
Блюда.Блюдо КАК Блюдо,
Блюда.Выход КАК Выход,
КоличествоБлюд.Рацион КАК Рацион
ИЗ
...
СГРУППИРОВАТЬ ПО
Блюда.ПриемПищи,
КоличествоБлюд.Подразделение,
Блюда.Блюдо,
Блюда.Выход,
КоличествоБлюд.Рацион
УПОРЯДОЧИТЬ ПО
Блюда.ПриемПищи.Код,
Подразделение,
Блюдо
ИТОГИ ПО
ПриемПищи,
Подразделение,
Рацион
Мне нужно было в зависимости от флажков подменять значения подразделения, рациона и приема пищи на пустые значения.
Код пришлось писать дольше, чем ожидал, в итоге он получился таким:
//Разбираем запрос СхемаЗапроса = Новый СхемаЗапроса; //https://infostart.ru/1c/articles/307045/ СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст); //ИтогиЗапроса = СхемаЗапроса.ПакетЗапросов[0].КонтрольныеТочкиИтогов; ОператорыЗапроса = СхемаЗапроса.ПакетЗапросов[0].Операторы[0]; ПорядокЗапроса = СхемаЗапроса.ПакетЗапросов[0].Порядок; //Тут наши команды модификации запроса КолонкиКУдалению = Новый Массив(); Если СЗ_УбратьПодразделения Тогда КолонкиКУдалению.Добавить("КоличествоБлюд.Подразделение"); //Подразделение КонецЕсли; Если СЗ_УбратьПриемыПищи Тогда КолонкиКУдалению.Добавить("Блюда.ПриемПищи"); //Прием пищи КолонкиКУдалению.Добавить("Блюда.ПриемПищи.Код"); //Из упорядочивания КонецЕсли; Если СЗ_УбратьРационы Тогда КолонкиКУдалению.Добавить("КоличествоБлюд.Рацион"); //Рацион КонецЕсли; //Удаляем лишние операторы и группировки СЗ_УдалитьВыражения(ОператорыЗапроса.Группировки[0], КолонкиКУдалению); СЗ_ЗаменитьВыражения(ОператорыЗапроса.ВыбираемыеПоля, КолонкиКУдалению); СЗ_УдалитьВыраженияПорядка(ПорядокЗапроса, КолонкиКУдалению); Процедура СЗ_ЗаменитьВыражения(Коллекция, КолонкиКУдалению); Индекс = 0; Для Каждого Выражение ИЗ Коллекция Цикл ИмяКолонки = Строка(Выражение); Если КолонкиКУдалению.Найти(ИмяКолонки) <> Неопределено Тогда НовоеВыражение = Новый ВыражениеСхемыЗапроса("Неопределено"); Коллекция.Установить(Индекс, НовоеВыражение); КонецЕсли; Индекс = Индекс + 1; КонецЦикла; КонецПроцедуры Процедура СЗ_УдалитьВыражения(Коллекция, КолонкиКУдалению); Всего = Коллекция.Количество(); Для Сч = 1 По Всего Цикл Индекс = Всего - Сч; Выражение = Строка(Коллекция.Получить(Индекс)); Если КолонкиКУдалению.Найти(Выражение) <> Неопределено Тогда Коллекция.Удалить(Индекс); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура СЗ_УдалитьВыраженияПорядка(Коллекция, КолонкиКУдалению); Всего = Коллекция.Количество(); Для Сч = 1 По Всего Цикл Индекс = Всего - Сч; Зн = Коллекция.Получить(Индекс).Элемент; Если ТипЗнч(Зн) = Тип("КолонкаСхемыЗапроса") Тогда Выражение = Зн.Псевдоним; ИначеЕсли ТипЗнч(Зн) = Тип("ВыражениеСхемыЗапроса") Тогда Выражение = Строка(Зн); Иначе Продолжить; КонецЕсли; Если КолонкиКУдалению.Найти(Выражение) <> Неопределено Тогда Коллекция.Удалить(Индекс); КонецЕсли; КонецЦикла; КонецПроцедуры
С итогами запроса можно разбираться аналогичным образом.
Научился преобразовывать выражение схемы запроса в строку.
Столкнулся с тем, что элементы порядка могут содержать как колонки, так и выражения схемы запроса.
По группировкам вскрылось два интересных момента:
- Нельзя присвоить группировке выражение «Неопределено» или другое простое выражение.
- Если в полях присутствует поле, то даже если удалить это поле из группировки, оно добавляется в группировку автоматом. Я пытался только убрать группировку по подразделению, не убирая из полей — не работает, восстанавливает группировку.
Я уже ранее пробовал пользоваться схемами запроса. В этот раз попробовал на более продвинутом уровне, пользовался статьей на инфостарте: «Объектная модель запроса «Схема запроса» — теория и примеры использования«.




В УТ есть ОМ «СхемыЗапросов» — может там что-то полезное можно подсмотреть?
Возможно, да. Спасибо за наводку.