Тип: ВыраженияСхемыЗапроса. Содержит выражения схемы запроса для группировки. Соответствует выражению СГРУППИРОВАТЬ ПО языка запросов.
Полное описание, параметры и ограничения
ОператорВыбратьСхемыЗапроса.Группировка (QuerySchemaSelectOperator.Group)
ОператорВыбратьСхемыЗапроса (QuerySchemaSelectOperator)
Группировка (Group)
Доступен, начиная с версии 8.3.5.
Использование:
Только чтение.
Описание:
Тип: ВыраженияСхемыЗапроса.
Содержит выражения схемы запроса для группировки.
Соответствует выражению СГРУППИРОВАТЬ ПО языка запросов.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.5.
Методическая информация
Практические примеры
Пересоздать группировку и получить пять книг
Разбираем групповое выражение Название и пересоздаём его в собственной схеме. После восстановления правильной структуры выполняем суммирование двух строк.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ Книги.Название КАК Название, СУММА(Книги.Количество) КАК Количество
|ИЗ (ВЫБРАТЬ ""Книга"" КАК Название, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Книга"", 2) КАК Книги
|ГДЕ Книги.Количество > 1
|СГРУППИРОВАТЬ ПО Книги.Название");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один свой запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Ожидалась своя выборка";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один внешний оператор своего запроса";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Группировка = Оператор.Группировка;
Если Группировка.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна собственная группировка";
КонецЕсли;
ПолеНазвания = Группировка.Найти("Книги.Название");
Если ПолеНазвания = Неопределено Тогда
ВызватьИсключение "Не найдено своё выражение группировки";
КонецЕсли;
Сообщить(Группировка.Индекс(ПолеНазвания) = 0);
Сообщить(Не Группировка.Получить(0).СодержитАгрегатнуюФункцию());
Группировка.Установить(0, Новый ВыражениеСхемыЗапроса("Книги.Название"));
Группировка.Удалить(0);
Сообщить(Группировка.Количество() = 0);
НовоеПоле = Группировка.Добавить(Новый ВыражениеСхемыЗапроса("Книги.Название"));
Если НовоеПоле = Неопределено Тогда
ВызватьИсключение "Не восстановлена собственная группировка";
КонецЕсли;
Сообщить(Группировка.Количество() = 1);
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Итог = Запрос.Выполнить().Выгрузить();
Если Итог.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна группа собственных книг";
КонецЕсли;
Сообщить(Итог[0].Название = "Книга" И Итог[0].Количество = 5);
Группировка.Очистить();
Сообщить(Группировка.Количество() = 0);Разбор по шагам
Находим выражение группировки и проверяем отсутствие Неопределено.
Группировка содержит поле Книги.Название без агрегатной функции. СУММА(Количество) находится в выбираемых полях, не в группировке.
Замена и удаление происходят только в своей схеме. Пока группировка отсутствует, запрос с названием и суммой не выполняем.
Добавляем корректное выражение заново, проверяем количество и выполняем запрос: две строки книги объединяются в одну группу с суммой 5.
Итоговую очистку делаем после выполнения и не пытаемся повторно выполнить временно некорректную структуру.
Как проверить результат
Шесть сравнений Истина.
Итог содержит одну строку Книга с количеством 5; запрос во время отсутствия группировки не выполняется.
Ожидаемый результат
Показана связь неагрегатной группировки и агрегатного результата.
На что обратить внимание
Не удаляйте группировку из рабочей схемы, не проверив выбираемые неагрегатные поля.
Объекты удалённых или заменённых выражений больше не используются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Убрать повторы изменением вида объединения
Два оператора выбирают одинаковые числа. ОБЪЕДИНИТЬ ВСЕ даёт две строки, после изменения объединения ожидаем одну. Это не изменение данных базы.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, 250");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный объединённый запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Ожидался собственный запрос выбора";
КонецЕсли;
Операторы = Выбор.Операторы;
Если Операторы.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались два собственных оператора";
КонецЕсли;
Первый = Операторы.Получить(0);
Второй = Операторы.Получить(1);
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
До = Запрос.Выполнить().Выгрузить();
Сообщить(До.Количество() = 2);
Первый.ВыбиратьДляИзменения = Ложь;
Первый.КоличествоПолучаемыхЗаписей = 1;
Сообщить(Первый.КоличествоПолучаемыхЗаписей = 1);
Первый.КоличествоПолучаемыхЗаписей = Неопределено;
Сообщить(Первый.КоличествоПолучаемыхЗаписей = Неопределено);
Сообщить(Не Первый.ВыбиратьДляИзменения И Не Первый.ВыбиратьРазличные);
Сообщить(Первый.Источники.Количество() = 0);
Сообщить(Первый.Группировка.Количество() = 0 И Первый.Отбор.Количество() = 0);
Сообщить(Первый.ТаблицыДляИзменения.Количество() = 0);
Сообщить(Первый.ВыраженияОтбораКомпоновкиДанных.Количество() = 0);
Второй.ТипОбъединения = ТипОбъединенияСхемыЗапроса.Объединить;
Сообщить(Второй.ТипОбъединения = ТипОбъединенияСхемыЗапроса.Объединить);
Запрос.Текст = Схема.ПолучитьТекстЗапроса();
После = Запрос.Выполнить().Выгрузить();
Если После.Количество() <> 1 Тогда
ВызватьИсключение "Повторы собственных строк не устранены";
КонецЕсли;
Сообщить(После[0].Количество = 3 И После[0].Цена = 250);Разбор по шагам
Сначала выполняем исходный текст и проверяем две строки с одинаковыми собственными значениями.
ПЕРВЫЕ задаётся КоличествоПолучаемыхЗаписей; Неопределено снимает ограничение. Здесь каждая выборка и так создаёт одну строку.
ВыбиратьРазличные соответствует РАЗЛИЧНЫЕ внутри оператора и readonly по API. Его не присваиваем и не путаем с видом объединения операторов.
Пустые источники, группировка и отбор объясняются запросом констант. ТаблицыДляИзменения пусты: блокировка данных не запрашивается.
Меняем ТипОбъединения второго оператора на Объединить, заново формируем текст и выполняем его.
Результат проверяем по одной реальной строке 3/250. Исходные строки не удалены из базы: они созданы только выражениями запроса.
Как проверить результат
Десять сравнений Истина.
После изменения одна строка 3/250 вместо двух; никаких рабочих таблиц или изменений записей нет.
Ожидаемый результат
Показана практическая разница между сохранением и удалением повторов в объединении.
На что обратить внимание
При разных значениях строк Объединить не сводит результат к одной строке.
ВыбиратьДляИзменения относится к блокировкам, а не к обновлению чисел автоматически.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.