Устройство и использование режима разделения итогов регистров

Данный режим поддерживается для регистра накопления и регистра бухгалтерии.

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

Поясним суть работы механизма на примере регистра накопления.

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

Например, есть движения:

Регистратор Вид движения Дата Измерение Товар Измерение Склад Ресурс Количество
Приходная накладная 1 Приход 12.06.06 Стол Основной 10
Приходная накладная 1 Приход 12.06.06 Стул Основной 8
Приходная накладная 2 Приход 12.06.06 Стол Основной 1
Расходная накладная 5 Расход 13.06.06 Стол Основной 5

Тогда в системе есть текущие остатки в таблице остатков:

Измерение Товар Измерение Склад Ресурс Количество
Стол Основной 6
Стул Основной 8

То есть таблица итогов содержит алгебраическую сумму движений (с учетом вида движений) по каждой комбинации измерений.

При каждой записи движений система добавляет или вычитает в зависимости от вида движения значения ресурсов движений из соответствующих строк таблицы итогов. Для того чтобы это сделать, система должна считать текущее значение, увеличить или уменьшить его, и записать измененное значение. Разумеется, чтобы эта операция прошла корректно, нужно заблокировать считываемую запись, чтобы никто не мог изменить запись после считывания. Таким образом, в приведенном примере приходная накладная номер 1 и  приходная накладная номер 2 не могу быть параллельно проведены, так как не могут быть записаны параллельно записи по комбинации измерений «Стол - Основной».

Механизм разделения итогов вводит в состав хранимой таблицы итогов специальное поле, позволяющее распараллелить обновление записей итогов.

Например, если одновременно записывается приходная накладная 1 и приходная накладная 2, то записи будут выглядеть следующим образом.

Разделитель Измерение Товар Измерение Склад Ресурс Количество
0 Стол Основной 10
1 Стол Основной 1
0 Стул Основной 8

Таким образом, уже становится возможным параллельное проведение приходной накладной 1 и приходной накладной 2.

Когда после этого будет записана расходная накладная 5, записи будут выглядеть так:

Разделитель Измерение Товар Измерение Склад Ресурс Количество
0 Стол Основной 5
1 Стол Основной 1
0 Стул Основной 8

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

Измерение Товар Измерение Склад Ресурс Количество
Стол Основной 6
Стул Основной 8

Новые записи с уже существующими комбинациями измерений создаются системой только в случае, если параллельно выполняются две и более транзакции. Фактически, значение разделителя - это некоторое число, выдаваемое системой в очередной транзакции и уникальное среди всех параллельно выполняемых транзакций в данный момент времени. Система выдает первое свободное число, то есть числа, выданные ранее завершившимся  транзакциям, переиспользуются. Таким образом, увеличение количества записей итогов зависит от количества одновременно выполняемых транзакций.

Данный механизм работает только при записи движений. При обращении к итогам регистров в запросе блокировка накладывается на все записи с используемыми комбинациями измерений. И это соответствует сути решаемой задачи. Например, при проведении расходной накладной средствами встроенного языка выполняется считывание остатков для проверки возможности продажи товара. В этом случае блокировка не позволит провести расходную накладную параллельно с другой расходной накладной или приходной накладной, если имеются пересекающиеся комбинации  измерений. И это правильно, потому что, расходную накладную номер 5 нельзя проводить параллельно с приходной накладной 1 и приходной накладной 5, так как необходимо обеспечить логическую проверку наличия товара на складе, так чтобы никто не мог поменять считанный остаток до конца транзакции проведения расходной накладной. Таким образом, механизм разделения итогов исключает блокировки, устанавливаемые для поддержки актуальных итогов (решения системной задачи), но не исключает блокировки, накладываемые для решения задач бизнес-логики.

Аналогичная логика поддерживается и при использовании управляемого режима блокировки. Из встроенного языка доступна блокировка только по измерениям (без учета разделения итогов по отдельным записям).

Заметим, что данный механизм не работает в файловом варианте, так как там поддерживается только блокировка уровня таблиц. Также он не поддерживается при работе с СУБД PostgreSQL в автоматическом режиме блокировок.

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

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

Чтобы управлять работой данного механизма, предусмотрены две возможности.

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

В информационной базе для регистров (тех, для которых разделение итогов разрешено в конфигурации) поддерживается хранение признака использования разделения итогов. Он может быть получен и установлен методами ПолучитьРежимРазделенияИтогов() и УстановитьРежимРазделенияИтогов(), а также в стандартном диалоге («Операции-Управление итогами-Установка режима разделения итогов»). Такая возможность позволяет включать или выключать режим разделения итогов в зависимости от условий работы пользователей в конкретной организации. Например, при интенсивном параллельном вводе информации этот режим может быть полезен. Но если с системой работает небольшое количество пользователей, то выигрыш от  его применения будет небольшой, а некоторое замедление при получении отчетов и лишние записи в таблицах итогов, фактически будут лишними (неоправданными).