Открыть сервис

Агрегатные функции 1С

Агрегатные функции 1С — это встроенные средства языка запросов платформы «1С:Предприятие», предназначенные для выполнения групповых вычислений над множеством записей таблиц базы данных. Они позволяют получать обобщённые (суммарные, средние, минимальные, максимальные) значения по группам данных или по всей выборке без необходимости программного перебора записей. Агрегатные функции являются неотъемлемой частью системы компоновки данных (СКД) и запросов к виртуальным таблицам, что обеспечивает высокую производительность при работе с большими объёмами информации.

История и назначение

Агрегатные функции появились в языке запросов 1С начиная с версии платформы 7.7, но наибольшее развитие получили в версии 8.0 и последующих. Их внедрение было обусловлено необходимостью обработки данных непосредственно на стороне сервера баз данных (СУБД), что значительно сокращает время выполнения отчётов и обработок по сравнению с клиентским суммированием.

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

Классификация и синтаксис

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

Основные функции

  • СУММА (СУММА(<Поле>)) — возвращает сумму всех значений указанного поля в группе или во всей выборке. Применима только к числовым полям. Если в группе нет записей, возвращает NULL.
  • СРЕДНЕЕ (СРЗНАЧ(<Поле>)) — вычисляет среднее арифметическое значение. Также работает только с числовыми данными. Игнорирует NULL-значения.
  • МИНИМУМ (МИНИМУМ(<Поле>)) — находит наименьшее значение в группе. Работает с числовыми, строковыми и датовыми полями. Для строк сравнение происходит по алфавитному порядку, для дат — по хронологическому.
  • МАКСИМУМ (МАКСИМУМ(<Поле>)) — находит наибольшее значение. Аналогична МИНИМУМ по области применения.
  • КОЛИЧЕСТВО (КОЛИЧЕСТВО(<Поле>)) — возвращает количество записей в группе. Если указано конкретное поле, подсчитываются только записи, где это поле не равно NULL. Синтаксис КОЛИЧЕСТВО(РАЗЛИЧНЫЕ <Поле>) позволяет подсчитать количество уникальных значений.

Специализированные функции

  • СУММАКОЛЬЦО — устаревшая функция, использовавшаяся в версиях 7.7 для суммирования по иерархии. В современных версиях заменена механизмами итогов по иерархии.
  • Агрегатные функции для дат — напрямую не существуют, но с помощью МИНИМУМ и МАКСИМУМ можно получить первую и последнюю дату в группе.

Использование в запросах

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

``sql ВЫБРАТЬ Товары.Номенклатура КАК Номенклатура, СУММА(Товары.Количество) КАК ОбщееКоличество, СРЗНАЧ(Товары.Цена) КАК СредняяЦена ИЗ Справочник.Товары КАК Товары СГРУППИРОВАТЬ ПО Товары.Номенклатура ``

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

Условия для агрегатных функций

Для наложения условий на агрегированные значения используется секция ИМЕЮЩИЕ, которая работает аналогично ГДЕ, но применяется после группировки. Например:

``sql ВЫБРАТЬ Товары.Номенклатура, СУММА(Товары.Сумма) КАК ИтоговаяСумма ИЗ Справочник.Товары КАК Товары СГРУППИРОВАТЬ ПО Товары.Номенклатура ИМЕЮЩИЕ СУММА(Товары.Сумма) > 10000 ``

Применение в системе компоновки данных (СКД)

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

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

Особенности и ограничения

  • Типы данных: функции СУММА и СРЗНАЧ применимы только к числовым полям. Попытка использовать их с нечисловыми типами приведёт к ошибке выполнения запроса.
  • Обработка NULL: агрегатные функции игнорируют NULL-значения, за исключением КОЛИЧЕСТВО(*), которое считает все записи, включая содержащие NULL.
  • Производительность: использование агрегатных функций в запросах к большим таблицам может быть ресурсоёмким. Рекомендуется накладывать фильтры в секции ГДЕ до группировки, чтобы уменьшить объём обрабатываемых данных.
  • Вложенность: агрегатные функции не могут быть вложены друг в друга (например, СУММА(СРЗНАЧ(...))). Для таких вычислений требуется использовать вложенные запросы.
  • Виртуальные таблицы: агрегатные функции часто применяются к виртуальным таблицам регистров (например, Остатки, Обороты), где они уже частично агрегированы на уровне СУБД.

Примеры практического использования

  1. Расчёт общей суммы продаж по контрагентам:

``sql ВЫБРАТЬ Продажи.Контрагент, СУММА(Продажи.СуммаДокумента) КАК ОбщаяСумма ИЗ Документ.РеализацияТоваровУслуг КАК Продажи СГРУППИРОВАТЬ ПО Продажи.Контрагент ``

  1. Определение максимальной цены товара в каждой категории:

``sql ВЫБРАТЬ Товары.Категория, МАКСИМУМ(Товары.Цена) КАК МаксЦена ИЗ Справочник.Номенклатура КАК Товары СГРУППИРОВАТЬ ПО Товары.Категория ``

  1. Подсчёт количества уникальных поставщиков:

``sql ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поставщики.Наименование) КАК КоличествоПоставщиков ИЗ Справочник.Контрагенты КАК Поставщики ГДЕ Поставщики.ЭтоПоставщик = ИСТИНА ``

Значение в разработке

Агрегатные функции являются одним из ключевых инструментов для разработчиков на платформе 1С. Они позволяют:

  • Сократить объём программного кода, избегая циклов и временных таблиц.
  • Перенести вычислительную нагрузку на сервер базы данных, что повышает производительность.
  • Реализовать сложные аналитические отчёты с минимальными усилиями.
  • Обеспечить корректную работу с большими объёмами данных (миллионы записей) при правильной настройке индексов и фильтров.

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

Источники

  • Радченко М. Г., Хрусталёва Е. Ю. «1С:Предприятие 8.3. Практическое пособие разработчика». — 1С-Паблишинг, 2020.
  • Официальная документация к платформе «1С:Предприятие 8.3» — раздел «Язык запросов».
  • Гончаров Д. И. «Разработка отчётов в 1С:Предприятие 8.3. Система компоновки данных». — БХВ-Петербург, 2019.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →