Оптимизация «1С:Предприятие 8» – Режим разделения итогов

Другие статьи по оптимизации 1С:

«Оптимизация 1С – Проблемы производительности»

«Как в 1С оптимизировать запрос – пример ускорения в 6 раз»

«Анализ запросов с помощью SQL Profiler»

Оптимизация 1С – Режим разделения итогов

Что Вы узнаете из этой статьи?

  • В статье рассматривается предназначение режима разделения итогов
  • Разбирается поведение системы «1С:Предприятие 8» при параллельной работе большого количества пользователей
  • Показываются минусы режима разделения итогов
  • Выдаются рекомендации по корректному использованию разделения итогов регистра

Платформа «1С:Предприятие 8» содержит возможности и механизмы, о работе которых не все имеют полное представление, как и о способах их эффективного использования. Таковым является режим разделения итогов.

Механизм разделения итогов выполняет весьма важную и полезную функцию: его использование делает возможным осуществлять параллельную запись в регистры бухгалтерии и регистры накопления.

Покажем эффективность данного режима с помощью примера. Для этого рассмотрим ситуацию до и после включения режима разделения итогов.

До включения режима разделения итогов

Мы имеем в наличии два одинаковых документа с номерами 001 и 002:

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

1С запрос к регистру накопления

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

При этом на уровне СУБД возникает следующая картина:

Движение документов в 1С

Вот что происходит в системе:

  1. Документы пытаются внести запись в регистр накопления
  2. На уровне СУБД регистр накопления представлен двумя таблицами: таблицей движений и таблицей остатков (таблица итогов).
  3. В таблице движений возможна запись документами своих данных параллельно. Это обеспечивается различными значениями поля «Регистратор», и, соответственно, работа идет с различными строками таблицы.
  4. А вот в таблице остатков нет поля «Регистратор», данные в этой таблице хранятся в разрезе измерений самого регистра.
  5. Тут наблюдается ситуация, при которой двум документам необходимо изменить одну запись, но одну запись одновременно менять нельзя.
  6. Для того чтобы не потерять записываемые данные, какой-либо из документов должен ожидать своей очереди на запись, пока другой документ не запишет свои движения. И, после того как первый из документов внесет свои движения, второй сможет внести уже свои.

1С запрос только проведенные документы

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

Для разрешения возникшей проблемы и создан механизм разделения итогов.

Его использование предусмотрено только для регистров накопления и регистров бухгалтерии.

Включение режима разделения итогов

Включение данного режима выполняется достаточно просто:

1С запрос регистр накопления остатки

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

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

Что происходит после включения режима разделения итогов?

В таблице итогов регистра накопления/бухгалтерии появляется новый столбец «Разделитель». В самой СУБД он назван «Splitter».

Разделитель в таблице регистра накопления, бухгалтерии

При этом таблица движений остается неизменной, разделителем в ней выступает «Регистратор». Изменение мы видим в таблице итогов.

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

Такая реализация режима разделения итогов делает возможным выполнять параллельную запись всем транзакциям.

В нашем примере с двумя документами при включении режима наблюдается следующее:

Параллельная запись в регистре

Оба наших документа выполнили параллельную запись своих данных благодаря новому полю «Разделитель». В результате не возникают ожидания при блокировках и повышена параллельность работы пользователей.

Минусы режима разделения итогов

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

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

В нашем случае с двумя документами для получения остатка товара «Стол» по складу «Основной» возникает необходимость сложения двух строк для получения итогового значения «7». При выключенном разделителе группировка строк (сложение) не требуется.

Когда следует использовать режим разделения итогов?

Для этого необходимо выполнить условия:

  1. По регистру нет контроля остатков — нет чтения данных в транзакции. В регистрах бухгалтерии контроль остатков, как правило, отсутствует. Но если контроль остатков присутствует, то мы не получим никакого выигрыша в производительности. К тому же, при контроле остатков нужно использовать свойство набора записей «БлокироватьДляИзменения», так как возникает вероятность взаимоблокировки.
  2. С регистром выполняется параллельная работа пользователей, причем активная.

При последовательной работе с регистром или работе с малым числом пользователей нет смысла включать режим разделения итогов: отсутствие конкурирующих транзакций не приводит к ожиданиям на блокировках, и, соответственно, не наблюдается эффекта от использования режима разделения итогов.

Бурмистров Андрей

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте — http://vk.com/kursypo1c.

Если Вы еще не вступили в группу — сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.

Если Вы уже участник группы — нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кеш браузера или подписаться через другой браузер.
Станьте экспертом по оптимизации 1С, изучив наш курс
«Ускорение и оптимизация систем на 1С:Предприятие 8.3 (2016). Подготовка на 1С:Эксперт по технологическим вопросам»

Содержание курса и форма заказа: http://курсы-по-1с.рф/1c-v8/optimization/

35 учебных часов, подготовка к 1С:Эксперт, правильная настройка серверной части, оптимизация кода, мониторинг загруженности оборудования и прочие взрослые вещи.

19 Responses to Оптимизация «1С:Предприятие 8» – Режим разделения итогов

  • Andronav
    Andy

    Добрый день!
    Подскажите пожалуйста, Вы пишите что этот режим не следует применять если по регистру существует контроль остатков — и есть чтение данных в транзакции. Т.е. в новых методах оперативного проведения (списание, затем контроль остатков) в регистре накопления ОстаткиТоваров этот режим должен быть отключён? На экзамене по специалисту на это обращают внимание?

    • Андрей Бурмистров

      > Т.е. в новых методах оперативного проведения (списание, затем контроль остатков) в регистре накопления ОстаткиТоваров этот режим должен быть отключён?

      Либо отключен, либо у набора записей этого регистра должно быть установлено свойство БлокироватьДляИзменения=Истина. Если этого не сделать, то при параллельном проведении документов с одинаковыми значениями в 8.2 будет возможен дедлок, а в 8.3 будут возможны отрицательные остатки.

      > На экзамене по специалисту на это обращают внимание?
      Вот этого не могу сказать.

  • kruglay
    kruglay

    Добрый день!
    во всех книгах, курсах «БлокироватьДляИзменения = Истина» не ставят в документе ПриходнаяНакладная подскажите почему? Ведь если я перепровожу документ ПриходнаяНакладная то я должен блокировать поля по которым был приход иначе можно товар списать в минус. Пример: было Стул 2шт, перепровожу меняя Стул на Тумбу и в этот момент списываю Стул, то у меня спишется в минус. Вопрос возник т.к. сдавал на спеца и там поставил в документе ПриходнаяНакладная «БлокироватьДляИзменения = Истина» мне написали лишняя блокировка.

    • Андрей Бурмистров

      В таком случае при перепроведении можно ставить БлокироватьДляИзменения=Истина, а при проведении не ставить.

    • TG

      По идее при перепроведении со сменой Стула на Тумбу по таблице итогов будут наложены две неявные блокировки по измерению регистра. И с БлокироватьДляИзменеия это никак не связано. А на экзамене по спецу могли такое написать в случае если БлокироватьДляИзменения использовалось для регистра без разделения итогов, например, или с разделением итогов но без контроля остатков.

    • Вит

      Каким образом можно списать товар «в минус» в ПРИХОДНОЙ накладной? Правильно написали, что блокировка лишняя.

      • TreeDogNight
        TreeDogNight

        Он имел ввиду, что при перепроведении Приходной накладной может одновременно проводиться Расходная накладная, которая будет списывать товар, который в Приходной накладной решили поменять

  • Данияр
    hjkl

    Добрый день.

    Вопрос на смежную тему с сабжем этой статьи:

    Существует предположение — свойство набора записей н-го регистра «БлокироватьДляИзменения» имеет смысл применять в случае:
    1) Если транзакция работает в управляемом режим;
    2) Если у регистра, к которому принадлежит набор записей, установлен режим разделения итогов.
    3) Если используется новая методика контроля остатков.

    По 3) пункту я бы поспорил(но не здесь), по второму следующие вопросы:
    1. Верно ли это утверждение?
    2. Что произойдет если программист написал код по вышеуказанным условиям с использованием свойства набора записей н-го регистра «БлокироватьДляИзменения», а пользователь отключил через «предприятие» разделение итогов для этого регистра, неужели придется переписывать код?
    3) Также говорят что БлокироватьДляИзменения при записи набора записей отключает сабж этой статьи.
    Если это так зачем вообще зависит его работа от режима разделения итогов?

    • Андрей Бурмистров

      1. Верно ли это утверждение?

      Верно

      2. Что произойдет если программист написал код по вышеуказанным условиям с использованием свойства набора записей н-го регистра «БлокироватьДляИзменения», а пользователь отключил через «предприятие» разделение итогов для этого регистра, неужели придется переписывать код?

      Не надо ничего переписывать, ошибки не будет. БлокироватьДляИзменения=Истина будет просто игнорироваться, т.к. разделитель и так уже отключен.

      3. Также говорят что БлокироватьДляИзменения при записи набора записей отключает сабж этой статьи.
      Если это так зачем вообще зависит его работа от режима разделения итогов?

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

  • Данияр
    hjkl

    Добрый день.

    Только что решил проверить, как раз в работе подвернулась ситуация для этого.

    1С Предприятие 8.3.4.496 СУБД POSGRESQL — пакет от 1С, который датируется декабрем прошлого года, как точно называется версия этого пакета я не помню, помню что их две — другая кажется датирована февралем 2012 года. конфигурация бухгалтерия для Казахстана релиз 2.0.16. У этой конфы режим обычного приложения.

    Сделал новый регистр накопления с измерениями номенклатура и кол-во и новый документ, который формирует движения по этому регистру. У документ проведение безусловное — просто формируется движения по данным таб.части.

    В метаданных регистра поставил галочку разделения итогов и включил этот режим для регистра в предприятии в «Управление итогами».

    Запускую два сеанса 1С:Предприятие 8 — 1 в режиме отладки(в процедуре проведения стоит точка останова) провожу первый документ и проведение останавливается, в это время во втором сеансе я запускаю проведение второго документа и он не проводится просто крутиться индикатор мышки, но как только отпускаю с точки останова первый документ и его транзакция завершается тут же проводится второй.

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

    Воспроизвел аналогичную ситуацию на довольно старой конфигурации — но платформа и субд те же.
    УПП для казахстана еще со времен 8.1, стоит режим совместимости 8.1 и режим совместимости интерфейсов 8.2 в свойствах конфигурации.

    Так вот там через некоторое время при проведении документа 2 выходит сообщение о конфликте блокировок в транзакции.

    На ум приходит 4 варианта — я что то не понял или сделал что то не так, на СУБД постгрес это не работает или он глючит, глюк платформы, автор статьи заблуждается.

    • Татьяна Гужавина

      Добрый день!
      От СУБД этот механизм зависеть не должен, если стоит управляемый режим блокировок.
      Посмотрите какой именно режим управления блокировкой данных стоит у конфигурации.
      Если стоит автоматический, то попробуйте поставить управляемый и повторить опыт.
      Так же необходимо, чтобы после записи движений не было чтения.

      • Данияр
        hjkl

        Доброе утро.

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

        Затем в свойствах обоих конфигураций поставил режим управления блокировкой данных автоматический и управляемый и:

        Если у Документа режим блокировки автоматический а у регистра накопления управляемый ситуация не меняется, если наоборот возникает ошибка менеджера блокировок при попытки провести/снять с проведения документ.

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

        Выходит что режим разделение итогов корректно работает в управляемом режиме блокировки данных.

        Возник еще один вопрос:
        Допустим есть документ который приходует товар, и есть документ который расходует товар из регистра. Приходный документ не считывает остатки в транзакции проведения, а расходный считывает.

        Имеет ли смысл включать разделение итогов для регистра для того чтобы приходные документы могли проводиться параллельно?

        При этом в расходном документ используется управляемая блокировка на этот регистр, то есть возможна ситуация когда списываемые товары не пересекаются с поступающими, если пересекаются то тут все понятно — режим разделения итогов будет бесполезен.

        • Татьяна Гужавина

          Добрый день!
          Выходит что режим разделение итогов корректно работает в управляемом режиме блокировки данных.
          Это утверждение справедливо только для СУБД версионников.
          Дело в том, что в автоматическом режиме блокировок версионники блокируют всю таблицу, поэтому разделитель итогов тут не помогает.

          Имеет ли смысл включать разделение итогов для регистра для того чтобы приходные документы могли проводиться параллельно?
          Да, для регистра имеет смысл включить разделение итогов. При этом приходные документы будут без проблем проводиться, даже если указаны одинаковые значения реквизитов в документе.
          Если у Вас в расходном документе упр. блокировка и контроль остатков идет до записи, тогда ничего больше делать не нужно.
          В этом случае 2 расхода или 1 приход и 1 расход по одинаковым значениям измерений параллельно провестись не смогут.

          • Stark

            Добрый день!
            А что означает «Это утверждение справедливо только для СУБД версионников.»?
            Что за СУБД такие? И относятся ли к ним MS SQL, Postgree, файловый вариант базы 1С.

            • Андрей Бурмистров

              Версионные СУБД поддерживаемые 1С это Oracle и PostgreSQL.

          • Stark

            Тогда я правильно понимаю, что режим разделения итогов корректно работает в автоматическом режиме блокировки данных в файловом варианте 1С и в MS SQL?

            • Андрей Бурмистров

              В файловом варианте режим разделения итогов не имеет смысла, т.к. независимо от режима блокировки, в файловом варианте всегда блокируется вся таблица.
              В автоматическом режиме на MS SQL Server будет работать разделение итогов, но все равно из-за особенностей работы автоматического режима остается риск избыточных блокировок из-за блокирования соседних записей диапазона.

  • Данияр
    hjkl

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

    • Татьяна Гужавина

      Добрый день!
      Если Вы используете режим управляемых блокировок, то это Вас никак не обязывает обязательно включать режим разделения итогов.
      Разделение итогов — это отдельный механизм.

Написать ответ

Ваш email не будет опубликован. Обязательные поля отмечены *