- ИТОГИ в запросе 1С 8.3
- Для чего нужны итоги
- Синтаксис секции итогов
- Итоги по нескольким полям
- Использование произвольных выражений в итогах языка запроса
- Произвольные выражения в итогах
- Примеры использования
- Расчет выражений от агрегатных функций
- Расчет итогов только для уже полученных группировок
- Переопределение представлений для группировок
- 1С 8.3 Итоги в запросе — Программист 1С Минск. Автоматизация бизнеса.
- 1С 8.3 Итоги в запросе
- Итоги и иерархия выборки
- Итоги и иерархия выборки
- Синтаксис блока ИТОГИ
- Конструктор запроса
- Иерархия выборки
- Тонкости итогов
- Работа с запросами во встроенном языке 1С 8.3
- Схема выполнения запроса
- Параметры запроса
ИТОГИ в запросе 1С 8.3
Для чего нужны итоги
Итоги позволяют получить некоторый итог в запросе без сворачивания детальных записей.
Например, получим выборку из справочника номенклатура в некоторой условной конфигурации. В полях выберем код, наименование и качество:
Как мы видим, качество может быть трех видов: новый, ограниченно годен и не годен. Нам нужно подсчитать сколько есть позиций каждого качества, но без потери данных по наименованию и коду. То есть сгруппировать по качеству и подсчитать количество различных ссылок не получится.
Для решения данной задачи можно использовать итоги:
В результат запроса добавились 3 новые записи (выделены зеленым цветом). По одной для каждого качества. Это и есть итоги. Причем в колонке «Код» для итоговых записей будет количество детальных записей, потому что именно такую функцию мы указали в тексте запроса: КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Код). Также мы не потеряли информацию по коду и наименованию для детальных записей.
Теперь мы можем сказать, что с качеством «Новый» 3 записи, с качеством «Не годен» 2 записи, с качеством «Ограниченно годен» 1 запись.
Синтаксис секции итогов
После ключевого слова ИТОГИ указываются итоговые поля, обычно для них применяется какая-нибудь агрегатная функция (сумма, количество, максимум, минимум, среднее). Таких полей может быть несколько, тогда они перечисляются через запятую. После ключевого слова ПО перечисляются поля, для которых нужно рассчитать итоги. Если их несколько, то тоже через запятую.
В итоговых полях можно использовать только те поля, которые есть в секции ВЫБРАТЬ. При этом не обязательное нужно использовать все поля. В секции ПО можно указать любое поле таблицы, даже если его нет в секции ВЫБРАТЬ.
Итоги рассчитываются платформой, а не средствами СУБД.
Итоги по нескольким полям
Для примера добавим в запрос итог по полю «Производитель»:
Источник
Использование произвольных выражений в итогах языка запроса
Язык запросов предоставляет возможность использования произвольных выражений для расчета итогов по группировкам. В данной статье описываются некоторые особенности использования произвольных выражений в итоговых полях, а также приводятся примеры использования.
Произвольные выражения в итогах
Синтаксис и функциональность выражения для расчета итогов аналогичны простому выражению языка запроса, однако имеются некоторые особенности:
- в выражениях для расчета итогов нельзя использовать операции В и В ИЕРАРХИИ со вложенными запросами.
- в выражениях для расчета итогов результат функции Представление() может быть использован в другом выражении.
В случае если для расчета итога используется произвольное выражение, необходимо обозначить имя поля, в которое будет помещен результат расчета итога, для этого необходимо после описания выражения итога после не обязательного ключевого слова КАК указать псевдоним поля из списка выборки запроса.
ИТОГИ
100 * Сумма(Прибыль) / СУММА(Оборот) КАК ПроцентПрибыли
В данном примере результате выражения будет помещаться в поле «ПроцентПрибыли». Заметим, что поле «ПроцентПрибыли» должно присутствовать в списке выборки запроса.
Все поля, используемые в выражениях для расчета итога, должны присутствовать в списке выборки запроса. В качестве имен полей можно использовать псевдонимы полей списка выборки.
В выражениях для расчета итога вне агрегатных функций могут использоваться только поля, по которым рассчитываются итоги.
ИТОГИ
Номенклатура КАК Номенклатура,// Правильно, т.к. поле присутствует в списке группировок итогов
СуммаОборот КАК СуммаОборот, // Неправильно, т.к. поле отсутствует в списке группировок итогов
Сумма(КоличествоОборот) КАК КоличествоОборот // Правильно, т.к. поле используется в агрегатной функции
ПО
Номенклатура,
Контрагент
В случае если поле — группировка используется в итоговом выражении, и по данному полю еще не было получена группировка — значение поля будет равняться NULL .
Примеры использования
Расчет выражений от агрегатных функций
Для расчета выражений от агрегатных функций достаточно описать выражение, в котором будут использоваться агрегатные функции.
ВЫБРАТЬ
Номенклатура,
СуммаОборот КАК Оборот,
СуммаПрибыль КАК Прибыль,
100 * СуммаПрибыль / СуммаОборот КАК ПроцентПрибыли
ИЗ
РегистрНакопления.УчетПрибыли.Обороты
ИТОГИ
СУММА(Оборот),
СУММА(Прибыль),
100 * СУММА(Прибыль) / СУММА(Оборот) КАК ПроцентПрибыли
ПО
Номенклатура ИЕРАРХИЯ
В данном примере в поле «ПроцентПрибыли» итоговых записей будет помещено значение суммы по полю «Прибыль» умноженное на 100 и поделенное на значение суммы по полю «Оборот».
Расчет итогов только для уже полученных группировок
Для того, чтобы значение некоторых суммируемых полей рассчитывалось только для группировок, по которым уже получены итоги, в выражении для расчета итога можно воспользоваться тем фактом, что значение полей — группировок для еще не полученных группировок равняется NULL .
ВЫБРАТЬ
ОсновнойОстатки.Счет КАК Счет,
ОсновнойОстатки.Валюта КАК Валюта,
ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
СУММА(СуммаОстаток),
ВЫБОР
КОГДА Валюта ЕСТЬ НЕ NULL
ТОГДА СУММА(ВалютнаяСуммаОстаток)
КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
Счет,
Валюта
В данном примере значение итога для поля «ВалютнаяСуммаОстаток» будет рассчитано только для итоговых записей, в которых уже получена группировка Валюта. Т.е. в итоговых записях для группировки Счет итоги по полю «ВалютнаяСуммаОстаток» будут рассчитывать только тогда, когда итоги по данной группировке будут получаться только внутри группировки Валюта.
Альтернативным способом расчета итога является проверка количества различных значений в группировке и рассчет итога только для итоговых записей, в которых суммируется только одно значение группировки.
ВЫБРАТЬ
ОсновнойОстатки.Счет КАК Счет,
ОсновнойОстатки.Валюта КАК Валюта,
ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
СУММА(СуммаОстаток),
ВЫБОР
КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Валюта) = 1
ТОГДА СУММА(ВалютнаяСуммаОстаток)
КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
Счет,
Валюта
В данном примере рассчет итого по полю «ВалютнаяСуммаОстаток» будет производиться только для тех итоговых записей, которые содержат лишь одно значение поля «Валюта».
Переопределение представлений для группировок
В случае если поле является представлением поля группировки, переопределение выражения для данного поля приведет к тому, что в результат, в качестве представления поля, будет выведен результат выражения итога. Используя данную особенность, возможно переопределить представления для группировок.
ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.Номенклатура.Код КАК НоменклатураКод,
ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление,
ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
ПродажиОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
ИТОГИ
НоменклатураКод + «) » + НоменклатураПредставление КАК НоменклатураПредставление,
СУММА(КоличествоОборот),
СУММА(СуммаОборот)
ПО
Номенклатура
В данном примере, в качестве представления поля «Номенклатура» в итоговых записях, будет использоваться выражение, состоящее из кода и основного представления.
Источник
1С 8.3 Итоги в запросе — Программист 1С Минск. Автоматизация бизнеса.
1С 8.3 Итоги в запросе
&НаСервере
Процедура ПолучениеИтоговВЦеломПоТаблице ()
// Получение среднего веса материалов по всему справочнику
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СРЕДНЕЕ(Вес)
|ПО
| ОБЩИЕ» );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПолучениеИтогоВПоОдномуПолюВРазрезеДругогоПоля ()
// Получение итогов по весу материалов в разрезе Срока Использования
Запрос = Новый Запрос ( «ВЫБРАТЬ
| СрокИспользования,
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СУММА(Вес)
|ПО
| СрокИспользования» );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПолучениеИтоговОднихПолейВРазрезеНесколькихДругих ()
// Получение итогов веса, плотности и фасовки материалов
// в разрезе производителей и сроков использования, по всему справочнику
Запрос = Новый Запрос ( «ВЫБРАТЬ
| СрокИспользования,
| Производитель,
| Наименование,
| Вес,
| Плотность,
| Фасовка,
|ИЗ
| Справочник.Материалы
|ГДЕ
| ЭтоГруппа = Ложь
|ИТОГИ
| СУММА(Вес),
| СУММА(Плотность),
| СУММА(Фасовка),
|ПО
| ОБЩИЕ,
| СрокИспользования,
| Производитель» );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПолучениеИтоговПоИерархии ()
// Получение средней цены поступления на материалы
// в разрезе элементов и групп справочника материалов
Запрос = Новый Запрос ( «ВЫБРАТЬ
| Период,
| Материалы,
| ВходящаяЦена
|ИЗ
| РегистрСведений.ВходящаяЦенаМатериалов КАК ВходящаяЦенаМатериалов
|ИТОГИ
| СРЕДНЕЕ(ВходящаяЦена)
|ПО
| Материалы ИЕРАРХИЯ» );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Источник
Итоги и иерархия выборки
Итоги и иерархия выборки
Команда ИТОГИ ПО предназначена для получения итогов по выбранным полям, затем позволяет производить иерархическую выборку результата запроса, а также выгрузку его сразу в ДеревоЗначений.
Обычный же результат выгружается как таблица значений (помимо линейной выборки).
Синтаксис блока ИТОГИ
Пример:
ИТОГИ
МАКСИМУМ(СуммаОборот)
ПО
ОБЩИЕ,
Ссылка ИЕРАРХИЯ
Конструктор запроса
Управление итогами производится на одноименной вкладке «Итоги»
- Доступно выбор группировочного поля
- Типа итогов (Элементы, Элементы и иерархия, Только иерархия)
- Указания наличия/отсутствия общего итога по всей выборке
- Выбор итоговых полей и выражений аналогичных по синтаксису группировке
Иерархия выборки
Выборка запроса по группировкам была рассмотрена в этой статье.
Приведем фрагмент кода:
Тонкости итогов
Если вызвать команду выгрузить с обходом по группировкам, она вернет ДеревоЗначений:
Есть интересный механизм получения аккуратного и компактного дерева через использования ВЫБОР в разделе ИТОГИ
Имя поля в итоге должно совпадать с одним из полей выборки иначе будет ошибка «Невозможно определить поле для записи результата»
Поля в итогах также должны быть в выборке, в противном случае выйдет ошибка: «Поле, по которому рассчитываются итоги, должно присутствовать в списке выборки»
ВЫБРАТЬ
4 КАК Четыре,
3 КАК Три,
2 КАК Два,
1 КАК Один
ИТОГИ
ВЫБОР
КОГДА Два ЕСТЬ NULL
ТОГДА Один
КОГДА Три ЕСТЬ NULL
ТОГДА Два
ИНАЧЕ Три
КОНЕЦ КАК Четыре
ПО
Один,
Два,
Три
На Выходе будет вот такая дерево:
- Осталось удалить лишние колонки и можно сразу выводить на форму
Реклама магазина самообслуживания: треска, стоящая в очереди за cобственной печенью.
Источник
Работа с запросами во встроенном языке 1С 8.3
Схема выполнения запроса
Для работы с запросами во встроенном языке 1С есть следующие объекты:
- Запрос
- РезультатЗапроса
- ВыборкаИзРезультатаЗапроса
Общая схема выполнения запроса выглядит следующим образом:
- Создается объект Запрос, через свойство Текст устанавливается текст запроса.
- Если в запросе есть параметры, то методом УстановитьПараметр заполняются значения параметров запроса.
- С помощью метода Выполнить получается объект РезультатЗапроса.
- Из результата запроса методом Выбрать получается объект ВыборкаИзРезультатаЗапроса. Также результат запроса можно выгрузить в таблицу значений или в дерево значений с помощью метода Выгрузить.
- На последнем шаге выполняется обработка выборки, таблицы значений или дерева значений.
Непосредственное получение данных из базы выполняется в момент вызова метода Выполнить у объекта Запрос. Для того, чтобы спозиционироваться на первой записи выборки результата запроса нужно вызвать метод Следующий. Если в выборке еще остались записи, то данный метод вернет Истина, в противном случае Ложь. На каждой итерации цикла будет получена очередная запись результата запроса.
Параметры запроса
Для того чтобы передать значения параметров в запрос используется метод УстановитьПараметр. При этом если задать значение параметра, которого нет в тексте запроса, то запрос все равно выполнится. А если не задать значение какого-либо параметра, то будет выброшено исключение «Не задано значение параметра Имя параметра».
После заполнения значений параметров они будут доступны через свойство Параметры объекта Запрос:
Источник