Другие статьи по оптимизации 1С:
«Оптимизация 1С – Проблемы производительности»
«Как в 1С оптимизировать запрос – пример ускорения в 6 раз»
«Анализ запросов с помощью SQL Profiler»
Оптимизация 1С – Режим разделения итогов
- В статье рассматривается предназначение режима разделения итогов
- Разбирается поведение системы «1С:Предприятие 8» при параллельной работе большого количества пользователей
- Показываются минусы режима разделения итогов
- Выдаются рекомендации по корректному использованию разделения итогов регистра
Платформа «1С:Предприятие 8» содержит возможности и механизмы, о работе которых не все имеют полное представление, как и о способах их эффективного использования. Таковым является режим разделения итогов.
Механизм разделения итогов выполняет весьма важную и полезную функцию: его использование делает возможным осуществлять параллельную запись в регистры бухгалтерии и регистры накопления.
Покажем эффективность данного режима с помощью примера. Для этого рассмотрим ситуацию до и после включения режима разделения итогов.
До включения режима разделения итогов
Мы имеем в наличии два одинаковых документа с номерами 001 и 002:
Оба документа осуществляют движение по регистру накопления. Контроля остатков нет. Структура регистра накопления:
Два пользователя, работая в своих документах, начинают одновременное проведение. Возникает ситуация, при которой два документа одного типа пытаются сделать движения одновременно.
При этом на уровне СУБД возникает следующая картина:
Вот что происходит в системе:
- Документы пытаются внести запись в регистр накопления
- На уровне СУБД регистр накопления представлен двумя таблицами: таблицей движений и таблицей остатков (таблица итогов).
- В таблице движений возможна запись документами своих данных параллельно. Это обеспечивается различными значениями поля «Регистратор», и, соответственно, работа идет с различными строками таблицы.
- А вот в таблице остатков нет поля «Регистратор», данные в этой таблице хранятся в разрезе измерений самого регистра.
- Тут наблюдается ситуация, при которой двум документам необходимо изменить одну запись, но одну запись одновременно менять нельзя.
- Для того чтобы не потерять записываемые данные, какой-либо из документов должен ожидать своей очереди на запись, пока другой документ не запишет свои движения. И, после того как первый из документов внесет свои движения, второй сможет внести уже свои.
В результате мы наблюдаем потерю времени – второй пользователь вынужден ждать окончание проведения документа у первого. С одной стороны, все правильно и логично, с другой – страдает параллельность работы пользователей в системе.
Для разрешения возникшей проблемы и создан механизм разделения итогов.
Его использование предусмотрено только для регистров накопления и регистров бухгалтерии.
Включение режима разделения итогов
Включение данного режима выполняется достаточно просто:
Заметим, что режим разделения итогов включен по умолчанию для всех создаваемых регистров накопления и бухгалтерии. Помимо Конфигуратора в пользовательском режиме мы можем посмотреть, для каких регистров включено использование режима:
Что происходит после включения режима разделения итогов?
В таблице итогов регистра накопления/бухгалтерии появляется новый столбец «Разделитель». В самой СУБД он назван «Splitter».
При этом таблица движений остается неизменной, разделителем в ней выступает «Регистратор». Изменение мы видим в таблице итогов.
Это поле заполняется только в том случае, когда две (или более) транзакции пытаются изменить одну строку в таблице итогов. При возникновении такого случая поле «Разделитель» хранит разные значения для каждой из транзакций.
Такая реализация режима разделения итогов делает возможным выполнять параллельную запись всем транзакциям.
В нашем примере с двумя документами при включении режима наблюдается следующее:
Оба наших документа выполнили параллельную запись своих данных благодаря новому полю «Разделитель». В результате не возникают ожидания при блокировках и повышена параллельность работы пользователей.
Минусы режима разделения итогов
При включении данного режима увеличивается размер таблицы итогов регистра из-за того, что было добавлено новое поле, и появляется несколько строк по набору измерений взамен одной.
При получении остатков по регистру возникает потребность свертки данных, что приводит к затратам времени, пусть и незначительным.
В нашем случае с двумя документами для получения остатка товара «Стол» по складу «Основной» возникает необходимость сложения двух строк для получения итогового значения «7». При выключенном разделителе группировка строк (сложение) не требуется.
Когда следует использовать режим разделения итогов?
Для этого необходимо выполнить условия:
- По регистру нет контроля остатков – нет чтения данных в транзакции. В регистрах бухгалтерии контроль остатков, как правило, отсутствует. Но если контроль остатков присутствует, то мы не получим никакого выигрыша в производительности. К тому же, при контроле остатков нужно использовать свойство набора записей «БлокироватьДляИзменения», так как возникает вероятность взаимоблокировки.
- С регистром выполняется параллельная работа пользователей, причем активная.
При последовательной работе с регистром или работе с малым числом пользователей нет смысла включать режим разделения итогов: отсутствие конкурирующих транзакций не приводит к ожиданиям на блокировках, и, соответственно, не наблюдается эффекта от использования режима разделения итогов.
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.
Статья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
«Ускорение и оптимизация систем на 1С:Предприятие 8.3 (2016). Подготовка на 1С:Эксперт по технологическим вопросам»
Содержание курса и форма заказа: https://курсы-по-1с.рф/1c-v8/optimization/
35 учебных часов, подготовка к 1С:Эксперт, правильная настройка серверной части, оптимизация кода, мониторинг загруженности оборудования и прочие взрослые вещи.
Добрый день.
А разве при записи в регистр накопления происходит запись в таблицу остатков регистра?
Я так думал, что данные в таблице остатков вносятся при расчете итогов, а не при внесении каждой записи.
Проясните пожалуйста данную ситуацию?
Если итоги включены, тогда таблица итогов обновляется каждый раз при записи в регистр. Вы можете самостоятельно это проверить используя SQL Profiler.
Добрый день!
Подскажите пожалуйста, Вы пишите что этот режим не следует применять если по регистру существует контроль остатков — и есть чтение данных в транзакции. Т.е. в новых методах оперативного проведения (списание, затем контроль остатков) в регистре накопления ОстаткиТоваров этот режим должен быть отключён? На экзамене по специалисту на это обращают внимание?
> Т.е. в новых методах оперативного проведения (списание, затем контроль остатков) в регистре накопления ОстаткиТоваров этот режим должен быть отключён?
Либо отключен, либо у набора записей этого регистра должно быть установлено свойство БлокироватьДляИзменения=Истина. Если этого не сделать, то при параллельном проведении документов с одинаковыми значениями в 8.2 будет возможен дедлок, а в 8.3 будут возможны отрицательные остатки.
> На экзамене по специалисту на это обращают внимание?
Вот этого не могу сказать.
Добрый день!
во всех книгах, курсах “БлокироватьДляИзменения = Истина” не ставят в документе ПриходнаяНакладная подскажите почему? Ведь если я перепровожу документ ПриходнаяНакладная то я должен блокировать поля по которым был приход иначе можно товар списать в минус. Пример: было Стул 2шт, перепровожу меняя Стул на Тумбу и в этот момент списываю Стул, то у меня спишется в минус. Вопрос возник т.к. сдавал на спеца и там поставил в документе ПриходнаяНакладная “БлокироватьДляИзменения = Истина” мне написали лишняя блокировка.
В таком случае при перепроведении можно ставить БлокироватьДляИзменения=Истина, а при проведении не ставить.
По идее при перепроведении со сменой Стула на Тумбу по таблице итогов будут наложены две неявные блокировки по измерению регистра. И с БлокироватьДляИзменеия это никак не связано. А на экзамене по спецу могли такое написать в случае если БлокироватьДляИзменения использовалось для регистра без разделения итогов, например, или с разделением итогов но без контроля остатков.
“будут наложены две неявные блокировки”
Что за блокировки? Откуда они возьмутся? Можно подробнее?
Блокировки накладываются при перепроведении т.к. идет удаление предыдущих движений, соответственно появляются X блокировки.
Добрый день, 2 неявные блокировки накладывается куда? – одна на старое значение поля(Стул), другое на новое (Тумба)? Просто не совсем понятно, почему, именно, две неявные блокировки.
Ирина, здравствуйте.
> одна на старое значение поля(Стул), другое на новое (Тумба)?
Все верно, одна блокировка на старое значение (стул), вторая на новое значение (тумба).
Каким образом можно списать товар “в минус” в ПРИХОДНОЙ накладной? Правильно написали, что блокировка лишняя.
Он имел ввиду, что при перепроведении Приходной накладной может одновременно проводиться Расходная накладная, которая будет списывать товар, который в Приходной накладной решили поменять
Добрый день.
Вопрос на смежную тему с сабжем этой статьи:
Существует предположение – свойство набора записей н-го регистра “БлокироватьДляИзменения” имеет смысл применять в случае:
1) Если транзакция работает в управляемом режим;
2) Если у регистра, к которому принадлежит набор записей, установлен режим разделения итогов.
3) Если используется новая методика контроля остатков.
По 3) пункту я бы поспорил(но не здесь), по второму следующие вопросы:
1. Верно ли это утверждение?
2. Что произойдет если программист написал код по вышеуказанным условиям с использованием свойства набора записей н-го регистра “БлокироватьДляИзменения”, а пользователь отключил через “предприятие” разделение итогов для этого регистра, неужели придется переписывать код?
3) Также говорят что БлокироватьДляИзменения при записи набора записей отключает сабж этой статьи.
Если это так зачем вообще зависит его работа от режима разделения итогов?
1. Верно ли это утверждение?
Верно
2. Что произойдет если программист написал код по вышеуказанным условиям с использованием свойства набора записей н-го регистра «БлокироватьДляИзменения», а пользователь отключил через «предприятие» разделение итогов для этого регистра, неужели придется переписывать код?
Не надо ничего переписывать, ошибки не будет. БлокироватьДляИзменения=Истина будет просто игнорироваться, т.к. разделитель и так уже отключен.
3. Также говорят что БлокироватьДляИзменения при записи набора записей отключает сабж этой статьи.
Если это так зачем вообще зависит его работа от режима разделения итогов?
Разделитель просто не учитывается для указанного набора записей, это не значит что он отключается для всего регистра, просто управляемая блокировка на текущий набор записей ставится без учета разделителя вот и все.
Добрый день.
Только что решил проверить, как раз в работе подвернулась ситуация для этого.
1С Предприятие 8.3.4.496 СУБД POSGRESQL – пакет от 1С, который датируется декабрем прошлого года, как точно называется версия этого пакета я не помню, помню что их две – другая кажется датирована февралем 2012 года. конфигурация бухгалтерия для Казахстана релиз 2.0.16. У этой конфы режим обычного приложения.
Сделал новый регистр накопления с измерениями номенклатура и кол-во и новый документ, который формирует движения по этому регистру. У документ проведение безусловное – просто формируется движения по данным таб.части.
В метаданных регистра поставил галочку разделения итогов и включил этот режим для регистра в предприятии в “Управление итогами”.
Запускую два сеанса 1С:Предприятие 8 – 1 в режиме отладки(в процедуре проведения стоит точка останова) провожу первый документ и проведение останавливается, в это время во втором сеансе я запускаю проведение второго документа и он не проводится просто крутиться индикатор мышки, но как только отпускаю с точки останова первый документ и его транзакция завершается тут же проводится второй.
Если я правильно понял материал статьи то второй документ должен закончить проведение раньше первого в ситуации которую я описал выше.
Воспроизвел аналогичную ситуацию на довольно старой конфигурации – но платформа и субд те же.
УПП для казахстана еще со времен 8.1, стоит режим совместимости 8.1 и режим совместимости интерфейсов 8.2 в свойствах конфигурации.
Так вот там через некоторое время при проведении документа 2 выходит сообщение о конфликте блокировок в транзакции.
На ум приходит 4 варианта – я что то не понял или сделал что то не так, на СУБД постгрес это не работает или он глючит, глюк платформы, автор статьи заблуждается.
Добрый день!
От СУБД этот механизм зависеть не должен, если стоит управляемый режим блокировок.
Посмотрите какой именно режим управления блокировкой данных стоит у конфигурации.
Если стоит автоматический, то попробуйте поставить управляемый и повторить опыт.
Так же необходимо, чтобы после записи движений не было чтения.
Доброе утро.
Изначально был режим управления блокировкой данных автоматический в свойствах обеих конфигураций.
Затем в свойствах обоих конфигураций поставил режим управления блокировкой данных автоматический и управляемый и:
Если у Документа режим блокировки автоматический а у регистра накопления управляемый ситуация не меняется, если наоборот возникает ошибка менеджера блокировок при попытки провести/снять с проведения документ.
Если у обоих объектов режим блокировки управляемый в случае когда проведение первого документа стоит на точке останова то второй благополучно проводится.
Выходит что режим разделение итогов корректно работает в управляемом режиме блокировки данных.
Возник еще один вопрос:
Допустим есть документ который приходует товар, и есть документ который расходует товар из регистра. Приходный документ не считывает остатки в транзакции проведения, а расходный считывает.
Имеет ли смысл включать разделение итогов для регистра для того чтобы приходные документы могли проводиться параллельно?
При этом в расходном документ используется управляемая блокировка на этот регистр, то есть возможна ситуация когда списываемые товары не пересекаются с поступающими, если пересекаются то тут все понятно – режим разделения итогов будет бесполезен.
Добрый день!
Выходит что режим разделение итогов корректно работает в управляемом режиме блокировки данных.
Это утверждение справедливо только для СУБД версионников.
Дело в том, что в автоматическом режиме блокировок версионники блокируют всю таблицу, поэтому разделитель итогов тут не помогает.
Имеет ли смысл включать разделение итогов для регистра для того чтобы приходные документы могли проводиться параллельно?
Да, для регистра имеет смысл включить разделение итогов. При этом приходные документы будут без проблем проводиться, даже если указаны одинаковые значения реквизитов в документе.
Если у Вас в расходном документе упр. блокировка и контроль остатков идет до записи, тогда ничего больше делать не нужно.
В этом случае 2 расхода или 1 приход и 1 расход по одинаковым значениям измерений параллельно провестись не смогут.
Добрый день!
А что означает “Это утверждение справедливо только для СУБД версионников.”?
Что за СУБД такие? И относятся ли к ним MS SQL, Postgree, файловый вариант базы 1С.
Версионные СУБД поддерживаемые 1С это Oracle и PostgreSQL.
А в MS SQL не корректно что ли работает режим разделения итогов, если прочитать выше сказанное (он не версионник ведь)? Напомните, а как называется тип СУБД MSSQL? Спасибо
Все с режимом разделения нормально и все работает именно так как должно работать.
Под некорректной работой человек в комментарии имеет ввиду то, что для СУБД версионников в автоматическом режиме блокируется всегда вся таблица, а не изменяемые строки как обычно. Это штатное поведение и происходит не зависимо от того включено разделение или нет. Поэтому для версионников с автоматическим режимом блокировок не имеет никакого смысла включать разделение итогов. Просто такое поведение человек в комментариях назвал не корректным, хотя по факту оно таковым не является.
MS SQL относится к СУБД блокировочникам, хотя сейчас там можно включить режим версионирования, поэтому деление на блокировочники и версионники весьма условно.
Тогда я правильно понимаю, что режим разделения итогов корректно работает в автоматическом режиме блокировки данных в файловом варианте 1С и в MS SQL?
В файловом варианте режим разделения итогов не имеет смысла, т.к. независимо от режима блокировки, в файловом варианте всегда блокируется вся таблица.
В автоматическом режиме на MS SQL Server будет работать разделение итогов, но все равно из-за особенностей работы автоматического режима остается риск избыточных блокировок из-за блокирования соседних записей диапазона.
Добрый день.
Скажите пожалуйста миф это или реальность – что при использовании управляемых блокировок нужно включать режим разделения итогов?
Добрый день!
Если Вы используете режим управляемых блокировок, то это Вас никак не обязывает обязательно включать режим разделения итогов.
Разделение итогов – это отдельный механизм.