Работа с итогами запросов в 1С:Предприятие — один из ключевых навыков для аналитиков, разработчиков и бухгалтеров. Без грамотного использования группировок, агрегатных функций и итоговых выборок сложно построить точные отчеты, выявить тренды или автоматизировать рутинные операции. Однако многие пользователи ограничиваются базовыми возможностями, не зная, как выжать максимум из инструмента.
В этой статье разберем не только стандартные приемы работы с итогами (например, ГРУППИРОВКА ПО или СУММА), но и продвинутые техники: вложенные запросы, использование временных таблиц, оптимизацию производительности. Особое внимание уделим практическим примерам — от простого подсчета количества документов до сложного анализа оборотов по счетам с детализацией по периодам.
Если вы никогда не работали с итогами в запросах или хотите систематизировать знания — материал поможет избежать типичных ошибок. Например, почему иногда СУММА возвращает неверные значения при соединении таблиц, или как правильно использовать ИТОГИ ПО ГРУППИРОВКАМ для многоуровневой аналитики. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3 (включая последние релизы 2026–2026 гг.).
⚠️ Внимание: Синтаксис запросов и доступные функции могут отличаться в зависимости от конфигурации (Бухгалтерия 3.0, УТ 11, ЗУП 3.1 и др.). Для критичных задач сверяйтесь с документацией вашей версии или тестируйте запросы в Консоли запросов.
1. Что такое итоги в запросах 1С и зачем они нужны
Итоги в запросах 1С — это результат применения агрегатных функций (СУММА, КОЛИЧЕСТВО, МАКСИМУМ и др.) к сгруппированным данным. Без них вы получите только сырые строки из базы, что мало полезно для анализа. Например, запрос без итогов вернет все строки документа РеализацияТоваровУслуг, а с итогами — сумму продаж по каждому контрагенту.
Основные задачи, которые решают итоги:
- 📊 Аналитика: подсчет оборотов по счетам, остатков товаров, средних цен.
- 📈 Отчетность: формирование сводных таблиц для регламентированных отчетов (например, декларации по НДС).
- ⚡ Автоматизация: проверка условий в бизнес-процессах (например, "если сумма задолженности превышает 100 000 руб.").
- 🔍 Контроль: поиск аномалий (дубликаты документов, отрицательные остатки).
Рассмотрим простой пример. Допустим, нужно узнать, сколько товаров было продано каждому клиенту за месяц. Без итогов запрос вернет все строки реализаций, а с итогами — сводную таблицу:
ВЫБРАТЬ
Клиент,
СУММА(Количество) КАК ВсегоПродано
ИЗ
Документ.РеализацияТоваровУслуг.Товары
ГДЕ
Дата МЕЖДУ &НачалоМесяца И &КонецМесяца
СГРУППИРОВАТЬ ПО
Клиент
Здесь СГРУППИРОВАТЬ ПО определяет уровень детализации (по клиентам), а СУММА — агрегатную функцию. Результат будет содержать только уникальных клиентов с итоговым количеством проданных товаров.
2. Базовые агрегатные функции: СУММА, КОЛИЧЕСТВО, СРЕДНЕЕ и другие
В 1С доступно более 10 агрегатных функций, но 90% задач решаются с помощью пяти основных. Разберем их на примерах.
1. СУММА — складывает значения числовых полей. Чаще всего применяется для подсчета денежных сумм или количеств:
ВЫБРАТЬ
Номенклатура,
СУММА(Количество) КАК ВсегоШтук,
СУММА(Сумма) КАК ВсегоРублей
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары
СГРУППИРОВАТЬ ПО
Номенклатура
2. КОЛИЧЕСТВО — считает количество строк в группе (включая NULL). Полезно для подсчета документов или уникальных значений:
ВЫБРАТЬ
Контрагент,
КОЛИЧЕСТВО(*) КАК КоличествоЗаказов
ИЗ
Документ.ЗаказПокупателя
СГРУППИРОВАТЬ ПО
Контрагент
3. СРЕДНЕЕ — вычисляет среднее арифметическое. Применимо для анализа средних цен, чеков или сроков:
ВЫБРАТЬ
Номенклатура,
СРЕДНЕЕ(Цена) КАК СредняяЦена
ИЗ
Документ.РеализацияТоваровУслуг.Товары
СГРУППИРОВАТЬ ПО
Номенклатура
4. МАКСИМУМ / МИНИМУМ — находят крайние значения в группе. Используются для поиска максимальной скидки, последней даты документа и т.п.:
ВЫБРАТЬ
Контрагент,
МАКСИМУМ(Дата) КАК ПоследнийЗаказ
ИЗ
Документ.ЗаказПокупателя
СГРУППИРОВАТЬ ПО
Контрагент
5. РАЗНОСТЬДАТ — вычисляет разницу между датами в днях. Полезно для анализа просроченной дебиторки:
ВЫБРАТЬ
Контрагент,
РАЗНОСТЬДАТ(ДЕНЬ, ТЕКУЩАЯДАТА(), ДатаОплаты) КАК ДнейПросрочки
ИЗ
Документ.ПоступлениеДенежныхСредств
ГДЕ
ДатаОплаты < ТЕКУЩАЯДАТА()
⚠️ Внимание: Функция КОЛИЧЕСТВО(*) учитывает все строки, включая те, где поле равно NULL. Если нужно посчитать только непустые значения, используйте КОЛИЧЕСТВО(Поле).
Для ускорения запросов с агрегатными функциями добавьте индексы на поля, используемые в ГРУППИРОВКА ПО. Например, если часто группируете по Контрагент, создайте индекс в конфигураторе.
3. Многоуровневая группировка: ИТОГИ ПО ГРУППИРОВКАМ
Когда нужно получить итоги не только по одной группировке, но и по нескольким уровням (например, по регионам и городам), используется конструкция ИТОГИ ПО ГРУППИРОВКАМ. Она позволяет строить иерархические отчеты прямо в запросе.
Пример: подсчитаем сумму продаж по регионам, городам и контрагентам с промежуточными итогами:
ВЫБРАТЬ
Регион,
Город,
Контрагент,
СУММА(СуммаДокумента) КАК ОбщаяСумма
ИЗ
Документ.РеализацияТоваровУслуг
СГРУППИРОВАТЬ ПО
Регион,
Город,
Контрагент
ИТОГИ ПО ГРУППИРОВКАМ
Регион,
Регион, Город
В результате вы получите таблицу с тремя уровнями итогов:
- Итоги по каждому контрагенту (самый нижний уровень).
- Промежуточные итоги по городам внутри каждого региона.
- Общие итоги по регионам.
Для визуализации таких данных удобно использовать СКД (Система Компоновки Данных), где можно настроить отображение иерархии с раскрывающимися группами.
Добавьте в конец запроса Как отсортировать итоги по убыванию?
УПОРЯДОЧИТЬ ПО ОбщаяСумма УБЫВ. Если нужно сортировать по группировкам, используйте УПОРЯДОЧИТЬ ПО Регион, ОбщаяСумма УБЫВ.
| Группировка | Пример итога | Когда использовать |
|---|---|---|
ГРУППИРОВКА ПО Контрагент |
Сумма продаж по каждому клиенту | Анализ лояльности клиентов |
ГРУППИРОВКА ПО Номенклатура.Группа |
Обороты по группам товаров | ABC/XYZ-анализ ассортимента |
ГРУППИРОВКА ПО МЕСЯЦ(Дата) |
Динамика продаж по месяцам | Сезонный анализ |
ГРУППИРОВКА ПО Менеджер, Номенклатура |
Продажи по менеджерам и товарам | Оценка эффективности сотрудников |
4. Продвинутые техники: вложенные запросы и временные таблицы
Для сложных аналитических задач базовых итогов недостаточно. Рассмотрим два мощных инструмента: вложенные запросы и временные таблицы.
Вложенные запросы позволяют использовать результат одного запроса как источник данных для другого. Например, найдем клиентов, у которых сумма заказов превышает среднюю по базе:
ВЫБРАТЬ
КлиентИтоги.Контрагент,
КлиентИтоги.ОбщаяСумма
ИЗ
(
ВЫБРАТЬ
Контрагент,
СУММА(СуммаДокумента) КАК ОбщаяСумма
ИЗ
Документ.РеализацияТоваровУслуг
СГРУППИРОВАТЬ ПО
Контрагент
) КАК КлиентИтоги
ГДЕ
КлиентИтоги.ОбщаяСумма >
(
ВЫБРАТЬ
СРЕДНЕЕ(ОбщаяСумма)
ИЗ
(
ВЫБРАТЬ
СУММА(СуммаДокумента) КАК ОбщаяСумма
ИЗ
Документ.РеализацияТоваровУслуг
СГРУППИРОВАТЬ ПО
Контрагент
) КАК СредниеИтоги
)
Временные таблицы (#Таблица) ускоряют работу со сложными выборками, так как позволяют сохранить промежуточные результаты. Пример: анализ оборотов с детализацией по дням:
ВЫБРАТЬ
Дата,
Номенклатура,
СУММА(Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Обороты
ИЗ
Документ.РеализацияТоваровУслуг.Товары
СГРУППИРОВАТЬ ПО
Дата,
Номенклатура
;
////////////////////////////////////////////////
ВЫБРАТЬ
Номенклатура,
СУММА(Количество) КАК ВсегоПродано,
МАКСИМУМ(Дата) КАК ПоследняяПродажа
ИЗ
ВТ_Обороты КАК Обороты
СГРУППИРОВАТЬ ПО
Номенклатура
⚠️ Внимание: Временные таблицы существуют только в рамках одного запроса. Если вам нужно передать данные между несколькими запросами (например, в обработке), используйте глобальные временные таблицы (ГЛОБАЛЬНЫЙ ПОМЕСТИТЬ), но учитывайте, что они требуют явного удаления после использования.
Имя таблицы начинается с префикса (например, ВТ_)|Поля имеют понятные aliases (КАК)|Есть условие для очистки (УНИЧТОЖИТЬ)|Запрос не превышает лимит памяти-->
5. Оптимизация запросов с итогами: индексы, условия, план выполнения
Запросы с итогами могут тормозить, если не оптимизированы. Основные причины медленной работы:
- 🐢 Отсутствие индексов на полях, используемых в
ГРУППИРОВКА ПО. - 🗑️ Избыточные соединения таблиц (
ЛЕВОЕ СОЕДИНЕНИЕбез необходимости). - 📊 Агрегация по высокодетализированным полям (например, по
Секунда(Дата)вместоДЕНЬ(Дата)). - 🔄 Вложенные запросы с большими выборками.
Критическая ошибка: использование РАЗЛИЧНЫЕ в запросах с итогами. Эта конструкция заставляет СУБД обрабатывать все строки таблицы, что приводит к полному сканированию (Table Scan) вместо использования индексов. Например, вместо:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Контрагент
ИЗ
Документ.РеализацияТоваровУслуг
используйте:
ВЫБРАТЬ
Контрагент
ИЗ
Документ.РеализацияТоваровУслуг
СГРУППИРОВАТЬ ПО
Контрагент
Для анализа производительности запроса используйте план выполнения. В 1С его можно получить так:
ОбъяснитьЗапрос = Новый ОбъяснениеЗапроса;
ОбъяснитьЗапрос.УстановитьТекстЗапроса(ТекстЗапроса);
ОбъяснитьЗапрос.Выполнить();
Результат = ОбъяснитьЗапрос.ПолучитьПланВыполнения();
Ищите в плане следующие "красные флаги":
- 🚨
Table Scan— полное сканирование таблицы (нужны индексы). - 🚨
Hash Match— дорогое соединение таблиц (попробуйте заменить наMerge Join). - 🚨
Sort— сортировка больших объемов данных (проверьте индексы).
Индексы на поля в ГРУППИРОВКА ПО и УПОРЯДОЧИТЬ ПО ускоряют запрос в 10–100 раз. Создавайте их через конфигуратор или программно с помощью СоздатьИндекс().
6. Экспорт итогов в отчеты: СКД, Excel, JSON
Итоги запросов редко используются сами по себе — обычно их нужно визуализировать. Рассмотрим три способа экспорта.
1. Система Компоновки Данных (СКД)
СКД позволяет создавать гибкие отчеты с группировками, диаграммами и условным оформлением. Пример кода для вывода итогов в СКД:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагент,
| СУММА(СуммаДокумента) КАК ОбщаяСумма
|ИЗ
| Документ.РеализацияТоваровУслуг
|СГРУППИРОВАТЬ ПО
| Контрагент";
РезультатЗапроса = Запрос.Выполнить();
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
НастройкиКомпоновки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки, РезультатЗапроса);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
РезультатКомпоновки = ПроцессорКомпоновки.Выполнить();
2. Экспорт в Excel
Для экспорта итогов в Excel используйте ЗаписьXML или библиотеку OneScript.Excel. Пример:
ТаблицаДокумента = Новый ТаблицаДокумента;
ТаблицаДокумента.Вывести(РезультатЗапроса);
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
Для КажднойСтрока Из ТаблицаДокумента Цикл
Лист.Cells(Строка.НомерСтроки, 1).Value = Строка.Контрагент;
Лист.Cells(Строка.НомерСтроки, 2).Value = Строка.ОбщаяСумма;
КонецЦикла;
Excel.Visible = Истина;
3. Формат JSON
Если итоги нужно передать во внешнюю систему (например, дашборд на Power BI), удобно использовать JSON:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
РезультатЗапроса.ЗаписатьJSON(ЗаписьJSON);
СтрокаJSON = ЗаписьJSON.Закрыть();
⚠️ Внимание: При экспорте в Excel через COMОбъект на сервере 1С могут возникнуть проблемы с правами. Для стабильной работы настройте права на запуск Excel.Application или используйте альтернативные библиотеки (например, EPPlus через .NET).
7. Типичные ошибки и как их избежать
Даже опытные разработчики допускают ошибки при работе с итогами. Вот самые распространенные:
1. Игнорирование NULL-значений
Агрегатные функции по-разному обрабатывают NULL:
СУММАиСРЕДНЕЕигнорируютNULL.КОЛИЧЕСТВО(*)считает все строки, включаяNULL.МАКСИМУМ/МИНИМУМвозвращаютNULL, если все значения в группе —NULL.
Пример ошибки:
ВЫБРАТЬ
Контрагент,
СУММА(СуммаДокумента) / КОЛИЧЕСТВО(*) КАК СреднийЧек // Ошибка: делим на количество строк, а не документов!
ИЗ
Документ.РеализацияТоваровУслуг
Правильно:
ВЫБРАТЬ
Контрагент,
СУММА(СуммаДокумента) / КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Номер) КАК СреднийЧек
ИЗ
Документ.РеализацияТоваровУслуг
2. Неправильное соединение таблиц
При соединении таблиц (СОЕДИНЕНИЕ, ЛЕВОЕ СОЕДИНЕНИЕ) итоги могут дублироваться. Например, если в таблице Справочник.Контрагенты есть запись без связей с документами, ЛЕВОЕ СОЕДИНЕНИЕ включит ее в результат с NULL в агрегатных полях.
3. Перегрузка группировок
Чрезмерная детализация (например, группировка по Контрагент, Номенклатура, Дата, Менеджер) приводит к:
- 🐌 Медленному выполнению запроса.
- 📄 Слишком большому объему данных в результате.
- 🤯 Сложности в анализе (из-за перегруженности отчета).
4. Неучет валют
Если в базе есть документы в разных валютах, СУММА(СуммаДокумента) вернет сумму в валюте документа, а не в рублях. Используйте СУММА(СуммаДокумента * Курс) или функцию ВЫРАЗИТЬ():
ВЫБРАТЬ
Контрагент,
СУММА(ВЫРАЗИТЬ(СуммаДокумента В Рубль)) КАК СуммаВРублях
ИЗ
Документ.РеализацияТоваровУслуг
Всегда проверяйте результат запроса на тестовых данных перед использованием в отчетах. Особенно если запрос содержит соединения таблиц или вложенные подзапросы.
8. Практический пример: анализ оборотов по счетам бухгалтерии
Рассмотрим реальную задачу: нужно получить обороты по счетам бухгалтерии с детализацией по контрагентам и статьям ДДС. Такой отчет востребован для анализа финансового состояния компании.
Шаг 1. Формируем запрос с итогами
Используем регистр бухгалтерии ВЫБРАТЬ Счет.Представление КАК Счет, Контрагент.Наименование КАК Контрагент, СтатьяДДС.Наименование КАК СтатьяДДС, СУММА(ОборотДт) КАК ОборотДт, СУММА(ОборотКт) КАК ОборотКт ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО Хозрасчетный.Валюта = КурсыВалют.Валюта И Хозрасчетный.Период = КурсыВалют.Период ГДЕ Хозрасчетный.Период МЕЖДУ &НачалоПериода И &КонецПериода И Хозрасчетный.Организация = &Организация СГРУППИРОВАТЬ ПО Счет, Контрагент, СтатьяДДС Шаг 2. Добавляем расчет сальдоХозрасчетный (в Бухгалтерии 3.0):
Чтобы получить сальдо (разницу между дебетом и кредитом), модифицируем запрос:
ВЫБРАТЬ
Счет,
Контрагент,
СтатьяДДС,
ОборотДт,
ОборотКт,
ОборотДт - ОборотКт КАК Сальдо
ИЗ
(
ВЫБРАТЬ
Счет.Представление КАК Счет,
Контрагент.Наименование КАК Контрагент,
СтатьяДДС.Наименование КАК СтатьяДДС,
СУММА(ОборотДт) КАК ОборотДт,
СУММА(ОборотКт) КАК ОборотКт
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО Хозрасчетный.Валюта = КурсыВалют.Валюта
И Хозрасчетный.Период = КурсыВалют.Период
ГДЕ
Хозрасчетный.Период МЕЖДУ &НачалоПериода И &КонецПериода
И Хозрасчетный.Организация = &Организация
СГРУППИРОВАТЬ ПО
Счет,
Контрагент,
СтатьяДДС
) КАК Итоги
Шаг 3. Визуализируем в СКД
Для удобного отображения настройте схему компоновки:
⚠️ Внимание: В бухгалтерских запросах всегда указывайте период и организацию, иначе рискуете получить данные за весь исторический срез, что замедлит выполнение.
1. Используйте виртуальные таблицы (например, 2. Ограничивайте период выборки (не берите данные за все время). 3. Избегайте соединений с другими регистрами, если это не критично для задачи. Для регламентированных отчетов итоги запроса нужно связать с шаблоном отчета. В 1С:Бухгалтерии 3.0 это делается через механизм
Счет, Контрагент.Как ускорить запрос к регистру бухгалтерии?
Обороты или ОборотыИОстатки).Как использовать итоги из запроса для формирования регламентированного отчета (например, декларации по НДС)?
РегламентированнаяОтчетность:
ОбработкаЗаполнения и модифицируйте ее, добавив вызов вашего запроса.