Агрегаты оборотных регистров 1С: от включения до обслуживания

· 9 мин

Содержание

Агрегация в 1С — это механизм платформы 8.3, который заранее сворачивает данные оборотного регистра накопления в компактные таблицы-агрегаты. Отчёт по оборотам за год читает уже сжатые суммы по месяцам, а не миллионы строк движений. Работает агрегация только для оборотных регистров и только при чтении виртуальной таблицы Обороты.

Типичная ситуация: в базе пять лет продаж, регистр разросся до десятков миллионов записей, а аналитический отчёт «продажи по номенклатуре за год» открывается минутами. Индексы уже есть, запрос написан аккуратно. Здесь агрегаты и выручают — если регистр подходит под их условия.

Агрегация в 1С простыми словами

У регистра накопления есть таблица движений. У оборотного регистра платформа по умолчанию ведёт ещё и таблицу итогов (оборотов). Агрегат — это дополнительная таблица, где обороты уже сгруппированы:

  • 📅 по выбранной периодичности (день, месяц, квартал и т. д.);
  • 📦 по части измерений регистра, а не по всем сразу.

Пример. У регистра «Продажи» измерения: Номенклатура, Контрагент, Договор, Склад, Подразделение. Отчёт чаще всего группирует по Номенклатуре и месяцу. Агрегат «Номенклатура × месяц» хранит одну строку на товар в месяц. Было 2 млн строк оборотов — стало, скажем, 40 тыс. Запрос к такой таблице выполняется на порядки быстрее.

Платформа сама решает, каким агрегатом ответить на запрос. Разработчик в запросе ничего не меняет: обращение к РегистрНакопления.Продажи.Обороты(...) остаётся прежним.

Чем агрегаты отличаются от итогов

ПризнакРежим итоговРежим агрегатов
Для каких регистровОстатков и оборотовТолько оборотных
Что хранитсяОбороты по всем измерениямОбороты по подмножеству измерений
ПериодичностьЗадаётся платформойСвоя у каждого агрегата
ОбновлениеПри записи движенийОтдельной командой или заданием
Одновременная работа—Взаимоисключают друг друга

Режимы итогов и агрегатов не работают одновременно: включая агрегаты, вы выключаете итоги этого регистра.

Не путайте с агрегатными функциями запроса

Словом «агрегация» в 1С называют ещё две вещи:

  • 🧮 агрегатные функции языка запросов — СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ с СГРУППИРОВАТЬ ПО;
  • 📊 ресурсы в схеме компоновки данных — выражения вида Сумма(Количество), которыми СКД считает итоги по группировкам.

Это обычная группировка «на лету». Агрегаты регистров — механизм хранения. Ниже речь про него, а функции запросов разобраны в разделе про программирование.

Какие бывают агрегаты: периодичность и состав измерений

Агрегат описывается тремя вещами: периодичностью, набором измерений и режимом использования.

Периодичность

ПериодичностьКогда выбирать
ДеньОперативные отчёты за неделю–месяц с разбивкой по дням
МесяцСамый частый выбор: помесячная аналитика за год
Квартал, Полугодие, ГодСводные отчёты за несколько лет
Нет (без периода)Отчёты «за всё время» без разбивки по датам
АвтоПлатформа сама подбирает периодичность

Агрегат с крупной периодичностью не отвечает на запрос с мелкой. Если отчёт строится по дням, агрегат «месяц» не поможет: платформа возьмёт другой агрегат или основную таблицу.

Состав измерений

В агрегат включают только те измерения, по которым реально группируют и отбирают. Ресурсы попадают туда все.

💡 Чем меньше измерений, тем компактнее агрегат. Но запрос с отбором по измерению, которого нет в агрегате, этим агрегатом не обслуживается.

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

  • ✅ Авто — агрегат используется, если он заполнен и подходит запросу. Подходит для большинства случаев.
  • 🔒 Всегда — агрегат держится заполненным постоянно, даже если платформа сочла бы его неэффективным.

Как включить агрегацию в 1С: пошаговая инструкция

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

Шаг 1. Описать агрегаты в Конфигураторе

  1. Откройте Конфигурация → Открыть конфигурацию.
  2. В дереве метаданных найдите нужный оборотный регистр в ветке Регистры накопления.
  3. В контекстном меню регистра откройте редактор агрегатов (для регистров остатков команда недоступна).
  4. Добавьте агрегат, задайте периодичность, использование и отметьте измерения.
  5. Сохраните и обновите конфигурацию базы данных.

Если это типовая конфигурация на поддержке, правка регистра снимет объект с поддержки или потребует режима «с возможностью изменения». Посчитайте, во что это обойдётся при каждом обновлении.

Вручную подбирать состав не обязательно — платформа умеет рассчитывать оптимальные агрегаты по накопленной статистике запросов (шаг 3).

Шаг 2. Включить режим агрегатов

В клиенте 1С:

  1. Включите в настройках пользователя отображение команды Все функции (меню Сервис и настройки → Параметры), если её нет в главном меню.
  2. Откройте Все функции → Стандартные → Управление итогами.
  3. Перейдите в полный режим и найдите вкладку с агрегатами.
  4. Отметьте регистр и включите для него режим агрегатов.
  5. Выполните перестроение агрегатов, затем заполнение (обновление).

Первое заполнение агрегатов большого регистра может идти долго и грузить СУБД. Запускайте его вне рабочего времени.

Шаг 3. Подобрать оптимальные агрегаты

Поработав в режиме агрегатов с типичными отчётами, вернитесь в «Управление итогами». Там есть команда расчёта оптимальных агрегатов: платформа анализирует, какие запросы шли к регистру, и предлагает состав. Его можно сохранить в файл и загрузить в редактор агрегатов Конфигуратора.

Порядок практика:

  1. Описать один-два стартовых агрегата «на глаз» (например, ключевое измерение × месяц).
  2. Дать пользователям поработать неделю-две с привычными отчётами.
  3. Рассчитать оптимальный состав и заменить им стартовый.
  4. Перестроить и заполнить агрегаты.

Шаг 4. Настроить регулярное обновление

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

Перед включением агрегатов
Выполнено: 0 / 6

Когда агрегаты помогают, а когда вредят

Агрегация в 1С не ускоряет всё подряд. Подумайте, подходит ли ваш регистр.

Стоит ли включать агрегаты для этого регистра?

Ошибки при работе с агрегатами и как их избежать

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

Забыли про обновление. Без регламентного задания агрегаты устаревают, и выигрыш тает. Заведите задание и проверяйте, что оно реально выполняется — в списке регламентных заданий видна дата последнего запуска.

Слишком много агрегатов. Каждый агрегат — отдельная таблица в СУБД. Десяток агрегатов на регистр раздувает базу и удлиняет обновление. Держите два-четыре самых полезных.

Агрегат с лишними измерениями. Агрегат, включающий почти все измерения, по размеру близок к таблице оборотов. Платформа может посчитать его неэффективным, а место он займёт.

Периодичность не совпадает с отчётами. Отчёт по дням, агрегат по месяцам — ускорения нет.

Ожидание ускорения от запросов к основной таблице. Агрегаты обслуживают только виртуальную таблицу Обороты. Запрос к физической таблице движений регистра они не ускоряют.

Если после включения агрегатов что-то пошло не так, их всегда можно выключить в «Управлении итогами»: регистр вернётся в режим итогов. Итоги после этого стоит пересчитать там же.

Как агрегация влияет на производительность: как замерить самому

Универсальной цифры ускорения нет. Она зависит от того, во сколько раз агрегат меньше таблицы оборотов. Свёртка 2 млн строк до 40 тыс. — это сжатие в 50 раз, и время чтения падает примерно соразмерно. Свёртка 2 млн до 1,5 млн почти ничего не даёт.

Поэтому замеряйте на своей базе:

  1. До включения запустите 3-5 ключевых отчётов с типовыми параметрами и запишите время каждого.
  2. Включите агрегаты, перестройте и заполните их.
  3. Повторите те же отчёты с теми же параметрами. Первый запуск не учитывайте — кэш СУБД ещё не прогрет.
  4. Для точной картины используйте замер производительности в отладчике Конфигуратора или технологический журнал с событием DBMSSQL (для MS SQL) — он покажет, к какой таблице ушёл запрос.

Что ещё смотреть:

  • ⏱ время обновления агрегатов — если оно сравнимо с интервалом задания, агрегатов слишком много;
  • 💾 размер базы — прирост на объём таблиц агрегатов;
  • ✍️ время проведения документов — в режиме агрегатов оно не должно расти, ведь агрегаты пересчитываются отдельно.

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

Агрегаты во встроенном языке: управление из кода

Всё, что делает «Управление итогами», доступно через менеджер регистра. Основные методы:

МетодЧто делает
УстановитьРежимАгрегатов(Истина)Включает режим агрегатов (Ложь — возврат к итогам)
ПолучитьРежимАгрегатов()Возвращает, включён ли режим
УстановитьИспользованиеАгрегатов(Истина)Разрешает использовать агрегаты в запросах
ПерестроитьАгрегаты()Пересоздаёт агрегаты по текущему описанию
ОбновитьАгрегаты()Дозаполняет агрегаты накопившимися изменениями
ОчиститьАгрегаты()Очищает данные агрегатов
ПолучитьАгрегаты()Возвращает сведения о текущих агрегатах
ПолучитьОптимальныеАгрегаты()Рассчитывает оптимальный состав по статистике

Регламентное задание обновления

Процедура для общего модуля, которую вызывает регламентное задание (например, раз в час или ночью):

Процедура ОбновлениеАгрегатовПродаж() Экспорт

    МенеджерРегистра = РегистрыНакопления.Продажи;

    Если НЕ МенеджерРегистра.ПолучитьРежимАгрегатов() Тогда
        Возврат;
    КонецЕсли;

    Попытка
        МенеджерРегистра.ОбновитьАгрегаты();
    Исключение
        ЗаписьЖурналаРегистрации("Обновление агрегатов",
            УровеньЖурналаРегистрации.Ошибка, , ,
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;

КонецПроцедуры

Проверка режима защищает от ситуации, когда агрегаты выключили, а задание продолжает работать. Ошибка попадает в журнал регистрации, а не теряется.

Методы управления агрегатами требуют административных прав и выполняются на сервере. Перестроение тяжелее обновления: в рабочее время запускайте только ОбновитьАгрегаты().

Включение режима из кода

МенеджерРегистра = РегистрыНакопления.Продажи;
МенеджерРегистра.УстановитьРежимАгрегатов(Истина);
МенеджерРегистра.ПерестроитьАгрегаты();
МенеджерРегистра.ОбновитьАгрегаты();
МенеджерРегистра.УстановитьИспользованиеАгрегатов(Истина);

Такой фрагмент удобен в обработчике обновления своей конфигурации или в разовой обработке администратора.

Агрегатные функции в запросах

Если под «агрегацией» вы имели в виду группировку в запросе, вот типичный пример — сумма продаж по товарам за период:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Продажи.Номенклатура КАК Номенклатура,
|    СУММА(Продажи.СуммаОборот) КАК Сумма,
|    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Контрагент) КАК ЧислоПокупателей
|ИЗ
|    РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи
|СГРУППИРОВАТЬ ПО
|    Продажи.Номенклатура
|ИМЕЮЩИЕ
|    СУММА(Продажи.СуммаОборот) > 0";
Запрос.УстановитьПараметр("Начало", НачалоГода(ТекущаяДата()));
Запрос.УстановитьПараметр("Конец", КонецДня(ТекущаяДата()));
Результат = Запрос.Выполнить().Выгрузить();

Все поля без агрегатной функции обязаны стоять в СГРУППИРОВАТЬ ПО, иначе запрос не выполнится. Условие на результат агрегатной функции пишут в ИМЕЮЩИЕ, а не в ГДЕ. Если регистр работает в режиме агрегатов, такой запрос к таблице Обороты как раз и получит ускорение.

Альтернативы агрегации: когда она не помогает

Агрегаты решают одну задачу — быстрые обороты по немногим измерениям. Если тормозит другое, нужны другие инструменты.

ПроблемаЧто попробовать вместо агрегатов
Медленные остаткиРежим итогов, пересчёт итогов, установка периода рассчитанных итогов
Отбор по реквизиту, а не по измерениюПеренести отбор в параметры виртуальной таблицы, добавить индекс
Отчёты с детализацией по регистраторамОптимизация запроса, временные таблицы, ограничение периода
Блокировки при проведенииРежим разделения итогов, управляемые блокировки
Тяжёлая аналитика по многим разрезамОтдельный регистр сведений с предрассчитанными данными, внешнее хранилище для BI
Файловая база на десятки гигабайтПеревод на клиент-серверный вариант с СУБД

💡 Частая находка при разборе медленного отчёта — условие в ГДЕ вместо параметров виртуальной таблицы. Платформа сначала собирает обороты по всем данным, потом фильтрует. Перенос отбора в параметры Обороты(&Начало, &Конец, , Номенклатура В (&Список)) иногда даёт больше, чем любые агрегаты.

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

Можно ли включить агрегаты для регистра остатков?
Нет. Агрегаты доступны только для оборотных регистров накопления. Для регистров остатков используется режим итогов.
Нужно ли менять запросы в отчётах после включения агрегатов?
Нет. Платформа сама выбирает подходящий агрегат при обращении к виртуальной таблице Обороты. Текст запроса остаётся прежним.
Как часто обновлять агрегаты?
Зависит от того, насколько свежие данные нужны в отчётах и сколько длится обновление. Частый вариант — раз в час днём и полное перестроение по выходным.
Работают ли агрегаты в файловой базе?
Механизм платформенный и в файловом варианте тоже доступен. Но заметный эффект он даёт на больших объёмах, которые обычно уже живут в клиент-серверной базе.
Что будет с агрегатами после обновления конфигурации?
Если описание агрегатов или структура регистра изменились, агрегаты нужно перестроить и заполнить заново. Добавьте этот шаг в регламент обновления.