Вопрос
Обход запроса по группировкам, как собираются данные в запросе с конструкцией ИТОГИ ПО. Предположим, требуется организовать цикл, в котором должен формироваться массив заказов, в разрезе Контрагентов и Адреса доставки. Как это сделать?
Ответ
Пишем запрос:
Запрос. Текст = "ВЫБРАТЬ | усЗаказНаОтгрузку.Ссылка КАК Ссылка, | усСтатусДокументов.Статус КАК Статус, | усЗаказНаОтгрузку.Контрагент КАК Контрагент, // Адрес доставки заключаем в "ВЫРАЗИТЬ", т.к. в метаданных Адрес Доставки - строка неограниченной длины и если ее не преобразовать в строку ограниченной длины, //то ее будет невозможно использовать в конструкции "ИТОГИ ПО" // и мы получим сообщение об ошибке вида "Недопустимое поле для группировки " | ВЫРАЗИТЬ(усЗаказНаОтгрузку.АдресДоставки КАК СТРОКА(350)) КАК АдресДоставки |ИЗ | РегистрСведений.усСтатусДокументов КАК усСтатусДокументов | ЛЕВОЕ СОЕДИНЕНИЕ Документ.усЗаказНаОтгрузку КАК усЗаказНаОтгрузку | ПО усСтатусДокументов.Документ = усЗаказНаОтгрузку.Ссылка |ГДЕ | усЗаказНаОтгрузку.Проведен | |УПОРЯДОЧИТЬ ПО | усСтатусДокументов.Статус.Порядок |ИТОГИ ПО | Контрагент, | АдресДоставки" ;
Результатом этого запроса будет набор данных примерно такого вида:
Контрагент 1
- АдресДоставки1
Контрагент 1
- АдресДоставки2
Контрагент2
- АдресДоставки3
Теперь нам нужно получить три массива:
— заказ 1, заказ 2, заказ 3
— заказ 4, заказ 5
— заказ 6
Для получения этих массивов требуется организовать обход приведенного выше запроса «По группировкам с иерархией»:
СпособВыборки = ОбходРезультатаЗапроса. ПоГруппировкамСИерархией; Результат = Запрос. Выполнить () ; ВыборкаПервогоУровня = Результат. Выбрать(СпособВыборки) ; Пока ВыборкаПервогоУровня. Следующий() Цикл ВыборкаВторогоУровня = ВыборкаПервогоУровня. Выбрать(СпособВыборки) ; мсвЗаказов. Очистить() ; // очистили перед добавлением первого в список Пока ВыборкаВторогоУровня. Следующий() Цикл // внутри каждого уровня иерархии заказы упорядочены: "Создан", "В работу", "Ведутся работы", "Готов к отгрузке" (именно в таком порядке, порядок установлен в перечислении) ВыборкаТретьегоУровня = ВыборкаВторогоУровня. Выбрать(ОбходРезультатаЗапроса. Прямой) ; // параметр можно не передавать, по умолчанию способ выборки прямой Пока ВыборкаТретьегоУровня. Следующий() Цикл // внутри каждого уровня иерархии заказы упорядочены: "Создан", "В работу", "Ведутся работы", "Готов к отгрузке" (именно в таком порядке, порядок установлен в перечислении) мсвЗаказов. Добавить(ВыборкаТретьегоУровня. Ссылка) ; КонецЦикла ; СформироватьОтборПоЗаказу(мсвЗаказов) ; // тут мы по очереди получим в цикле требуемые массивы: [заказ 1, заказ 2, заказ 3], затем [заказ 4, заказ 5] и [заказ 6] КонецЦикла ; КонецЦикла ;
Примечание. Конструкция «УПОРЯДОЧИТЬ ПО усСтатусДокументов.Статус.Порядок» будет срабатывать внутри каждого массива, т.е. заказы будут упорядочены по статусу в каждом из полученных массивов.
Справка по расчету итогов запроса из описания в справке Конфигуратора
Расчет итогов запроса
Предложение ИТОГИ позволяет определить, расчет каких итогов необходим в запросе. При расчете итогов вычисляются значения агрегатных функций по выборкам с одинаковыми значениями полей – контрольных точек. Итоги добавляются в результат запроса как итоговые строки.
Порядок расчета итогов запроса описывается в соответствии со следующими правилами:
<Описание итогов>
<Итоги> [<Список агрегатных функций>]
<Итоги>
ИТОГИ [<Список итоговых_полей>] ПО [ОБЩИЕ] <Список контрольных точек>
<Список итоговых_полей>
<Итоговое_поле> [,<Список_итоговых_полей> [, …]]
<Итоговое_поле>
<Агрегатная_функция> | <Выражение> [[КАК] <Псевдоним_поля>]
<Список контрольных точек>
<Контрольная точка> [, <Контрольная точка> [, …]]
<Контрольная точка>
<Выражение> [[ТОЛЬКО] ИЕРАРХИЯ] | [ПЕРИОДАМИ(Секунда | Минута | Час | День | Неделя | Месяц | Квартал | Год | Декада | Полугодие
[,<Литерал типа DATE> | <Идентификатор параметра>]
[,<Литерал типа DATE> | <Идентификатор параметра>])] [[КАК] Псевдоним поля]
Описание итогов начинается с обязательного ключевого слова ИТОГИ.
<Список агрегатных функций> содержит перечень агрегатных функций, которые необходимо рассчитывать в итогах. Агрегатные функции рассматриваются в .
Помимо общих итогов, можно задать расчет итогов по контрольным точкам. Для этого после обязательного ключевого слова ПО необходимо указать <Список контрольных точек>. Каждая <Контрольная точка> содержит <Выражение>, вычисляемое при выполнении запроса. По каждой комбинации значений этих выражений будут рассчитаны и добавлены в результат запроса итоговые строки.
Если контрольная точка является полем — субконто регистра бухгалтерии, то при получении итогов по этой контрольной точке будут игнорироваться значения NULL.
Агрегатные функции языка запросов
В языке запросов предусмотрены агрегатные функции, которые используются при группировке результатов запроса и при подсчете итогов. Агрегатные функции предназначены для обобщения значений указанного параметра. Определены следующие агрегатные функции:
<Агрегатная функция>
СУММА (<Выражение>) |
СРЕДНЕЕ (<Выражение>) |
МИНИМУМ (<Выражение>) |
МАКСИМУМ (<Выражение>) |
КОЛИЧЕСТВО ([РАЗЛИЧНЫЕ] <Выражение> | *)
Пример:
Выбрать
Накладная.Номенклатура.Наименование,
Сумма (Накладная.Сумма) Как Сумма,
Среднее (Накладная.Сумма) Как Среднее,
Максимум (Накладная.Сумма) Как Максимум,
Минимум (Накладная.Сумма) Как Минимум,
Количество (Накладная.Сумма) Как КоличИз
Сгруппировать По
Накладная.НоменклатураИтоги Общие
Результат запроса:
Наименование Сумма Среднее Максимум Минимум Колич 265 955,45 12 511,12 40 000,23 555 8 Брюки детские 28 500,22 9 500,07 15 000 3 000 3 Рубашка «Ковбойка» 24 000 8 000 16 000 4 000 3 Джинсы женские 63 555 6 355,5 30 000 555 10 Свитер детский 6 400 6 400 6 400 6 400 1 Раковина «Лилия» 60 000,23 30 000,115 40 000,23 20 000 2 Мойдодыр «Аквариум» 65 500 21 833,33 40 000 8 000 3 Смеситель «Ультра» 15 000 15 000 15 000 15 000 1 Кухонный комбайн Крупс 3 000 3 000 3 000 3 000 1
Агрегатные функции могут использоваться в списке полей выборки, предложениях ИМЕЮЩИЕ, ИТОГИ, УПОРЯДОЧИТЬ ПО.
Агрегатная функция СУММА
Функция вычисляет арифметическую сумму всех попавших в выборку значений поля.
В качестве параметра функции можно указывать только поля, содержащие числовое значение.
Если поле не может содержать числовых значений, то применение функции СУММА к такому полю вызовет ошибку. Если поле может содержать числовые значения (имеет составной тип данных), то данная функция может быть применена к такому полю. Но если среди значений поля в выборке встретится нечисловое значение (помимо значений NULL), это вызовет ошибку.
Агрегатная функция СРЕДНЕЕ
Функция вычисляет среднее значение всех попавших в выборку значений поля.
В качестве параметра функции можно указывать только ссылки на поля, содержащие числовое значение.
Если поле не может содержать числовых значений, то применение функции СРЕДНЕЕ к такому полю вызовет ошибку. Если поле может содержать числовые значения (имеет составной тип данных), то данная функция может быть применена к такому полю. Но если среди значений поля в выборке встретится нечисловое значение (помимо значений NULL), это вызовет ошибку.
Агрегатная функция МИНИМУМ
Функция вычисляет минимальное значение из всех попавших в выборку значений поля.
При определении минимального значения применяются правила сравнения значений, описанные в .
Агрегатная функция МАКСИМУМ
Функция вычисляет максимальное значение из всех попавших в выборку значений поля.
В качестве параметра функции можно указывать ссылки на поля, содержащие значения любого типа.
При определении максимального значения применяются правила сравнения значений, описанные в .
Агрегатная функция КОЛИЧЕСТВО
Функция подсчитывает количество значений параметра, попавших в выборку. В отличие от других агрегатных функций функция КОЛИЧЕСТВО допускает три способа использования.
- Во-первых, функция позволяет подсчитать количество значений указанного поля, не равных NULL.
- Во-вторых, функция позволяет подсчитать количество различных значений указанного поля, не равных NULL. Для этого перед спецификацией поля надо указать ключевое слово РАЗЛИЧНЫЕ.
- В-третьих, функция позволяет подсчитать количество строк в результате запроса. Для этого в качестве параметра функции надо указать звездочку «*».
В качестве параметра функции можно указывать ссылки на поля, содержащие значения любого типа.
Пример:
ВЫБРАТЬ
Количество (*) Как Всего,
Количество (Различные Накладная.Номенклатура) Как РазныеИз
Документ.РасходнаяНакладная.Состав Как Накладная
Результат запроса:
Всего Разные 24 8
Расчет общих итогов
Для расчета итогов по всей таблице в предложении ИТОГИ следует указать слово ОБЩИЕ. В этом случае будут вычислены значения агрегатных функций для всех записей таблицы.
Пример:
ИТОГИ СУММА(Количество) По ОБЩИЕ
Результат запроса:
Товар Количество Номер Получатель 238 Кран 10 РНк-1 Урюпинскторг Кран 8 РНк-3 Маг. «Хозяин» Кран 44 РНк-4 Маг. «Гигант» Кран 22 РНк-5 Урюпинскторг Вантус 5 РНк-1 Урюпинскторг Вантус 1 РНк-3 Маг. «Хозяин» Вантус 14 РНк-4 Маг. «Гигант» Стол 1 РНк-1 Урюпинскторг Стол 15 РНк-2 Маг. «Мебель» Стол 10 РНк-4 Маг. «Гигант» Стул 55 РНк-2 Маг. «Мебель» Стул 5 РНк-3 Маг. «Хозяин» Стул 32 РНк-4 Маг. «Гигант» Стул 16 РНк-5 Урюпинскторг
Логические выражения в языке запросов
В языке запросов в операциях выбора и в условиях отборов используются логические выражения:
<Логическое выражение>
<Выражение> |
<Выражение> <Операция сравнения> <Выражение> |
<Выражение> [НЕ] В [ИЕРАРХИИ] (<Список значений> | <Массив значений>) |
<Выражение> [НЕ] В [ИЕРАРХИИ] (<Описание запроса>) |
<Выражение> [НЕ] МЕЖДУ <Выражение> И <Выражение> |
<Выражение> ЕСТЬ [НЕ] NULL |
<Выражение> ССЫЛКА <Имя таблицы> |
<Выражение> [НЕ] ПОДОБНО <Литерал типа СТРОКА>
[СПЕЦСИМВОЛ <Литерал типа СТРОКА>]
<Операция сравнения>
> | < | = | >= | <= | <>
<Список значений>
<Выражение>[, <Выражение> [, …]]
Логическим выражением может быть:
При сравнении значений используются правила сравнения значений, описанные ниже.
Правила сравнения значений
Поскольку в языке запросов могут сравниваться значения разных типов, определены правила, по которым выполняется сравнение двух значений. Данные правила используются для:
- сравнения значений в операторах сравнения;
- определения максимального и минимального значений в агрегатных функциях МИНИМУМ и МАКСИМУМ;
- упорядочивания записей результата запроса в соответствии с порядком, заданным в предложении УПОРЯДОЧИТЬ ПО.
Если типы значений отличаются друг от друга, то отношения между значениями определяются на основании приоритета типов:
- тип NULL (самый низший);
- тип Булево;
- тип Число;
- тип Дата;
- тип Строка;
- ссылочные типы.
Отношения между различными ссылочными типами определяются на основе внутренних ссылочных номеров таблиц, соответствующих тому или иному типу.
Если типы данных совпадают, то производится сравнение значений по следующим правилам:
- у типа Булево значение ИСТИНА больше значения ЛОЖЬ;
- у типа Число обычные правила сравнения для чисел;
- у типа Дата более ранние даты меньше более поздних;
- у типа Строка сравнения производится в соответствии с установленными национальными особенностями базы данных без учета концевых пробелов;
- ссылочные типы сравниваются на основе своих значений (номера записи и т. п.);
- не допускается сравнение полей неограниченной длины (строки неограниченной длины, ХранилищеЗначения, поле ТипЗначения из таблицы планов видов характеристик).
Важно! Любая операция сравнения двух значений, в которой участвует хотя бы одно значение NULL, дает результат, аналогичный значению ЛОЖЬ.
Оператор проверки совпадения значения
Форма оператора В для проверки совпадения с одним из перечисленных
Оператор В позволяет проверить, совпадает ли значение выражения, указанного справа от него, с одним из значений, описанных слева. Если совпадает хотя бы с одним – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ. Применение НЕ изменяет действие оператора на обратное. Сравнение значений производится по правилам, описанным в .
Пример:
Выбрать
Где
Справочник.Номенклатура.Родитель.Наименование
В («Бытовая техника», «Оргтехника»)
Форма оператора В для проверки принадлежности по иерархии
Для справочников проверка может осуществляться и на принадлежность по иерархии. Результатом оператора В ИЕРАРХИИ будет ИСТИНА, если значение выражения слева является ссылкой на элемент справочника и входит во множество значений справа или иерархически принадлежит какой-нибудь группе, содержащейся в этом множестве:
Пример:
// В качестве параметра Группа в запрос передается ссылка
// на какую-либо группу справочника Номенклатура.Выбрать
Справочник.Номенклатура.Наименование
В качестве множества значений, на совпадение с которыми выполняется проверка, может фигурировать и результат запроса. В этом случае справа от оператора В необходимо указать описание запроса.
Пример:
Выбрать
Справочник.Номенклатура.Наименование
Форма оператора В для проверки совпадения значения с одним из результата запроса
Примером применения данного оператора может послужить следующее:
Пример:
ВЫБРАТЬ
Товары.Наименование
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Ссылка В
ВЫБРАТЬ
РасхНаклСостав.Товар
ИЗ
)
Результат запроса:
Для получения противоположного результата, то есть, если нужно определить, что значение не совпадает ни с одним из результата запроса, запрос выглядит следующим образом:
Пример:
// Выбрать названия товаров, которые присутствовали в расходных накладных
ВЫБРАТЬ
Товары.Наименование
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Ссылка НЕ В
ВЫБРАТЬ
РасхНаклСостав.Товар
ИЗ
Документ.РасхНакл.Состав КАК РасхНаклСостав
)
Результат запроса:
Заметим, что из запроса операции В возможно обращение к полям таблиц, которые встречались во внешнем запросе до появления операции.
Пример:
// Выбрать названия товаров, которые присутствовали в расходных накладных
ВЫБРАТЬ
Товары.Наименование
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Ссылка В
ВЫБРАТЬ
РасхНаклСостав.Товар
ИЗ
Документ.РасхНакл.Состав КАК РасхНаклСостав
ГДЕ
РасхНаклСостав.Товар = Товары.Ссылка
)
Результат запроса:
Оператор проверки вхождения значения в диапазон
Оператор МЕЖДУ позволяет проверить, входит ли значение выражения, указанного справа от него, в диапазон, указанный слева (вместе с границами диапазона). Если входит – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ. Применение НЕ изменяет действие оператора на обратное. Сравнение значений производится по правилам, описанным в .
Пример:
Выбрать
Где
Справочник.Номенклатура.ЗакупочнаяЦена МЕЖДУ 100 И 1000
Оператор проверки значения на NULL
Оператор ЕСТЬ NULL позволяет проверить значение выражения слева от него на NULL. Если значение равно NULL – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ. Применение НЕ изменяет действие оператора на обратное.
Пример:
Выбрать
Справочник.Номенклатура.Наименование,
Справочник.Номенклатура.ЗакупочнаяЦена
Где
Справочник.Номенклатура.ЗакупочнаяЦена Есть NULL
Оператор проверки ссылочного значения
Оператор ССЫЛКА позволяет проверить, является ли значение выражения, указанного справа от него, ссылкой на таблицу, указанную слева. Если да – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ. Разыменование таблиц описано в параграфе «Разыменование полей».
Пример:
Выбрать
Справочник.Номенклатура.Наименование,
Справочник.Номенклатура.ЕдиницаИзмерения
Где
Справочник.Номенклатура.ЕдиницаИзмерения Ссылка Справочник.ЕдиницыИзмерения
Оператор проверки строки на подобие шаблону
Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.
Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:
- % (процент): последовательность, содержащая любое количество произвольных символов
- _ (подчеркивание): один произвольный символ
- […] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок
В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона. - [^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
Любой другой символ означает сам себя и не несет никакой дополнительной нагрузки.
Если в качестве самого себя необходимо записать один из перечисленных символов, то ему должен предшествовать <Спецсимвол>. Сам <Спецсимвол> (любой подходящий символ) определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.
Например, шаблон “%АБВ[абвг]_абв%” СПЕЦСИМВОЛ “” означает подстроку, состоящую из последовательности символов:
буквы А; буквы Б; буквы В; одной цифры; одной из букв а, б, в или г; символа подчеркивания; буквы а; буквы б; буквы в.
Причем перед этой последовательностью может располагаться произвольный набор символов.
Итоги по иерархии
Есть возможность рассчитать итоги по иерархии. Для этого после имени поля, для которого вычисляются итоги необходимо указать ключевое слово ИЕРАРХИЯ. В результате будут рассчитаны итоги по контрольным точкам и итоги по иерархии для контрольных точек.
Пример:
ВЫБРАТЬ Док.Товар, Док.Количество, Док.Ссылка.Номер, Док.Ссылка.Получатель
ИЗ Документ.РасхНакл.Состав Как Док
УПОРЯДОЧИТЬ ПО Док.Товар
ИТОГИ СУММА(Количество) ПО Док.Товар ИЕРАРХИЯ
Результат запроса:
Товар Количество Номер Получатель Сантехника 104 Кран 84 Кран 10 РНк-1 Урюпинскторг Кран 8 РНк-3 Маг. “Хозяин” Кран 44 РНк-4 Маг. “Гигант” Кран 22 РНк-5 Урюпинскторг Вантус 20 Вантус 5 РНк-1 Урюпинскторг Вантус 1 РНк-3 Маг. “Хозяин” Вантус 14 РНк-4 Маг. “Гигант” Мебель 134 Стол 26 Стол 1 РНк-1 Урюпинскторг Стол 15 РНк-2 Маг. “Мебель” Стол 10 РНк-4 Маг. “Гигант” Стул 108 Стул 55 РНк-2 Маг. “Мебель” Стул 5 РНк-3 Маг. “Хозяин” Стул 32 РНк-4 Маг. “Гигант” Стул 16 РНк-5 Урюпинскторг
Пример:
ВЫБРАТЬ Док.Товар, Док.Количество, Док.Ссылка.Номер, Док.Ссылка.Получатель
ИЗ Документ.РасхНакл.Состав Док
УПОРЯДОЧИТЬ ПО Док.Товар
ИТОГИ СУММА(Количество) ПО Док.Товар ТОЛЬКО ИЕРАРХИЯ
Результат запроса:
Товар Количество Номер Получатель Сантехника 104 Кран 10 РНк-1 Урюпинскторг Кран 8 РНк-3 Маг. “Хозяин” Кран 44 РНк-4 Маг. “Гигант” Кран 22 РНк-5 Урюпинскторг Вантус 5 РНк-1 Урюпинскторг Вантус 1 РНк-3 Маг. “Хозяин” Вантус 14 РНк-4 Маг. “Гигант” Мебель 134 Стол 1 РНк-1 Урюпинскторг Стол 15 РНк-2 Маг. “Мебель” Стол 10 РНк-4 Маг. “Гигант” Стул 55 РНк-2 Маг. “Мебель” Стул 5 РНк-3 Маг. “Хозяин” Стул 32 РНк-4 Маг. “Гигант” Стул 16 РНк-5 Урюпинскторг
Разберем пример:
Клиенту отгружают несколько единиц товара с разной скидкой. Требуется вывести в отчете значения скидок по каждому товару и расчитать среднюю скидку. Создадим отчет на СКД.
Для всех полей по которым требуется выводить итоги зададим на вкладке "Ресурсы" выражение (метод) их расчета. Для Поля "Скидка" зададим метод расчета как "Среднее".
Выводим отчет:
Как видно итог по полю "Скидка" расчитан как среднее арифметическое значений поля, т.е. сумма всех значений деленное на количество значений. Но т.к. объемы отгружаемого товара с разной скидкой различны, то средняя скидка может быть расчитана и другим способом: например как отношение общей суммы отгруженного товара с учетом скидки к общей сумме отгруженного товара. Но тут возникает вопрос: если для расчета значений полей детальных записей в СКД можно прописать формулу, то итоги расчитываются автоматически по выражению указанному на вкладке "Ресурсы", а там, как мы видели ранее, "Среднее" расчитается как среднее арифметическое выводимых значений, как же в этом случае расчитать итог в данной колонке по собственной формуле?
На самом деле это не сложно. Для этого скорректируем наш отчет, добавив в него необходимые поля, которые будут учавствовать в расчете, в нашем случае это "СуммаСоСкидкой" и "СуммаПоПрайсу".
Для Того чтобы СКД "научить" выводить наши итоги проделываем следующие шаги:
1. на вкладке "Настройки" для группировки "" присвоим имя, например "ИтогСКД", для этого вызываем контекстное меню для группировки и нажимаем "присвоить имя";
2. на вкладке "Макеты" добавляем "макет заголовка группировки", где выбираем ранее назначенное имя "ИтогСКД";
3. рисуем строку макета, где все итоги, расчет которых нас устривает оставляем как есть, а для расчета среднего процента скидки пишем формулу для расчета;
Если все здели верно, то при выводе отчета под ним будут выведены две строки итогов, сначала та, что формируется автоматически, затем созданная Вами.
Для того что оставить вывод только вашей строки итогов необходимо на вкладке "Настройки" в разделе "Другие настройки" вывода макета, отключить вывод для "Расположение общих итогов по горизонтали" и "Расположение общих итогов по вертикали"
При построении отчетов есть ряд задач, которые при решении «в лоб» часто приводят к написанию тяжелых запросов или запросам в цикле или ручному выводу данных в таблицу .
Вот примеры таких задач:
- Получение нарастающего объема продаж по месяцам, например, для вывода в виде диаграммы
- Расчет разницы продаж текущего и предыдущего периода – для всех строк отчета
- Сравнение объема продаж каждого менеджера с эталонным значением, которое вычисляется в ходе формирования этого отчета
- Получение нарастающего итога по горизонтали и вертикали в кросс-таблицах
И все эти задачи решаются элементарно с помощью функций СКД – буквально за пару минут . Без запросов в цикле и кривого кода.
Сегодня рассмотрим использование некоторых функций СКД на конкретных примерах.
Видео 1. Как получить сумму в отчете нарастающим итогом?
Подобные задачи часто встречаются на практике. Наиболее типичный пример – в отчет должны выводиться продажи по периодам, необходимо знать не только сумму продаж текущего месяца, но и нарастающим итогом с начала формирования отчета.
На самом деле эту задачу можно решить и с помощью запроса (без функций СКД), но есть 2 проблемы:
- Сам по себе подобный запрос будет сложным – уйдет время на его разработку и отладку.
- Такой запрос будет серьезно нагружать систему – и чем больше данных, тем медленнее он будет работать.
С помощью функций СКД эта задача решается одной строчкой кода, и отчет будет работать максимально быстро, смотрим:
Видео 2. Как получить значение из предыдущей строки отчета?
Такой функционал может быть полезен, когда необходимо отслеживать тренд определенного ресурса – происходит уменьшение или увеличение относительно предыдущего состояния, плюс должна рассчитываться дельта.
Приведем несколько примеров, когда это может быть полезно:
- Анализ дебиторской задолженности по дням – вычисляем тренд и абсолютное увеличение или уменьшение задолженности относительно прошлого периода
- Анализ курсов валют и оценка прибыли или убытков от курсовой разницы – нужно получить дельту между текущим и предыдущим курсом и умножить на остаток денежных средств в валюте.
Такие задачи также трудоемко решить с помощью запроса, а в СКД это делается одной строкой:
Видео 3. Как сравнить итог по текущей строке с эталонным значением?
Пример, когда этот функционал может быть полезен:
- В системе ведется учет продаж менеджерами
- Руководитель отдела ведет личные продажи наряду с менеджерами
- Требуется вывести отчет по продажам в разрезе менеджеров
- В отчет также необходимо выводить дельту относительно объема продаж руководителя отдела.
То есть речь о том, что нужно сравнить каждую строку продаж менеджера с продажами руководителя отдела.
А эти данные могут, например, использоваться для начисления премии.
И опять же с помощью СКД эта задача решается в одну строку:
Видео 4. Получение нарастающего итога в кросс-таблице
В отчете вида кросс-таблица нарастающий итог может считаться как вертикально (по строкам), так и горизонтально (по столбцам).
Мы покажем, как с помощью одного параметра СКД управлять направлением расчета итогов:
Видео 5. Вывод табличной части в отдельной ячейке отчета
Допустим, необходимо разработать отчет, который выводит информацию о документах. При этом в отдельной ячейке должна содержаться табличная часть документа.
Чтобы решить подобную задачу с помощью обычного запроса, потребуется писать ручной вывод результата в табличный документ.
В СКД эта задача вновь решается одной функцией.
Итоги должны присутствовать в любом отчете. Например, если у вас есть поля Наименование количество цена и сумма, то логично по последние колонки получить общий итог. Сегодня рассмотрим, как это сделать с помощью СКД (Система компоновки данных).
На сегодняшний день СКД очень широко применяется для создания различных отчетов. Связанно это с тем что средствами СКД можно создать практический любой отчет. Те кто пользовался системой компоновки данных знает что это очень удобно и быстро не нужно судорожно писать код можно все сделать в конструктором.
Для примера я возьму отчет который мы создавали в прошлой статье. Выглядел он у нас вот так.
Давайте к нему добавим общий итог по колонке Сумма.
Как вывести общие итоги по колонке с помощью СКД 1С
И так запускаем конфигуратор открываем наш отчет Приход Товара и кликаем на Схему компоновки данных.
В открывшемся окне переходим на вкладку Ресурсы. Слева из окна доступные поля выбираем поле Сумма и перетаскиваем его в правое окно. Больше не чего не меняем.
Запускаем 1С и смотрим что у нас получилось. Если вы все сделали правильно, то в конце таблицы должен появиться итог по колонке.
В результате получим итоговую сумму по всем колонкам.
Ну вот мы и научились выводит итого по колонкам с помощью системы компоновки данных.
Листы Excel, содержащие большой объем информации, иногда могут выглядеть перегруженными и даже трудночитаемыми. Excel позволяет группировать данные, чтобы с легкостью скрывать и показывать различные разделы листа. К тому же Вы можете обобщить различные группы при помощи команды Промежуточный итог и придать структуру рабочему листу Excel. В этом уроке мы рассмотрим оба этих инструмента максимально подробно и на наглядных примерах.
Группировка строк и столбцов в Excel
Чтобы разгруппировать данные в Excel, выделите сгруппированные строки или столбцы, а затем щелкните команду Разгруппировать .
Как скрыть и показать группы
Подведение итогов в Excel
Команда Промежуточный итог позволяет автоматически создавать группы и использовать базовые функции, такие как СУММ, СЧЁТ и СРЗНАЧ, чтобы упростить подведение итогов. Например, команда Промежуточный итог способна вычислить стоимость канцтоваров по группам в большом заказе. Команда создаст иерархию групп, также называемую структурой, чтобы упорядочить информацию на листе.
Ваши данные должны быть правильно отсортированы перед использованием команды Промежуточный итог , Вы можете изучить серию уроков Сортировка данных в Excel , для получения дополнительной информации.
Создание промежуточного итога
В следующем примере мы воспользуемся командой Промежуточный итог , чтобы определить сколько заказано футболок каждого размера (S, M, L и XL). В результате рабочий лист Excel обретет структуру в виде групп по каждому размеру футболок, а затем будет подсчитано общее количество футболок в каждой группе.
Просмотр групп по уровням
При подведении промежуточных итогов в Excel рабочий лист разбивается на различные уровни. Вы можете переключаться между этими уровнями, чтобы иметь возможность регулировать количество отображаемой информации, используя иконки структуры 1, 2, 3 в левой части листа. В следующем примере мы переключимся между всеми тремя уровнями структуры.
Хоть в этом примере представлено всего три уровня, Excel позволяет создавать до 8 уровней вложенности.
Вы также можете воспользоваться иконками Показать или Скрыть детали , чтобы скрыть или отобразить группы.
Удаление промежуточных итогов в Excel
Со временем необходимость в промежуточных итогах пропадает, особенно, когда требуется иначе перегруппировать данные на листе Excel. Если Вы более не хотите видеть промежуточные итоги, их можно удалить.
Чтобы удалить только группы, оставив промежуточные итоги, воспользуйтесь пунктом Удалить структуру из выпадающего меню команды Разгруппировать .