Режим разделения итогов и «БлокироватьДляИзменения»

Logo_1c_8_expert

Привет, друзья! Сегодня мы поговорим про свойство регистра «Режим разделения итогов». Все слышали, что такое существует, но на практике мало кто знает – что это за зверь.

 

 

 

 

Итак, как обычно, есть проблема – большое время ожидания предоставления блокировки, ошибки таймаута блокировок:

rezhim-razdeleniya-itogov-i-blokirovatdlyaizmeneniya_01

rezhim-razdeleniya-itogov-i-blokirovatdlyaizmeneniya_02

Сейчас я расскажу, что здесь происходит. Несколько человек одновременно пишут данные в 1 регистр по одному набору измерений. Никакой проблемы нет – создается несколько записей. Но при записи в регистр система пытается обновить таблицы итогов, про которые я говорил в предыдущей статье. А в этой таблице по одному набору измерений только одна строка. Возникает конфликт – все ждут, пока проведется документ одного пользователя.

И тут мы включаем режим разделения итогов регистра. Технически, это выглядит так:

rezhim-razdeleniya-itogov-i-blokirovatdlyaizmeneniya_03

Система добавила колонку в таблицу итогов «_Splitter», или разделитель. Теперь, когда несколько человек одновременно пишут данные по одному набору измерений, все строки попадают в таблицы итогов, но с разными значениями разделителя (0, 1, 2 …).

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

Поэтому, я рекомендую включать режим разделения итогов в регистрах. Сейчас 1С ставит галочку по умолчанию при создании регистра.

Но у каждого решения есть и отрицательные стороны. Сейчас в 1С «модно» контролировать остатки методом «посмертного вскрытия» — сначала записываются движения, а потом считываем остатки и смотрим, не ушли ли мы в минус. И тут нас ждет следующая проблема:

rezhim-razdeleniya-itogov-i-blokirovatdlyaizmeneniya_04

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

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

Чтобы этого не происходило, в тех местах, где используется метод «посмертного вскрытия» набору записей необходимо устанавливать свойство «БлокироватьДляИзменения». При этом установится управляемая блокировка на регистр по нашим измерениям, а также будет недопустимо использование режима разделения итогов в данной ситуации. Это и логично, мы как бы сообщаем системе – «мы не просто пишем данные, а хотим потом проверить остатки, и другие пользователи не должны изменить эти данные, пока мы не закончим».

Спасибо за внимание 🙂

Помогла ли вам данная статья?
Да, спасибо, помогла.
Немного помогла.
Совсем не помогла.
Не то, что я искал(а).

P.S. Смотрите также:

Запись опубликована в рубрике Эксперт 1С с метками . Добавьте в закладки постоянную ссылку.


Добавить комментарий

Ваш e-mail не будет опубликован.