Существует две методики контроля остатков при проведении документов. На экзамене «1С:Специалист по платформе 1С:Предприятие 8.3» требуется знать обе методики и уметь их применять.
В этих методиках используются разные механизмы для блокировки данных. Правильное применение этих методик и механизмов блокировки данных позволит решать задачи правильно как на экзамене, так и на реальных внедрениях. Подробный разбор нюансов применения блокировок при различных методиках приведен тренером в Мастер-группе одного из наших курсов.
Вопрос
В «старой» методике контроля остатков используются программные блокировки средствами встроенного языка.
В «новой» методике используется свойство набора записей регистра БлокироватьДляИзменения.
Можете подробнее объяснить, почему сделаны такие выводы?
- Почему не используется объект «БлокировкаДанных» для «новой» методики?
- Почему не используется «БлокироватьДляИзменения» для «старой» методики?
Ответ тренера
Прежде всего, давайте вспомним, что такое и как работает свойство «БлокироватьДляИзменения» набора записей регистра накопления. В синтаксис-помощнике для этого свойства сказано следующее:
«Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей. Имеет смысл использовать, если проверка итогов регистра выполняется после записи и заблокировать нужно именно те комбинации, по которым записываются записи. В этом случае можно не использовать объект БлокировкаДанных.»
Иными словами, при установленном свойстве БлокироватьДляИзменения в значение Истина будут заблокированы нужные записи регистра в момент записи набора записей регистра, для которого установлено это свойство. А теперь вспомним, что из себя представляют «старая» и «новая» методики проведения. Схематично их можно представить так:
«Старая» методика:
- Получаем нужные данные (в частности, данные об остатках) на момент ДО момента времени документа.
- Выполняем проверку (в частности, проверяем, хватает ли остатков для выполнения движений).
- Если проверка в п. 2
- пройдена (остатков хватает) – выполняем движения и записываем результат в информационную базу (запись результата выполняется всегда, хотя она может и не вызываться явно, например, при установке свойства Записывать в значение Истина для свойства документа Движения).;
- НЕ пройдена (остатков не хватает) – отменяем проведение документа.
«Новая» методика:
- Выполняем нужные движения.
- Записываем движения документа.
- Выполняем проверку состояния системы, которое получилось после движений документа (в частности, проверяем, не появились ли в результате проведения документа отрицательные остатки регистра) на момент ПОСЛЕ момента времени документа.
- Если по результатам проверки в п.3 выявлено некорректное состояние системы (в частности, обнаружены отрицательные остатки), отменяем проведение документа.
Обратите внимание, в какой момент для каждой из этих методик производится запись движений.
В «старой» – после выполнения всех действий, в «новой» – до выполнения получения данных и проверки. Вспомним также, для чего нужна блокировка данных. Основное её назначение – обеспечение неизменности данных, которые получены из информационной базы и используются для анализа, до момента окончания обработки этих данных. В частности, нужно обеспечить, чтобы, пока текущий документ обрабатывает данные, формируя движения, данные в базе не были изменены кем-то ещё – до момента, пока данный документ не закончит обработку движений и не израсходует нужное количество из остатка.
В случае «новой» методики блокировка нужна именно в момент записи движений. Начиная с этого момента, данные изменяются, а затем проверяются, поэтому нужно не допустить параллельного изменения данных кем-то другим. Поэтому для «новой» методики свойство «БлокироватьДляИзменения» оказывается как нельзя кстати: и записали движения, и одновременно заблокировали связанные записи регистра.
В случае же «старой» методики запись движений в базу выполняется в самом конце процесса, а блокировать данные надо гораздо раньше: начиная с момента, когда данные об остатках получены из базы, никто другой не должен их менять, иначе требование неизменности обрабатываемых данных будет нарушено.
В этом случае блокировка устанавливается непосредственно перед выполнением запроса – задолго до записи движений в базу. А так как блокировка с использованием свойства «БлокироватьДляИзменения» устанавливается только при записи, в случае «старой» методики заблокировать нужные данные в нужный момент с помощью свойства «БлокироватьДляИзменения» не получится. Поэтому остается единственный вариант установить блокировку – использовать объект «БлокировкаДанных».
Заметим также, что и при использовании «новой» методики для установки блокировки можно было бы использовать объект «БлокировкаДанных», но использование свойства «БлокироватьДляИзменения» набора записей регистра оказывается удобнее и эффективнее.
Подготовка к аттестации 1С:Специалист по платформе 1С:Предприятие 8.3.
“можно рассматривать на разных уровнях: упрощенно и более глубоко”
И что: “Специалист по платформе” должен думать, что блокировка происходит только при установке “БлокироватьДляИзменения”, а автоматической блокировки при записи нет?
P.S. Не совсем туда запостил: это про ответ Павла Серикова.
Для этого экзамена не требуется глубокого знания механизма блокировок; требования к использованию блокировок при решении экзаменационных задач минимальны. Поэтому да, можно воспринимать блокировки весьма упрощённо и, тем не менее, успешно сдать экзамен.
В упрощенном подходе есть свои плюсы: проще запомнить и охватить всю схему целиком (как в данной статье, где акцент сделан именно на принципиальных различиях при использовании блокировок в “новой” и “старой” методиках). Тем не менее, в данном курсе мы рассказываем несколько больше, чем требуется на экзамене, даем дополнительные знания и навыки. При этом, как правило, оговаривается, что является минимально необходимым для сдачи экзамена. И слушатели курса могут сами решить, на каком уровне уровне изучать материал: минимальном – только для сдачи экзамена, или более глубоком – с прицелом на практику.
А в статье от 2017 года сказано, что БлокироватьДляИзменения ничего не блокирует и лишь выключает режим разделения итогов.
https://xn—-1-bedvffifm4g.xn--p1ai/news/2017-03-09-how-attribute-lock-to-change-works/
Как сейчас работает это свойство, можно узнать? Та статья уже сильно устаревшая получается?
Здравствуйте.
Статья актуальна.
То, как действует свойство БлокироватьДляИзменения и для чего оно предназначено, можно рассматривать на разных уровнях: упрощенно и более глубоко. Здесь представлен упрощенный подход, в упомянутой Вами статье – более глубокий разбор данного свойства.
Согласно официальной документации фирмы 1с, свойство БлокироватьДляИзменения нужно для того, чтобы установить управляемую блокировку в момент записи набора записей регистра для всех комбинаций измерений в соответствии с записями набора записей. Причем из описания следует, что использование свойства БлокироватьДляИзменения заменяет собой использование объекта БлокировкаДанных, т.е. аналогично по своему действию явному использованию объекта БлокировкаДанных.
Посмотрите, например, справку в синтаксис-помощнике для свойства БлокироватьДляИзменения, а также следующие статьи на сайте ИТС:
Модификация конфигураций при переходе к режиму управляемых блокировок
Управление блокировками данных в транзакции, механизм
Блокирующее чтение остатков в начале транзакции
Обратите внимание, в этих документах использование свойства БлокироватьДляИзменения либо вообще не связывается с режимом разделения итогов, либо этот режим упоминается вскользь. И получается, что до записи набора записей регистра, если предполагается дальнейший контроль отрицательных остатков (новая методика), всегда нужно устанавливать свойства БлокироватьДляИзменения в значение Истина – чтобы блокировка данных была установлена правильно.
Однако, как выясняется, это упрощенный вариант объяснения, все несколько сложнее.
В следующих статьях подробно объясняется, почему устанавливать свойство БлокироватьДляИзменения в значение Истина имеет смысл только при записи наборов данных тех регистров, для которых включен режим разделения итогов.
Дело в том, что именно в этом случае будут заблокированы все соответствующие значениям в наборе записи регистра без учета разделителя.
Если же режим разделения итогов выключен, значение свойства БлокироватьДляИзменения просто игнорируется. То есть и ошибки не возникнет, но и какого-то эффекта от его установки также не будет: исключительная управляемая блокировка будет неявным образом установлена системой самостоятельно независимо от значения этого свойства.
Статьи:
Как работает свойство БлокироватьДляИзменения
Что на самом деле делает свойство «БлокироватьДляИзменения»
Методика оперативного проведения и управляемые блокировки в 1С:Предприятие 8.3 раздел Управляемые блокировки в новой технологии контроля остатков
Загадочное свойство БлокироватьДляИзменения
И несколько статей по режиму разделения итогов:
Оптимизация «1С:Предприятие 8» – Режим разделения итогов
Устройство и использование режима разделения итогов регистров
Так как ситуация получается несколько запутанная, при решении экзаменационных задач можно рекомендовать следующий подход: программный код проведения по новой методике делать универсальным, чтобы он работал и при включении режима разделения итогов, и при его отключении. То есть, если используется новая методика контроля отрицательных остатков, перед записью набора записей регистра всегда устанавливать свойство БлокироватьДляИзменения в значение Истина, независимо от того, используется режим разделения итогов, или нет. Ошибки это не вызовет, а вот от претензий, почему эта фраза отсутствует, может избавить. Для аргументации можно сослаться на синтаксис помощник и приведенные выше статьи на сайте 1С.