Разделение итогов 1С

Рассмотрим узкие места 1С: Предприятие, на которых могут быть проблемы конкурентного доступа. Есть объекты, при работе с которыми, мы не можем повлиять на производительность в плане параллельности работы, в силу их архитектуры.

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

Другими словами, выполняться может только 1 транзакция, а остальные, претендующие на этот же ресурс, будут стоять в ожидании предоставления блокировки (ожидание перехода с IX в X).

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

Курс 1С: Эксперт. Ожидание на блокировке при записи документов
Ожидание на блокировке при записи документов

Таблица итогов регистра накопления

Например, в системе для интернет-магазина, есть регистр накопления «Товары на складах». Каждую минуту создается 100 заказов с резервированием товара «Медицинская маска», а так же идут отгрузки со складов, поступления на склады и перемещения товаров между складами.

Рассмотрим, какие таблицы СУБД будут блокироваться, при установке исключительной (X) блокировки, при записи набора движений Товары на складах для товара «Медицинская маска» и склада «Основной»:

1. Блокировка таблицы «Основная таблица движений» по полям:

  • Период: 15.08.2019 13:09:01;
  • Документ-регистратор: Приходная накладная АБ-00323482 от 15.08.2019 13:09:01;
  • Номер строки: 1;
  • Номенклатура: «Медицинская маска»;
  • Склад: «Основной».

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

2. Блокировка таблицы «Таблица итогов» по полям:

  • Период: 01.09.2019;
  • Номенклатура: «Медицинская маска»;
  • Склад: «Основной».

И

  • Период: 01.11.3999;
  • Номенклатура: «Медицинская маска»;
  • Склад: «Основной».

Как видно, именно при блокировке таблицы итогов, возникает проблема с конкурентным доступом!

Разделение итогов регистров накопления

Для разрешения проблем конкурентного доступа, есть опция «Использовать режим разделения»:

Курс 1С: Эксперт. Включение и выключение режима разделения итогов
Включение и выключение режима разделения

При использовании данной опции, в таблицу итогов добавляется дополнительное поле «Разделитель» (Splitter), который мы никак не можем явно указать при формировании набора записей регистра:

Курс 1С: Эксперт. Дополнительное поле Splitter в СУБД
Дополнительное поле Splitter в СУБД
Курс 1С: Эксперт. Поле Splitter в СУБД
Поле Splitter в СУБД

А наши записи движений уже в самой СУБД будут выглядеть следующим образом:

  • Период: 01.09.2019;
  • Номенклатура: «Медицинская маска»;
  • Склад: «Основной»
  • Разделитель (Splitter): 1 (уникальное число по порядку очереди на запись).

И

  • Период: 01.11.3999;
  • Номенклатура: «Медицинская маска»;
  • Склад: «Основной»;
  • Разделитель (Splitter): 1 (уникальное число по порядку очереди на запись).

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

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

Управление итогами

Данный режим можно включать и выключать, в зависимости от нагрузки на систему. Например, мы установили опцию «Разрешить использование итогов» для регистра накопления (по умолчанию эта опция установлена), но мы можем отключить использование разделителя (Splitter).

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

Управление итогами происходит в стандартном функционале 1С в режиме предприятия:

Все функции -> Стандартные -> Управление итогами -> Полные возможности:

Курс 1С: Эксперт. Управление итогами в 1С Предприятие
Управление итогами в 1С Предприятие

В подменю Разделение можно включать и выключать использование разделителя (Splitter):

Курс 1С: Эксперт. Включение и выключение режима разделения итогов
Включение и выключение режима разделения для регистров накопления

Недостатки использования «Разделения итогов»

При использовании разделения итогов, мы очевидно увеличиваем размер таблицы итогов, потому что она «сворачивается» по дополнительному полю. Следовательно, при получении итогов (остатков, оборотов) в запросах (отчетах) будут накладные расходы СУБД на агрегирование записей.

Данная тема подробнее рассматривается в пакете видео-курса «Секреты 1С: Эксперта» Шаг 3. Занятие 09-03 Эскалация и взаимоблокировки..

Константин Ефимов | 1С: Эксперт. Фриланс, Малайзия, Куала-Лумпур

КОНСТАНТИН ЕФИМОВ
Комментарии и вопросы