К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить итоги в запросе 1С

Как получить итоги в запросе 1С: агрегатные функции СУММА и КОЛИЧЕСТВО, конструкции СГРУППИРОВАТЬ ПО и ИТОГИ ПО, итоги по иерархии и типичные ошибки.

Итоги в запросах 1С нужны, когда требуется не просто список строк, а сводные значения: сумма продаж по контрагенту, количество документов по складу, остаток товара по группе номенклатуры. Язык запросов 1С предоставляет для этого три основных механизма: агрегатные функции с группировкой, секцию ИТОГИ ПО для многоуровневых итогов и виртуальные таблицы регистров, которые возвращают уже рассчитанные итоги.

Выбор механизма зависит от задачи. Если нужна плоская таблица «измерение — сумма», достаточно группировки с функцией СУММА. Если результат должен содержать и детальные строки, и подытоги по группам — используется ИТОГИ ПО. А для остатков и оборотов по регистрам почти всегда правильнее обращаться к виртуальным таблицам, чем суммировать движения вручную.

Ниже разобраны все три подхода с примерами кода, правила проверки результата и типичные ошибки, из-за которых итоги получаются неверными или запрос работает медленно.

Агрегатные функции и группировка: базовый способ получить итог

Самый частый сценарий — свернуть детальные строки до нужного уровня. Для этого в списке выборки указывают поля группировки и агрегатные функции, а после выборки добавляют секцию СГРУППИРОВАТЬ ПО. Доступные функции: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ.

ВЫБРАТЬ

Продажи.Контрагент КАК Контрагент,

СУММА(Продажи.СуммаОборот) КАК СуммаПродаж,

КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Регистратор) КАК ЧислоДокументов

ИЗ

РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК Продажи

СГРУППИРОВАТЬ ПО

Продажи.Контрагент

Ключевое правило: каждое поле в списке выборки либо входит в СГРУППИРОВАТЬ ПО, либо обёрнуто в агрегатную функцию. Если поле не агрегировано и не указано в группировке, запрос вернёт ошибку ещё на этапе проверки в конструкторе.

Обратите внимание на конструкцию КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...) — она считает уникальные значения, а не все строки. Без ключевого слова РАЗЛИЧНЫЕ вы получите количество строк выборки, что при соединениях таблиц часто даёт завышенные числа.

Как получить итоги вместе с детальными строками через ИТОГИ ПО

Группировка уничтожает детальные строки — в результате остаются только свёрнутые записи. Когда нужен отчёт вида «контрагент, под ним его документы, в конце группы подытог», применяют секцию ИТОГИ ПО. Запрос возвращает и детали, и итоговые записи одновременно.

ВЫБРАТЬ

Продажи.Контрагент КАК Контрагент,

Продажи.Регистратор КАК Документ,

Продажи.СуммаОборот КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК Продажи

ИТОГИ

СУММА(Сумма)

ПО

Контрагент

При обходе такого результата в коде используют метод Выбрать с параметром ОбходРезультатаЗапроса.ПоГруппировкам. Сначала обходят записи типа «Группировка» по контрагентам, затем внутри каждой группы — детальные записи. Поле группировки в детальных строках заполнено значением, а в итоговых строках детальные поля содержат NULL.

Конструкция ИТОГИ ПО ОБЩИЕ добавляет строку с общим итогом по всей выборке. Можно комбинировать: ИТОГИ СУММА(Сумма) ПО Контрагент, Регистратор — тогда будут подытоги по каждому уровню. Несколько уровней указываются через запятую, порядок определяет вложенность групп.

Итоги по иерархии и общие итоги

Если измерение иерархическое (например, номенклатура с группами), ключевое слово ИЕРАРХИЯ после поля группировки добавляет итоги по родительским группам: ИТОГИ СУММА(Количество) ПО Номенклатура ИЕРАРХИЯ. Это удобно для отчётов по дереву товарных групп без самостоятельного построения дерева в коде.

У иерархических итогов есть ограничение: они корректно работают только для иерархии групп и элементов. Для иерархических регистров и сложных структур с несколькими родителями результат может не совпасть с ожиданием — в таких случаях итоги по дереву строят программно.

Общие итоги (ОБЩИЕ) полезны, когда отчёт должен показать итоговую строку «Всего» внизу. В СКД и в консоли запросов эта строка отображается автоматически при обходе по группировкам, вручную суммировать её в коде не нужно.

Порядок построения запроса с итогами
  1. 1
    Определите уровень детализации: только сводка или сводка плюс детальные строки
  2. 2
    Для сводки напишите агрегатные функции и СГРУППИРОВАТЬ ПО, для деталей с подытогами — ИТОГИ ПО
  3. 3
    Проверьте запрос в консоли запросов на копии базы: сравните сумму итоговых строк с суммой деталей
  4. 4
    При обходе в коде используйте ОбходРезультатаЗапроса.ПоГруппировкам и проверяйте тип записи
  5. 5
    Оцените скорость выполнения на реальном объёме данных и при необходимости добавьте отборы до группировки

Итоги по регистрам: почему виртуальные таблицы лучше ручного суммирования

Для регистров накопления и бухгалтерии платформа хранит предрассчитанные итоги. Виртуальные таблицы Остатки, Обороты, ОстаткиИОбороты читают именно их, поэтому запрос к виртуальной таблице выполняется в разы быстрее, чем суммирование всех движений физической таблицы регистра.

// Быстро — читаются хранимые итоги

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки

// Медленно — сканируются все движения

ВЫБРАТЬ

Движения.Номенклатура,

СУММА(Движения.Количество)

ИЗ

РегистрНакопления.ТоварыНаСкладах КАК Движения

СГРУППИРОВАТЬ ПО

Движения.Номенклатура

Параметры виртуальной таблицы (период, условие отбора) передаются в скобках после её имени. Отбор в параметрах работает быстрее, чем секция ГДЕ, потому что применяется на этапе чтения итогов. Условие ГДЕ поверх виртуальной таблицы фильтрует уже полученный результат и не ускоряет выборку.

Ограничение: если регистр рассчитан на хранимые итоги, но итоги отключены или срезаны (например, рассчитаны не на текущий период), запрос к виртуальной таблице может выполняться медленно. Проверить состояние итогов можно в режиме «Управление итогами» или через метод ПолучитьИспользованиеИтогов.

Итоги в СКД и динамических списках

В системе компоновки данных итоги настраиваются без изменения текста запроса: на закладке «Настройки» добавляются группировки, а ресурсы (суммируемые поля) описываются на закладке «Ресурсы». СКД сама формирует итоговые записи по каждой группировке и общий итог.

Ресурс должен быть описан выражением с агрегатной функцией, например СУММА(СуммаОборот). Если поле не добавлено в ресурсы, в итоговых строках оно будет пустым — это частая причина «пропавших» итогов в отчётах на СКД.

В динамических списках форм итоги подвала считаются только по видимой странице данных, если не включён специальный режим. Для точных сводок по всем данным список не подходит — используйте отчёт или программный запрос.

Сравнение способов получения итогов

СГРУППИРОВАТЬ ПО + СУММА

Плоская сводная таблица без деталей. Быстро и просто, но детальные строки теряются.

ИТОГИ ПО

Детали и подытоги в одном результате. Требует обхода по группировкам в коде, сложнее в отладке.

Виртуальные таблицы регистров

Остатки и обороты из хранимых итогов. Максимальная скорость, но только для регистров и их типовых видов итогов.

Ресурсы СКД

Итоги настраиваются в отчёте без изменения запроса. Подходит для пользовательских отчётов, избыточно для разовых выборок.

Проверка результата и типичные ошибки

После написания запроса проверьте его в консоли запросов на копии рабочей базы. Базовый контроль: сумма итоговых строк по группировке должна равняться сумме детальных строк этой группы, а общий итог — сумме всех групп. Расхождение почти всегда означает ошибку в соединениях или в отборах.

Самая частая причина неверных итогов — задвоение строк при соединении таблиц по неуникальному ключу. Если к продажам присоединить таблицу, где контрагент встречается дважды, суммы удвоятся. Признак проблемы: итоги кратно завышены относительно ожидаемых. Лечение — соединять с предварительно сгруппированной вложенной таблицей.

Вторая группа ошибок связана с NULL. СУММА по полю, где встречаются NULL, игнорирует такие строки, а сравнение итога с NULL всегда ложно. Используйте ЕСТЬNULL(Поле, 0) перед суммированием, если поле может быть не заполнено.

Типичные ошибки
01
Соединение с таблицей по неуникальному ключу — итоги задваиваются или увеличиваются кратно
02
Суммирование движений физической таблицы вместо виртуальной таблицы Остатки — запрос работает в десятки раз медленнее
03
КОЛИЧЕСТВО без РАЗЛИЧНЫЕ — считаются строки выборки, а не уникальные документы
04
Отбор в ГДЕ вместо параметров виртуальной таблицы — лишний объём читаемых данных
05
Забытый ресурс в СКД — итоговые строки отчёта пустые
Контрольные точки

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

Сумма подытогов по группе
Норма

Равна сумме детальных строк группы

Тревожный признак

Расходится — проверяйте соединения и отборы

Общий итог
Норма

Равен сумме итогов всех группировок

Тревожный признак

Меньше суммы групп — есть строки с NULL в поле группировки

Время выполнения запроса по остаткам
Норма

Секунды на большом регистре

Тревожный признак

Минуты — вероятно, итоги регистра не рассчитаны или запрос идёт к физической таблице

Частые вопросы

Чем ИТОГИ ПО отличается от СГРУППИРОВАТЬ ПО?

СГРУППИРОВАТЬ ПО сворачивает выборку: в результате остаются только итоговые строки, по одной на комбинацию значений группировки. ИТОГИ ПО сохраняет детальные строки и добавляет к ним итоговые записи по указанным полям, что подходит для отчётов с детализацией.

Как получить общий итог по всей выборке?

Добавьте в секцию ИТОГИ ключевое слово ОБЩИЕ: ИТОГИ СУММА(Сумма) ПО ОБЩИЕ. Можно комбинировать с группировками через запятую — тогда будут и подытоги по группам, и одна строка общего итога.

Почему СУММА возвращает NULL?

Если в группе все значения суммируемого поля равны NULL, результат СУММА тоже будет NULL. Оберните поле в ЕСТЬNULL(Поле, 0) внутри агрегатной функции, чтобы получить ноль вместо пустого значения.

Можно ли получить итоги без запроса, прямо в таблице значений?

Да. У таблицы значений есть метод Свернуть(КолонкиГруппировок, КолонкиСуммирования), который группирует строки и суммирует указанные колонки. Это удобно для небольших таблиц, уже загруженных в память, но для выборки из базы запрос эффективнее.

Почему запрос к виртуальной таблице Остатки работает медленно?

Чаще всего итоги регистра не рассчитаны на нужный период или их использование отключено. Проверьте состояние итогов в режиме управления итогами. Также убедитесь, что отборы переданы параметрами виртуальной таблицы, а не вынесены в секцию ГДЕ.

Как вывести итоги в отчёте на СКД без изменения запроса?

Добавьте суммируемые поля на закладку «Ресурсы» с выражением вида СУММА(Поле) и создайте группировки в настройках отчёта. СКД автоматически сформирует итоговые строки по каждой группировке и общий итог.

Итог

Что важно запомнить

Простые сводки делайте через агрегатные функции и СГРУППИРОВАТЬ ПО, отчёты с деталями и подытогами — через ИТОГИ ПО, остатки и обороты берите из виртуальных таблиц регистров. Проверяйте итоги сверкой с детальными строками и следите за задвоениями при соединениях.