Группировка
Получить следующее значение выборки запроса на заданном уровне группировки.
Синтаксис:
Группировка(<Группировка>, <Направление>)
Англоязычный синоним:
Group
Параметры:
<Группировка>
|
| Выражение, содержащее порядковый номер или имя группировки.
|
|
<Направление>
|
| Необязательный параметр. Числовое выражение:
1 — выборка значений группировки по возрастанию;
-1 (минус единица) — выборка значений группировки по убыванию.
Значение по умолчанию: 1.
|
|
Возвращаемое значение:
Число: 1 — если получено следующее значение выборки запроса, 0 — если нет.
Описание:
Метод Группировка служит для организации цикла получения данных из выборки, сформированной в результате работы метода Выполнить. Метод Группировка позиционирует в выборке очередную строку в порядке, определенном параметром <Группировка>. Нельзя использовать метод Группировка, задавая в качестве параметра младшие группировки, не использовав предварительно этот метод для позиционирования по старшим группировкам. Старшинство группировок определяется порядком их следования в тексте запроса.
Замечание: Обход группировок по многоуровневым справочникам в порядке убывания не выполняется.
Пример:
Процедура Сформировать()
Перем Запрос, ТекстЗапроса;
Если (Число(ДатаНач) = 0) ИЛИ (Число(ДатаКон) = 0) Тогда
Предупреждение("Не задан период!");
Возврат;
КонецЕсли;
//Создание объекта типа "Запрос" Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|с ДатаНач по ДатаКон;
|Рез = ЖурналРасчетов.Зарплата.Результат;
|Сотр = ЖурналРасчетов.Зарплата.Объект;
|Группировка Сотр без групп;
|Группировка ПериодЖурнала;
|Функция Сум = Сумма(Рез);
|"//}}ЗАПРОС
;
Если Сотрудник.Выбран() = 1 Тогда
ТекстЗапроса = ТекстЗапроса + "Условие(Сотр = Сотрудник);";
КонецЕсли;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапр) = 0 Тогда
Возврат;
КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
// сначала используем группировку по сотрудникам
// а потом группировку по периоду журнала!!!
Пока Запрос.Группировка("Сотр") = 1 Цикл
// Заполнение полей Сотр
Таб.ВывестиСекцию("Сотр<");
Пока Запрос.Группировка("ПериодЖурнала") = 1 Цикл
// Заполнение полей ПериодЖурнала
Таб.ВывестиСекцию("Мес");
КонецЦикла;
Таб.ВывестиСекцию("Сотр>");
КонецЦикла;
// Вывод заполненной формы
// Заполнение полей "Итого"
Таб.Опции(0, 0, 0, 0);
Таб.ТолькоПросмотр(1);
Таб.Показать("Результат", );
КонецПроцедуры
Описание:
Оператор Группировка задает способ группировки информации и порядок ее упорядочивания в запросе.
Предопределенные группировки могут быть следующими:
Предопределенн. Группировка
|
Англояз.
Синоним
|
Выполняемое действие
|
Документ
|
Document
|
Позволяет детализацию до каждого документа.
|
СтрокаДокумента
|
DocumentLine
|
Позволяет детализацию до каждой строки табличной части каждого документа.
|
День
Неделя
Месяц
Квартал
Год
|
Day
Week
Month
Quarter
Year
|
Группировки по дате, дают возможность накапливать значения по документам за конкретный период (на каждый день, неделю, месяц и т. д.). В запросе может присутствовать несколько группировок такого типа.
|
Замечание: В программном модуле, где используется запрос, имя <ИмяГруппировки> (или <ПредопредГруппировка>) будет являться атрибутом запроса. Кроме того, это имя используется в качестве параметра метода запросов Группировка (см. главу «Работа с Запросами»).
Объекты, по которым запрос будет обрабатывать информацию и те значения которые он будет выбирать, упорядочивать и группировать во временном наборе данных, полностью определяются той внутренней переменной, на базе которой объявлена группировка (подробнее см. выше в разделе «Объявление внутренней переменной»).
Несколько операторов Группировка, следующих друг за другом в описании запроса, создают вложенные группировки запроса. Первая группировка — самая старшая, в нее будет вложена следующая группировка, далее будет вложена следующая и т. д. По смыслу, вложенная группировка осуществляет более детальный просмотр объекта внешней группировки. Например, если во внешней группировке мы просматриваем регистр, то во вложенной группировке можно просмотреть документы движений этого регистра, а далее можно сформировать группировку по номерам строк этих документов.
При описании вложенных группировок разработчик конфигурации должен ясно себе представлять суть и смысл образования вложенных группировок в формируемом запросе, поскольку интерпретация полученных результатов выполнения запроса полностью зависит от контекста решаемой задачи.
По умолчанию, документы упорядочиваются в группировке по дате и времени документов, элементы справочников — в зависимости от основного представления, заданного при описании справочника в конфигураторе (код или наименование). Однако критерий упорядочивания в группировке можно установить при помощи необязательного ключевого слова "Упорядочить по". Параметры, следующие за данным ключевым словом, определяют упорядочивание строк в группировке.
С параметром упорядочивания связан специальный метод для доступа к значениям объекта «Запрос». Речь идет об использовании метода ЗначениеУпорядочивания. В программном модуле, после того как запрос уже сформирован, мы можем при помощи этого метода получить значение поля упорядочивания из временного набора данных, не обращаясь к базе данных. Например, если у нас в запросе была группировка "Товар", а нам для формирования некоторого отчета нужны значения наименований товаров, то эти наименования товаров можно получить двумя способами:
Наим = Запрос.Товар.Наименование;
или
Наим = 3апрос.ЗначениеУпорядочивания("Товар", 1);
Смысл использования данного специального метода доступа в том, что значения упорядочивания хранятся во временном наборе данных, сформированном запросом, поэтому за этими значениями программе нет необходимости снова обращаться к информационной базе, а можно получить непосредственно из временного набора. Эффект использования специального метода доступа может проявиться только в сетевой версии информационной базы при формировании очень больших отчетов, время формирования которых порядка десятков минут. В этом случае применение этого метода доступа даст некоторый выигрыш по времени.
Пример:
Процедура Группировки()
Перем Запрос, ТекстЗапроса;
Перем ДатаНач, ДатаКон;
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
Нач = ЖР.НачалоТекущегоПериода();
Кон = ЖР.КонецТекущегоПериода();
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Группировки)
|Период с ДатаНач по ДатаКон;
|Рез = ЖурналРасчетов.Зарплата.Результат;
|Расч = ЖурналРасчетов.Зарплата.ВидРасч;
|Дни = ЖурналРасчетов.Зарплата.Дни;
|Сотр = ЖурналРасчетов.Зарплата.Объект;
|Группировка Сотр без групп;
|Группировка Расч;
|Функция Сум = Сумма(Рез);
|Функция Дней = Сумма(Дни);
|Условие(Рез о 0);
|"//})ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Пока Запрос.Группировка("Сотр") = 1 Цикл
// Заполнение полей Сотр
Таб.ВывестиСекцию("Сотр ");
Пока Запрос.Группировка("Расч") = 1 Цикл
// Заполнение полей
Расч Таб.ВывестиСекцию("Расч");
КонецЦикла;
КонецЦикла;
Таб.Опции(0, 0, 0, 0);
Таб.ТолькоПросмотр(1);
Таб.Показать("Результат", );
// Вывод заполненной формы
КонецПроцедуры
Содержание раздела