[ Вопрос дня ] Какие блокировки используются в «старой» и «новой» методиках проведения документов?

Существует две методики контроля остатков при проведении документов. На экзамене «1С:Специалист по платформе 1С:Предприятие 8.3» требуется знать обе методики и уметь их применять.

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

Вопрос

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

В «новой» методике используется свойство набора записей регистра БлокироватьДляИзменения.

Можете подробнее объяснить, почему сделаны такие выводы?

  1. Почему не используется объект «БлокировкаДанных» для «новой» методики?
  2. Почему не используется «БлокироватьДляИзменения» для «старой» методики?

Ответ тренера

Прежде всего, давайте вспомним, что такое и как работает свойство «БлокироватьДляИзменения» набора записей регистра накопления. В синтаксис-помощнике для этого свойства сказано следующее: 

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

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

«Старая» методика:

  1. Получаем нужные данные (в частности, данные об остатках) на момент ДО момента времени документа.
  2. Выполняем проверку (в частности, проверяем, хватает ли остатков для выполнения движений).
  3. Если проверка в п. 2
    • пройдена (остатков хватает) – выполняем движения и записываем результат в информационную базу (запись результата выполняется всегда, хотя она может и не вызываться явно, например, при установке свойства Записывать в значение Истина для свойства документа Движения).;
    • НЕ пройдена (остатков не хватает) – отменяем проведение документа.

«Новая» методика:

  1. Выполняем нужные движения.
  2. Записываем движения документа.
  3. Выполняем проверку состояния системы, которое получилось после движений документа (в частности, проверяем, не появились ли в результате проведения документа отрицательные остатки регистра) на момент ПОСЛЕ момента времени документа.
  4. Если по результатам проверки в п.3 выявлено некорректное состояние системы (в частности, обнаружены отрицательные остатки), отменяем проведение документа.

Обратите внимание, в какой момент для каждой из этих методик производится запись движений.

В «старой» – после выполнения всех действий, в «новой» – до выполнения получения данных и проверки. Вспомним также, для чего нужна блокировка данных. Основное её назначение – обеспечение неизменности данных, которые получены из информационной базы и используются для анализа, до момента окончания обработки этих данных. В частности, нужно обеспечить, чтобы, пока текущий документ обрабатывает данные, формируя движения, данные в базе не были изменены кем-то ещё – до момента, пока данный документ не закончит обработку движений и не израсходует нужное количество из остатка. 

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

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

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

Заметим также, что и при использовании «новой» методики для установки блокировки можно было бы использовать объект «БлокировкаДанных», но использование свойства «БлокироватьДляИзменения» набора записей регистра оказывается удобнее и эффективнее.

Комментарии / обсуждение (4):

  1. magic1s

    “можно рассматривать на разных уровнях: упрощенно и более глубоко”
    И что: “Специалист по платформе” должен думать, что блокировка происходит только при установке “БлокироватьДляИзменения”, а автоматической блокировки при записи нет?
    P.S. Не совсем туда запостил: это про ответ Павла Серикова.

    • Павел Сериков

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

      В упрощенном подходе есть свои плюсы: проще запомнить и охватить всю схему целиком (как в данной статье, где акцент сделан именно на принципиальных различиях при использовании блокировок в “новой” и “старой” методиках). Тем не менее, в данном курсе мы рассказываем несколько больше, чем требуется на экзамене, даем дополнительные знания и навыки. При этом, как правило, оговаривается, что является минимально необходимым для сдачи экзамена. И слушатели курса могут сами решить, на каком уровне уровне изучать материал: минимальном – только для сдачи экзамена, или более глубоком – с прицелом на практику.

  2. Jack 3.5

    А в статье от 2017 года сказано, что БлокироватьДляИзменения ничего не блокирует и лишь выключает режим разделения итогов.
    https://xn—-1-bedvffifm4g.xn--p1ai/news/2017-03-09-how-attribute-lock-to-change-works/

    Как сейчас работает это свойство, можно узнать? Та статья уже сильно устаревшая получается?

    • Павел Сериков

      Здравствуйте.

      Статья актуальна.
      То, как действует свойство БлокироватьДляИзменения и для чего оно предназначено, можно рассматривать на разных уровнях: упрощенно и более глубоко. Здесь представлен упрощенный подход, в упомянутой Вами статье – более глубокий разбор данного свойства.

      Согласно официальной документации фирмы 1с, свойство БлокироватьДляИзменения нужно для того, чтобы установить управляемую блокировку в момент записи набора записей регистра для всех комбинаций измерений в соответствии с записями набора записей. Причем из описания следует, что использование свойства БлокироватьДляИзменения заменяет собой использование объекта БлокировкаДанных, т.е. аналогично по своему действию явному использованию объекта БлокировкаДанных.
      Посмотрите, например, справку в синтаксис-помощнике для свойства БлокироватьДляИзменения, а также следующие статьи на сайте ИТС:
      Модификация конфигураций при переходе к режиму управляемых блокировок
      Управление блокировками данных в транзакции, механизм
      Блокирующее чтение остатков в начале транзакции

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

      Однако, как выясняется, это упрощенный вариант объяснения, все несколько сложнее.
      В следующих статьях подробно объясняется, почему устанавливать свойство БлокироватьДляИзменения в значение Истина имеет смысл только при записи наборов данных тех регистров, для которых включен режим разделения итогов.
      Дело в том, что именно в этом случае будут заблокированы все соответствующие значениям в наборе записи регистра без учета разделителя.
      Если же режим разделения итогов выключен, значение свойства БлокироватьДляИзменения просто игнорируется. То есть и ошибки не возникнет, но и какого-то эффекта от его установки также не будет: исключительная управляемая блокировка будет неявным образом установлена системой самостоятельно независимо от значения этого свойства.

      Статьи:
      Как работает свойство БлокироватьДляИзменения
      Что на самом деле делает свойство «БлокироватьДляИзменения»
      Методика оперативного проведения и управляемые блокировки в 1С:Предприятие 8.3 раздел Управляемые блокировки в новой технологии контроля остатков
      Загадочное свойство БлокироватьДляИзменения

      И несколько статей по режиму разделения итогов:
      Оптимизация «1С:Предприятие 8» – Режим разделения итогов
      Устройство и использование режима разделения итогов регистров

      Так как ситуация получается несколько запутанная, при решении экзаменационных задач можно рекомендовать следующий подход: программный код проведения по новой методике делать универсальным, чтобы он работал и при включении режима разделения итогов, и при его отключении. То есть, если используется новая методика контроля отрицательных остатков, перед записью набора записей регистра всегда устанавливать свойство БлокироватьДляИзменения в значение Истина, независимо от того, используется режим разделения итогов, или нет. Ошибки это не вызовет, а вот от претензий, почему эта фраза отсутствует, может избавить. Для аргументации можно сослаться на синтаксис помощник и приведенные выше статьи на сайте 1С.

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

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

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.