Платформа «1С:Предприятие 8» содержит возможности и механизмы, о работе которых не все имеют полное представление, как и о способах их эффективного использования. Таковым является режим разделения итогов.
Механизм разделения итогов выполняет весьма важную и полезную функцию: его использование делает возможным осуществлять параллельную запись в регистры бухгалтерии и регистры накопления.
Покажем эффективность данного режима с помощью примера. Для этого рассмотрим ситуацию до и после включения режима разделения итогов.
До включения режима разделения итогов
Мы имеем в наличии два одинаковых документа с номерами 001 и 002:
Оба документа осуществляют движение по регистру накопления. Контроля остатков нет. Структура регистра накопления:
Два пользователя, работая в своих документах, начинают одновременное проведение. Возникает ситуация, при которой два документа одного типа пытаются сделать движения одновременно. При этом на уровне СУБД возникает следующая картина:
Вот что происходит в системе:
- Документы пытаются внести запись в регистр накопления
- На уровне СУБД регистр накопления представлен двумя таблицами: таблицей движений и таблицей остатков (таблица итогов).
- В таблице движений возможна запись документами своих данных параллельно. Это обеспечивается различными значениями поля «Регистратор», и, соответственно, работа идет с различными строками таблицы.
- А вот в таблице остатков нет поля «Регистратор», данные в этой таблице хранятся в разрезе измерений самого регистра.
- Тут наблюдается ситуация, при которой двум документам необходимо изменить одну запись, но одну запись одновременно менять нельзя.
- Для того чтобы не потерять записываемые данные, какой-либо из документов должен ожидать своей очереди на запись, пока другой документ не запишет свои движения. И, после того как первый из документов внесет свои движения, второй сможет внести уже свои.
В результате мы наблюдаем потерю времени - второй пользователь вынужден ждать окончание проведения документа у первого. С одной стороны, все правильно и логично, с другой - страдает параллельность работы пользователей в системе. Для разрешения возникшей проблемы и создан механизм разделения итогов.Его использование предусмотрено только для регистров накопления и регистров бухгалтерии.
Включение режима разделения итогов
Включение данного режима выполняется достаточно просто:
Заметим, что режим разделения итогов включен по умолчанию для всех создаваемых регистров накопления и бухгалтерии. Помимо Конфигуратора в пользовательском режиме мы можем посмотреть, для каких регистров включено использование режима:
Что происходит после включения режима разделения итогов?
В таблице итогов регистра накопления/бухгалтерии появляется новый столбец «Разделитель». В самой СУБД он назван «Splitter».
При этом таблица движений остается неизменной, разделителем в ней выступает «Регистратор». Изменение мы видим в таблице итогов. Это поле заполняется только в том случае, когда две (или более) транзакции пытаются изменить одну строку в таблице итогов. При возникновении такого случая поле «Разделитель» хранит разные значения для каждой из транзакций. Такая реализация режима разделения итогов делает возможным выполнять параллельную запись всем транзакциям. В нашем примере с двумя документами при включении режима наблюдается следующее:
Оба наших документа выполнили параллельную запись своих данных благодаря новому полю «Разделитель». В результате не возникают ожидания при блокировках и повышена параллельность работы пользователей.
Минусы режима разделения итогов
При включении данного режима увеличивается размер таблицы итогов регистра из-за того, что было добавлено новое поле, и появляется несколько строк по набору измерений взамен одной. При получении остатков по регистру возникает потребность свертки данных, что приводит к затратам времени, пусть и незначительным. В нашем случае с двумя документами для получения остатка товара «Стол» по складу «Основной» возникает необходимость сложения двух строк для получения итогового значения «7». При выключенном разделителе группировка строк (сложение) не требуется.
Когда следует использовать режим разделения итогов?
Для этого необходимо выполнить условия:
- По регистру нет контроля остатков - нет чтения данных в транзакции. В регистрах бухгалтерии контроль остатков, как правило, отсутствует. Но если контроль остатков присутствует, то мы не получим никакого выигрыша в производительности. К тому же, при контроле остатков нужно использовать свойство набора записей «БлокироватьДляИзменения», так как возникает вероятность взаимоблокировки.
- С регистром выполняется параллельная работа пользователей, причем активная.
При последовательной работе с регистром или работе с малым числом пользователей нет смысла включать режим разделения итогов: отсутствие конкурирующих транзакций не приводит к ожиданиям на блокировках, и, соответственно, не наблюдается эффекта от использования режима разделения итогов.
Бурмистров Андрей
Другие полезные статьи и видео смотрите на нашем сайте: http://