Будова та використання режиму розділення підсумків реєстрів
Цей режим підтримується для реєстру накопичення та реєстру бухгалтерії.
Цей режим підтримується для реєстру накопичення та реєстру бухгалтерії.
Передусім потрібно зазначити, що режим розділення підсумків впливає лише на паралельність роботи системи й ніяк не позначається на самій бізнес-логіці розв'язуваних завдань. Тобто це механізм платформи, який забезпечує вищий рівень паралельності та керується в конфігурації й в інформаційній базі лише з метою налаштування використання цієї можливості для конкретних об'єктів конфігурації та в конкретному впровадженні. З погляду розв'язуваних завдань предметної області він не потребує конфігурування.
Пояснимо суть роботи механізму на прикладі реєстру накопичення.
Для швидкого отримання підсумків реєстру на поточний момент та на інші моменти часу система підтримує в актуальному стані в окремих таблицях (недоступних безпосередньо для розробника конфігурації) стан підсумків з урахуванням усіх наявних у таблиці рухів. Записи в цих таблицях автоматично оновлюються під час запису рухів. Ці записи використовуються системою автоматично під час звернення до віртуальних таблиць реєстрів для отримання відповідних підсумків.
Наприклад, є рухи:
| Реєстратор | Вид руху | Дата | Вимір Товар | Вимір Склад | Ресурс Кількість |
|---|---|---|---|---|---|
| Прибуткова накладна 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 в автоматичному режимі блокувань.
Звісно, робота цього механізму спричиняє додаткові накладні витрати (наявність поля в таблицях підсумків, збільшення кількості записів у таблицях підсумків).
Під час перерахунку підсумків реєстру записи згортаються за комбінаціями вимірів. Тобто після перерахунку надлишкові записи з реєстру видаляються.
Для керування роботою цього механізму передбачено дві можливості.
У конфігурації для реєстрів введено властивість «Дозволити розділення підсумків». Ця властивість дає змогу ввімкнути або вимкнути можливість розділення підсумків для конкретного реєстру. Вимкнення властивості повністю виключає вплив цього механізму на роботу реєстру, оскільки саме поле, що використовується для розділення підсумків, не включається до структури реєстру. Наприклад, вимкнення цієї можливості корисне для реєстрів, які не використовуються під час паралельної роботи користувачів. Наприклад, для реєстрів, що завжди заповнюються спеціальними регламентними обробками.
В інформаційній базі для реєстрів (тих, для яких розділення підсумків дозволено в конфігурації) підтримується зберігання ознаки використання розділення підсумків. Її можна отримати та встановити методами ОтриматиРежимРозділенняПідсумків() та ВстановитиРежимРозділенняПідсумків(), а також у стандартному діалозі («Операції-Керування підсумками-Установлення режиму розділення підсумків»). Така можливість дає змогу вмикати або вимикати режим розділення підсумків залежно від умов роботи користувачів у конкретній організації. Наприклад, за інтенсивного паралельного введення інформації цей режим може бути корисним. Але якщо із системою працює невелика кількість користувачів, то виграш від його застосування буде невеликий, а деяке уповільнення під час отримання звітів і зайві записи в таблицях підсумків фактично будуть зайвими (невиправданими).