Пересоздать группировку и получить пять книг

Учебные задачи

Разбираем групповое выражение Название и пересоздаём его в собственной схеме. После восстановления правильной структуры выполняем суммирование двух строк.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.

  2. СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.

  3. Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.

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

Разбор по шагам

  1. Находим выражение группировки и проверяем отсутствие Неопределено.

  2. Группировка содержит поле Книги.Название без агрегатной функции. СУММА(Количество) находится в выбираемых полях, не в группировке.

  3. Замена и удаление происходят только в своей схеме. Пока группировка отсутствует, запрос с названием и суммой не выполняем.

  4. Добавляем корректное выражение заново, проверяем количество и выполняем запрос: две строки книги объединяются в одну группу с суммой 5.

  5. Итоговую очистку делаем после выполнения и не пытаемся повторно выполнить временно некорректную структуру.

Как проверить результат

  1. Шесть сравнений Истина.

  2. Итог содержит одну строку Книга с количеством 5; запрос во время отсутствия группировки не выполняется.

Ожидаемый результат

Показана связь неагрегатной группировки и агрегатного результата.

На что обратить внимание

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

  2. Объекты удалённых или заменённых выражений больше не используются.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.