Привет, друзья! Сегодня мы поговорим про свойство регистра «Режим разделения итогов». Все слышали, что такое существует, но на практике мало кто знает – что это за зверь.
Итак, как обычно, есть проблема – большое время ожидания предоставления блокировки, ошибки таймаута блокировок:
Сейчас я расскажу, что здесь происходит. Несколько человек одновременно пишут данные в 1 регистр по одному набору измерений. Никакой проблемы нет – создается несколько записей. Но при записи в регистр система пытается обновить таблицы итогов, про которые я говорил в предыдущей статье. А в этой таблице по одному набору измерений только одна строка. Возникает конфликт – все ждут, пока проведется документ одного пользователя.
И тут мы включаем режим разделения итогов регистра. Технически, это выглядит так:
Система добавила колонку в таблицу итогов «_Splitter», или разделитель. Теперь, когда несколько человек одновременно пишут данные по одному набору измерений, все строки попадают в таблицы итогов, но с разными значениями разделителя (0, 1, 2 …).
Когда же система хочет считать итоги по набору измерений, она суммирует значения с разными разделителями и получает актуальные данные. А при пересчете итогов значения суммируются и перезаписываются одной строкой.
Поэтому, я рекомендую включать режим разделения итогов в регистрах. Сейчас 1С ставит галочку по умолчанию при создании регистра.
Но у каждого решения есть и отрицательные стороны. Сейчас в 1С «модно» контролировать остатки методом «посмертного вскрытия» — сначала записываются движения, а потом считываем остатки и смотрим, не ушли ли мы в минус. И тут нас ждет следующая проблема:
2 пользователя успешно записали данные в регистр одновременно благодаря режиму разделения итогов, а затем хотят проконтролировать остатки. И каждый пытается прочитать все данные по набору измерений.
В итоге первый пользователь ждет, когда второй пользователь завершит транзакцию, чтобы прочитать данные. А второй пользователь ждет первого. Типичный случай взаимоблокировки. Один из пользователей увидит ошибку и его транзакция отменится.
Чтобы этого не происходило, в тех местах, где используется метод «посмертного вскрытия» набору записей необходимо устанавливать свойство «БлокироватьДляИзменения». При этом установится управляемая блокировка на регистр по нашим измерениям, а также будет недопустимо использование режима разделения итогов в данной ситуации. Это и логично, мы как бы сообщаем системе – «мы не просто пишем данные, а хотим потом проверить остатки, и другие пользователи не должны изменить эти данные, пока мы не закончим».
Спасибо за внимание 🙂
Спасибо!