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