Агрегаты оборотных регистров 1С: от включения до обслуживания
Содержание
Агрегация в 1С — это механизм платформы 8.3, который заранее сворачивает данные оборотного регистра накопления в компактные таблицы-агрегаты. Отчёт по оборотам за год читает уже сжатые суммы по месяцам, а не миллионы строк движений. Работает агрегация только для оборотных регистров и только при чтении виртуальной таблицы Обороты.
Типичная ситуация: в базе пять лет продаж, регистр разросся до десятков миллионов записей, а аналитический отчёт «продажи по номенклатуре за год» открывается минутами. Индексы уже есть, запрос написан аккуратно. Здесь агрегаты и выручают — если регистр подходит под их условия.
Агрегация в 1С простыми словами
У регистра накопления есть таблица движений. У оборотного регистра платформа по умолчанию ведёт ещё и таблицу итогов (оборотов). Агрегат — это дополнительная таблица, где обороты уже сгруппированы:
- 📅 по выбранной периодичности (день, месяц, квартал и т. д.);
- 📦 по части измерений регистра, а не по всем сразу.
Пример. У регистра «Продажи» измерения: Номенклатура, Контрагент, Договор, Склад, Подразделение. Отчёт чаще всего группирует по Номенклатуре и месяцу. Агрегат «Номенклатура × месяц» хранит одну строку на товар в месяц. Было 2 млн строк оборотов — стало, скажем, 40 тыс. Запрос к такой таблице выполняется на порядки быстрее.
Платформа сама решает, каким агрегатом ответить на запрос. Разработчик в запросе ничего не меняет: обращение к РегистрНакопления.Продажи.Обороты(...) остаётся прежним.
Чем агрегаты отличаются от итогов
| Признак | Режим итогов | Режим агрегатов |
|---|---|---|
| Для каких регистров | Остатков и оборотов | Только оборотных |
| Что хранится | Обороты по всем измерениям | Обороты по подмножеству измерений |
| Периодичность | Задаётся платформой | Своя у каждого агрегата |
| Обновление | При записи движений | Отдельной командой или заданием |
| Одновременная работа | — | Взаимоисключают друг друга |
Режимы итогов и агрегатов не работают одновременно: включая агрегаты, вы выключаете итоги этого регистра.
Не путайте с агрегатными функциями запроса
Словом «агрегация» в 1С называют ещё две вещи:
- 🧮 агрегатные функции языка запросов —
СУММА,КОЛИЧЕСТВО,МИНИМУМ,МАКСИМУМ,СРЕДНЕЕсСГРУППИРОВАТЬ ПО; - 📊 ресурсы в схеме компоновки данных — выражения вида
Сумма(Количество), которыми СКД считает итоги по группировкам.
Это обычная группировка «на лету». Агрегаты регистров — механизм хранения. Ниже речь про него, а функции запросов разобраны в разделе про программирование.
Какие бывают агрегаты: периодичность и состав измерений
Агрегат описывается тремя вещами: периодичностью, набором измерений и режимом использования.
Периодичность
| Периодичность | Когда выбирать |
|---|---|
| День | Оперативные отчёты за неделю–месяц с разбивкой по дням |
| Месяц | Самый частый выбор: помесячная аналитика за год |
| Квартал, Полугодие, Год | Сводные отчёты за несколько лет |
| Нет (без периода) | Отчёты «за всё время» без разбивки по датам |
| Авто | Платформа сама подбирает периодичность |
Агрегат с крупной периодичностью не отвечает на запрос с мелкой. Если отчёт строится по дням, агрегат «месяц» не поможет: платформа возьмёт другой агрегат или основную таблицу.
Состав измерений
В агрегат включают только те измерения, по которым реально группируют и отбирают. Ресурсы попадают туда все.
💡 Чем меньше измерений, тем компактнее агрегат. Но запрос с отбором по измерению, которого нет в агрегате, этим агрегатом не обслуживается.
Использование
- ✅ Авто — агрегат используется, если он заполнен и подходит запросу. Подходит для большинства случаев.
- 🔒 Всегда — агрегат держится заполненным постоянно, даже если платформа сочла бы его неэффективным.
Как включить агрегацию в 1С: пошаговая инструкция
Работа идёт в два этапа: описать агрегаты в конфигурации и включить режим в пользовательской базе.
Шаг 1. Описать агрегаты в Конфигураторе
- Откройте
Конфигурация → Открыть конфигурацию. - В дереве метаданных найдите нужный оборотный регистр в ветке
Регистры накопления. - В контекстном меню регистра откройте редактор агрегатов (для регистров остатков команда недоступна).
- Добавьте агрегат, задайте периодичность, использование и отметьте измерения.
- Сохраните и обновите конфигурацию базы данных.
Если это типовая конфигурация на поддержке, правка регистра снимет объект с поддержки или потребует режима «с возможностью изменения». Посчитайте, во что это обойдётся при каждом обновлении.
Вручную подбирать состав не обязательно — платформа умеет рассчитывать оптимальные агрегаты по накопленной статистике запросов (шаг 3).
Шаг 2. Включить режим агрегатов
В клиенте 1С:
- Включите в настройках пользователя отображение команды
Все функции(менюСервис и настройки → Параметры), если её нет в главном меню. - Откройте
Все функции → Стандартные → Управление итогами. - Перейдите в полный режим и найдите вкладку с агрегатами.
- Отметьте регистр и включите для него режим агрегатов.
- Выполните перестроение агрегатов, затем заполнение (обновление).
Первое заполнение агрегатов большого регистра может идти долго и грузить СУБД. Запускайте его вне рабочего времени.
Шаг 3. Подобрать оптимальные агрегаты
Поработав в режиме агрегатов с типичными отчётами, вернитесь в «Управление итогами». Там есть команда расчёта оптимальных агрегатов: платформа анализирует, какие запросы шли к регистру, и предлагает состав. Его можно сохранить в файл и загрузить в редактор агрегатов Конфигуратора.
Порядок практика:
- Описать один-два стартовых агрегата «на глаз» (например, ключевое измерение × месяц).
- Дать пользователям поработать неделю-две с привычными отчётами.
- Рассчитать оптимальный состав и заменить им стартовый.
- Перестроить и заполнить агрегаты.
Шаг 4. Настроить регулярное обновление
Агрегаты не обновляются автоматически при записи движений. Обновление запускают отдельно — вручную в «Управлении итогами» или регламентным заданием, которое вызывает метод ОбновитьАгрегаты() (код ниже).
Когда агрегаты помогают, а когда вредят
Агрегация в 1С не ускоряет всё подряд. Подумайте, подходит ли ваш регистр.
Ошибки при работе с агрегатами и как их избежать
Включили режим, но не заполнили. Агрегаты описаны и режим включён, а отчёты не ускорились. Пустые агрегаты не используются — нужно перестроить и заполнить их.
Забыли про обновление. Без регламентного задания агрегаты устаревают, и выигрыш тает. Заведите задание и проверяйте, что оно реально выполняется — в списке регламентных заданий видна дата последнего запуска.
Слишком много агрегатов. Каждый агрегат — отдельная таблица в СУБД. Десяток агрегатов на регистр раздувает базу и удлиняет обновление. Держите два-четыре самых полезных.
Агрегат с лишними измерениями. Агрегат, включающий почти все измерения, по размеру близок к таблице оборотов. Платформа может посчитать его неэффективным, а место он займёт.
Периодичность не совпадает с отчётами. Отчёт по дням, агрегат по месяцам — ускорения нет.
Ожидание ускорения от запросов к основной таблице. Агрегаты обслуживают только виртуальную таблицу Обороты. Запрос к физической таблице движений регистра они не ускоряют.
Если после включения агрегатов что-то пошло не так, их всегда можно выключить в «Управлении итогами»: регистр вернётся в режим итогов. Итоги после этого стоит пересчитать там же.
Как агрегация влияет на производительность: как замерить самому
Универсальной цифры ускорения нет. Она зависит от того, во сколько раз агрегат меньше таблицы оборотов. Свёртка 2 млн строк до 40 тыс. — это сжатие в 50 раз, и время чтения падает примерно соразмерно. Свёртка 2 млн до 1,5 млн почти ничего не даёт.
Поэтому замеряйте на своей базе:
- До включения запустите 3-5 ключевых отчётов с типовыми параметрами и запишите время каждого.
- Включите агрегаты, перестройте и заполните их.
- Повторите те же отчёты с теми же параметрами. Первый запуск не учитывайте — кэш СУБД ещё не прогрет.
- Для точной картины используйте замер производительности в отладчике Конфигуратора или технологический журнал с событием
DBMSSQL(для MS SQL) — он покажет, к какой таблице ушёл запрос.
Что ещё смотреть:
- ⏱ время обновления агрегатов — если оно сравнимо с интервалом задания, агрегатов слишком много;
- 💾 размер базы — прирост на объём таблиц агрегатов;
- ✍️ время проведения документов — в режиме агрегатов оно не должно расти, ведь агрегаты пересчитываются отдельно.
Самый наглядный признак успеха: тяжёлый годовой отчёт стал открываться за секунды, а время записи документов не изменилось.
Агрегаты во встроенном языке: управление из кода
Всё, что делает «Управление итогами», доступно через менеджер регистра. Основные методы:
| Метод | Что делает |
|---|---|
УстановитьРежимАгрегатов(Истина) | Включает режим агрегатов (Ложь — возврат к итогам) |
ПолучитьРежимАгрегатов() | Возвращает, включён ли режим |
УстановитьИспользованиеАгрегатов(Истина) | Разрешает использовать агрегаты в запросах |
ПерестроитьАгрегаты() | Пересоздаёт агрегаты по текущему описанию |
ОбновитьАгрегаты() | Дозаполняет агрегаты накопившимися изменениями |
ОчиститьАгрегаты() | Очищает данные агрегатов |
ПолучитьАгрегаты() | Возвращает сведения о текущих агрегатах |
ПолучитьОптимальныеАгрегаты() | Рассчитывает оптимальный состав по статистике |
Регламентное задание обновления
Процедура для общего модуля, которую вызывает регламентное задание (например, раз в час или ночью):
Процедура ОбновлениеАгрегатовПродаж() Экспорт
МенеджерРегистра = РегистрыНакопления.Продажи;
Если НЕ МенеджерРегистра.ПолучитьРежимАгрегатов() Тогда
Возврат;
КонецЕсли;
Попытка
МенеджерРегистра.ОбновитьАгрегаты();
Исключение
ЗаписьЖурналаРегистрации("Обновление агрегатов",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Проверка режима защищает от ситуации, когда агрегаты выключили, а задание продолжает работать. Ошибка попадает в журнал регистрации, а не теряется.
Методы управления агрегатами требуют административных прав и выполняются на сервере. Перестроение тяжелее обновления: в рабочее время запускайте только ОбновитьАгрегаты().
Включение режима из кода
МенеджерРегистра = РегистрыНакопления.Продажи;
МенеджерРегистра.УстановитьРежимАгрегатов(Истина);
МенеджерРегистра.ПерестроитьАгрегаты();
МенеджерРегистра.ОбновитьАгрегаты();
МенеджерРегистра.УстановитьИспользованиеАгрегатов(Истина);
Такой фрагмент удобен в обработчике обновления своей конфигурации или в разовой обработке администратора.
Агрегатные функции в запросах
Если под «агрегацией» вы имели в виду группировку в запросе, вот типичный пример — сумма продаж по товарам за период:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура КАК Номенклатура,
| СУММА(Продажи.СуммаОборот) КАК Сумма,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Контрагент) КАК ЧислоПокупателей
|ИЗ
| РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Номенклатура
|ИМЕЮЩИЕ
| СУММА(Продажи.СуммаОборот) > 0";
Запрос.УстановитьПараметр("Начало", НачалоГода(ТекущаяДата()));
Запрос.УстановитьПараметр("Конец", КонецДня(ТекущаяДата()));
Результат = Запрос.Выполнить().Выгрузить();
Все поля без агрегатной функции обязаны стоять в СГРУППИРОВАТЬ ПО, иначе запрос не выполнится. Условие на результат агрегатной функции пишут в ИМЕЮЩИЕ, а не в ГДЕ. Если регистр работает в режиме агрегатов, такой запрос к таблице Обороты как раз и получит ускорение.
Альтернативы агрегации: когда она не помогает
Агрегаты решают одну задачу — быстрые обороты по немногим измерениям. Если тормозит другое, нужны другие инструменты.
| Проблема | Что попробовать вместо агрегатов |
|---|---|
| Медленные остатки | Режим итогов, пересчёт итогов, установка периода рассчитанных итогов |
| Отбор по реквизиту, а не по измерению | Перенести отбор в параметры виртуальной таблицы, добавить индекс |
| Отчёты с детализацией по регистраторам | Оптимизация запроса, временные таблицы, ограничение периода |
| Блокировки при проведении | Режим разделения итогов, управляемые блокировки |
| Тяжёлая аналитика по многим разрезам | Отдельный регистр сведений с предрассчитанными данными, внешнее хранилище для BI |
| Файловая база на десятки гигабайт | Перевод на клиент-серверный вариант с СУБД |
💡 Частая находка при разборе медленного отчёта — условие в ГДЕ вместо параметров виртуальной таблицы. Платформа сначала собирает обороты по всем данным, потом фильтрует. Перенос отбора в параметры Обороты(&Начало, &Конец, , Номенклатура В (&Список)) иногда даёт больше, чем любые агрегаты.
Частые вопросы
Можно ли включить агрегаты для регистра остатков?
Нужно ли менять запросы в отчётах после включения агрегатов?
Обороты. Текст запроса остаётся прежним.