Имеет ли смысл включать режим разделения итогов для регистра бухгалтерии в 1С:УПП?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При активной одновременной работе пользователей в высоконагруженных информационных базах показатели Центра управления производительностью (ЦУП) нередко фиксируют многосекундные ожидания на блокировках таблиц регистров бухгалтерии. В таких ситуациях возникает закономерный вопрос: стоит ли включать режим разделения итогов для регистра бухгалтерии, поможет ли это снизить время ожидания и какие скрытые риски несет эта настройка в типовой конфигурации «1С:Управление производственным предприятием» (УПП)?

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

Как устроен механизм разделения итогов

Чтобы понять целесообразность применения разделения итогов, рассмотрим внутренний механизм его работы на уровне СУБД:

  1. В стандартном режиме при записи проводки платформа обновляет текущие итоги по соответствующим счетам и аналитике. В таблице итогов блокируется конкретная строка, соответствующая комбинации счета, валюты, подразделения и субконто. Если второй параллельный сеанс пытается записать проводку с той же аналитикой, транзакция встает в ожидание снятия блокировки.
  2. При включенном режиме разделения итогов в таблицу итогов на уровне базы данных добавляется системное поле-разделитель (целое число). При формировании движений платформа распределяет итоги по нескольким параллельным строкам со случайным индексом разделителя.
  3. В результате параллельные транзакции модифицируют физически разные строки в таблице СУБД, даже если проводки сформированы по одним и тем же счетам и значениям субконто. Это существенно снижает конкуренцию транзакций за ресурсы при параллельной записи.

Критерии для включения режима разделения итогов

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

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

Подводные камни и специфика использования в типовой УПП

Проанализируем ключевые факторы риска, из-за которых разделение итогов по умолчанию может быть отключено в конфигурациях поколения УПП:

  1. Режим управления блокировками данных. Механизм разделения итогов раскрывает свой потенциал в управляемом режиме блокировок. В типовой УПП исторически используется автоматический или смешанный режим. В автоматическом режиме Microsoft SQL Server может эскалировать блокировки с уровня отдельных строк до уровня страниц или даже целых таблиц. В таком случае разделение строк не сработает: блокировка всей страницы заблокирует все параллельные разделители и может привести к возникновению взаимных блокировок (deadlocks).
  2. Разрастание таблиц и падение скорости чтения. Так как одна и та же комбинация счета и субконто дробится на множество строк, физический размер таблиц итогов многократно увеличивается. Для получения корректного сальдо платформе теперь требуется прочитать и сложить значения по всем разделителям. Это приводит к существенному замедлению формирования оборотно-сальдовых ведомостей, карточек счетов, а также регламентных процедур закрытия месяца и расчета себестоимости.
  3. Необходимость регулярной свертки. Для поддержания производительности чтения платформа должна регулярно выполнять фоновую свертку разделителей в одну итоговую строку. Если нагрузка на систему непрерывная и свертка не успевает отрабатывать в технологические окна, таблицы итогов продолжают расти, усугубляя проблему быстродействия.

Управление разделением итогов в режиме «1С:Предприятие»

Включение и отключение режима разделения итогов можно выполнить в режиме «1С:Предприятие» без изменения конфигурации и без снятия базы с поддержки. Это можно сделать через стандартную обработку «Управление итогами» или с помощью встроенного языка.

Посмотрим на пример программного включения разделения итогов для регистра бухгалтерии:


ИмяРегистра = "Хозрасчетный";
РегистрБух = РегистрыБухгалтерии[ИмяРегистра];

// Включаем использование разделения итогов
РегистрБух.УстановитьИспользованиеРазделенияИтогов(Истина);

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


ИмяРегистра = "Хозрасчетный";
РегистрыБухгалтерии[ИмяРегистра].УстановитьИспользованиеРазделенияИтогов(Ложь);

Первоочередные причины ожиданий на регистре бухгалтерии

Если ЦУП показывает ожидания порядка 4 секунд на регистре бухгалтерии, разделение итогов не всегда является главным решением. Разберем шаги, которые необходимо выполнить в первую очередь:

  1. Проверка актуальности рассчитанных итогов. Самая распространенная причина длительных ожиданий — отставание границы рассчитанных итогов. Если регламентное задание по сдвигу границы итогов не настроено, при каждой записи документа платформа рассчитывает итоги «на лету» от устаревшей границы до даты проведения. Необходимо убедиться, что период рассчитанных итогов сдвинут вперед относительно текущей даты:
    
    ГраницаИтогов = КонецМесяца(ТекущаяДата());
    РегистрыБухгалтерии.Хозрасчетный.УстановитьПериодРассчитанныхИтогов(ГраницаИтогов);
    
  2. Оптимизация длительности транзакций проведения. Движения по регистру бухгалтерии обычно формируются ближе к концу проведения документа. Однако транзакционная блокировка удерживается до полного завершения транзакции документа. Если в обработке проведения выполняются ресурсоемкие запросы, запись сотен строк в другие регистры накопления или печать форм внутри транзакции, блокировка регистра бухгалтерии удерживается искусственно долго. Решение заключается в сокращении транзакции проведения и выносе некритичных расчетов за ее пределы.
  3. Регламентные и массовые загрузки. При групповом перепроведении документов или массовой загрузке проводок рекомендуется временно отключать расчет текущих итогов, выполняя запись без накладных расходов на итоги, с последующим разовым пересчетом:
    
    РегистрБух = РегистрыБухгалтерии.Хозрасчетный;
    
    // Отключаем расчет текущих итогов на время пакетной записи
    РегистрБух.УстановитьИспользованиеИтогов(Ложь);
    
    // ... Блок массового проведения документов ...
    
    // Включаем итоги обратно и выполняем полный пересчет
    РегистрБух.УстановитьИспользованиеИтогов(Истина);
    РегистрБух.ПересчитатьИтоги();
    

Таким образом, включать режим разделения итогов для регистра бухгалтерии в типовой УПП имеет смысл только после перевода базы на управляемый режим блокировок и предварительной проверки границы рассчитанных итогов. Включение режима требует обязательного тестирования скорости формирования оборотно-сальдовых ведомостей и закрытия месяца.

← На главную