Ошибка записи блокировка для изменения запрещена для автоматического режима блокировки

Ошибка возникает при записи набора записей стандартным образом (Через процедуру ОбработкаПроведения) в РН СвободныеОстатки.

Как я понимаю, всё из-за того что я установил блокировку в этой строке:

    Движения.СвободныеОстатки.БлокироватьДляИзменения = Истина;

Ошибка:

блокировка для изменения запрещена для автоматического режима блокировки

Вот скрин ошибки

http://i33.fastpic.ru/big/2014/0413/96/b4ebe9fb4b77645145aba306c9329c96.png

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

Начнем так: свойство БлокироватьДляИзменения – ничего не блокирует.

Хотя казалось бы – ровно для этого и существует :)

Еще один пример того, что можно искренне считать, что понимаешь как что-то работает – и не догадываться о заблуждении :))

Как работает свойство БлокироватьДляИзменения набора записей регистра накопления и бухгалтерии, известно далеко не всем специалистам по 1С.

С одной стороны, вроде бы многие знают, когда это свойство нужно использовать (если не знаете – предварительно прочитайте
статью про контроль остатков).

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

Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей.

На самом деле никакую блокировку это свойство не устанавливает! Для чего же так пишут справке? Сложно сказать – возможно, чтобы не усложнять жизнь начинающим разработчикам :)

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

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

Начнем с того, что работа свойства БлокироватьДляИзменения отличается для платформы 8.2 и 8.3. Поэтому рассмотрим 2 сценария.

Использование платформы “1С:Предприятие 8.2” и MS SQL Server

Допустим, что 2 пользователя одновременно проводят 2 документа продажи товаров (пусть это будут столы). При этом в конфигурации используется новая методика контроля остатков (сначала запись движений, потом чтение остатков).

Если у регистра накопления с остатками товаров включено разделение итогов, можем получить следующую ситуацию:

Рисунок 1. Схема взаимной блокировки

В представленной ситуации 2 пользователя списывают товар «Стол» со склада «Основной», при этом на складе осталось всего 10 столов.

Так как включено разделение итогов, то оба пользователя параллельно делают движения в таблице итогов, накладывая при этом исключительную управляемую блокировку и X-блокировку СУБД на свои строки. Блокировка будет наложена по полям Склад + Товар + Разделитель, и так как разделитель (splitter) разный, то обе блокировки установятся успешно.

Далее каждый из пользователей пытается выполнить контроль остатков с помощью запроса, и здесь начинается самое интересное.

Запрос к регистру пытается прочитать все строки, где склад равен «Основной» и товар равен «Стол», без условия по разделителю. При чтении запрос накладывает S-блокировку СУБД.

Иванов может прочитать свою строку, но не может прочитать строку, которую занял пользователь Петров (так как S и X-блокировки не совместимы). В итоге Иванов ждет Петрова. Петров, в свою очередь, может прочитать свою строку, но не может прочитать строку, занятую Ивановым, и тоже встает в очередь.

На схеме синие стрелки показывают успешно наложенные блокировки, красные показывают ожидание на блокировке.

В результате мы получаем взаимную блокировку: Иванов ждет Петрова, а Петров ждет Иванова. Как решить эту проблему, рассмотрим чуть позже. А сейчас перейдем к следующему сценарию.

Отметим, что взаимоблокировки не было бы, если бы режим разделения итогов регистра был отключен. Но, во-первых, режим разделения итогов в общем случае положительно влияет на производительность. Во-вторых, нужно всегда делать устойчивые решения, чтобы при неаккуратных действиях ничего не сломалось :)

Использование платформы “1С:Предприятие 8.3” или использование в качестве СУБД версионника

Сейчас мы рассмотрим сценарий, когда используется платформа 8.3 без режима совместимости с 8.2. Либо когда в качестве СУБД выступает версионник (PostgreSQL, Oracle) – не важно, с какой платформой и в каком режиме.

Кратко отметим, что особенность СУБД версионника в том, что при чтении он не блокирует данные. При использовании 8.3 без режима совместимости с 8.2, MS SQL Server тоже может работать как версионник.

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

Рисунок 2. Схема получения отрицательных остатков

Как исправить проблемы?

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

Чтобы не допустить этих проблем, как раз и было придумано свойство набора записей регистров накопления и бухгалтерии – БлокироватьДляИзменения.

Если до записи движений установить данное свойство в значение «Истина», то блокировка будет накладываться без учета разделителя. То есть поведение будет таким, как будто разделитель итогов у регистра выключен.

Следует отметить что блокировка будет наложена вне зависимости от значения данного свойства. Если БлокироватьДляИзменения имеет значение «Истина», то блокировка будет без учета разделителя, иначе – с учетом разделителя. По умолчанию значение свойства БлокироватьДляИзменения равно «Ложь».

Допустим программист внес исправления в код:

Движения.ТоварыНаСкладах.БлокироватьДляИзменения=Истина; Движения.Записать();

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

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

Рассмотрим поведение системы, если использовать данное свойство.

Рисунок 3. Схема работы при “БлокироватьДляИзменения=Истина”

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

При этом ожидание будет происходить на управляемых блокировках, то есть на сервере 1С. Сервер СУБД даже не будет «знать» о том, что транзакция Петрова ожидает своей очереди.

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

Несколько вопросов и заблуждений по теме

Часто нам задают вопросы по использованию свойства БлокироватьДляИзменения. Рассмотрим наиболее популярные из них.

Вопрос 1

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

Ответ

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

Вопрос 2

Нужно ли использовать БлокироватьДляИзменения в файловом режиме?

Ответ

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

Вопрос 3

Нужно ли устанавливать БлокироватьДляИзменения при очистке движений?

Ответ

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

Вопрос 4

Нужно ли использовать свойство БлокироватьДляИзменения при автоматических блокировках?

Ответ
При попытке использовать БлокироватьДляИзменения в автоматическом режиме блокировок система выдаст сообщение об ошибке: «Ошибка записи! Блокировка для изменения запрещена для автоматического режима блокировки». Данное свойство можно использовать только для управляемого режима блокировок.

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

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

Выводы

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

Следует использовать данное свойство только при выполнении всех 3 условий:

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

Надеемся, теперь механика работы платформы будет ясна и белых пятен в знаниях специалистов 1С станет меньше :)

Об авторе

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

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

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

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.

Начнем так: свойство БлокироватьДляИзменения – ничего не блокирует.

Хотя казалось бы – ровно для этого и существует :)

Еще один пример того, что можно искренне считать, что понимаешь как что-то работает – и не догадываться о заблуждении :))

Как работает свойство БлокироватьДляИзменения набора записей регистра накопления и бухгалтерии, известно далеко не всем специалистам по 1С.

С одной стороны, вроде бы многие знают, когда это свойство нужно использовать (если не знаете – предварительно прочитайте
статью про контроль остатков).

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

Устанавливает режим, при котором в процессе записи набора будет установлена управляемая блокировка для всех комбинаций измерений в соответствии с записями набора записей.

На самом деле никакую блокировку это свойство не устанавливает! Для чего же так пишут справке? Сложно сказать – возможно, чтобы не усложнять жизнь начинающим разработчикам :)

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

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

Начнем с того, что работа свойства БлокироватьДляИзменения отличается для платформы 8.2 и 8.3. Поэтому рассмотрим 2 сценария.

Использование платформы “1С:Предприятие 8.2” и MS SQL Server

Допустим, что 2 пользователя одновременно проводят 2 документа продажи товаров (пусть это будут столы). При этом в конфигурации используется новая методика контроля остатков (сначала запись движений, потом чтение остатков).

Если у регистра накопления с остатками товаров включено разделение итогов, можем получить следующую ситуацию:

Рисунок 1. Схема взаимной блокировки

В представленной ситуации 2 пользователя списывают товар «Стол» со склада «Основной», при этом на складе осталось всего 10 столов.

Так как включено разделение итогов, то оба пользователя параллельно делают движения в таблице итогов, накладывая при этом исключительную управляемую блокировку и X-блокировку СУБД на свои строки. Блокировка будет наложена по полям Склад + Товар + Разделитель, и так как разделитель (splitter) разный, то обе блокировки установятся успешно.

Далее каждый из пользователей пытается выполнить контроль остатков с помощью запроса, и здесь начинается самое интересное.

Запрос к регистру пытается прочитать все строки, где склад равен «Основной» и товар равен «Стол», без условия по разделителю. При чтении запрос накладывает S-блокировку СУБД.

Иванов может прочитать свою строку, но не может прочитать строку, которую занял пользователь Петров (так как S и X-блокировки не совместимы). В итоге Иванов ждет Петрова. Петров, в свою очередь, может прочитать свою строку, но не может прочитать строку, занятую Ивановым, и тоже встает в очередь.

На схеме синие стрелки показывают успешно наложенные блокировки, красные показывают ожидание на блокировке.

В результате мы получаем взаимную блокировку: Иванов ждет Петрова, а Петров ждет Иванова. Как решить эту проблему, рассмотрим чуть позже. А сейчас перейдем к следующему сценарию.

Отметим, что взаимоблокировки не было бы, если бы режим разделения итогов регистра был отключен. Но, во-первых, режим разделения итогов в общем случае положительно влияет на производительность. Во-вторых, нужно всегда делать устойчивые решения, чтобы при неаккуратных действиях ничего не сломалось :)

Использование платформы “1С:Предприятие 8.3” или использование в качестве СУБД версионника

Сейчас мы рассмотрим сценарий, когда используется платформа 8.3 без режима совместимости с 8.2. Либо когда в качестве СУБД выступает версионник (PostgreSQL, Oracle) – не важно, с какой платформой и в каком режиме.

Кратко отметим, что особенность СУБД версионника в том, что при чтении он не блокирует данные. При использовании 8.3 без режима совместимости с 8.2, MS SQL Server тоже может работать как версионник.

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

Рисунок 2. Схема получения отрицательных остатков

Как исправить проблемы?

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

Чтобы не допустить этих проблем, как раз и было придумано свойство набора записей регистров накопления и бухгалтерии – БлокироватьДляИзменения.

Если до записи движений установить данное свойство в значение «Истина», то блокировка будет накладываться без учета разделителя. То есть поведение будет таким, как будто разделитель итогов у регистра выключен.

Следует отметить что блокировка будет наложена вне зависимости от значения данного свойства. Если БлокироватьДляИзменения имеет значение «Истина», то блокировка будет без учета разделителя, иначе – с учетом разделителя. По умолчанию значение свойства БлокироватьДляИзменения равно «Ложь».

Допустим программист внес исправления в код:

Движения.ТоварыНаСкладах.БлокироватьДляИзменения=Истина; Движения.Записать();

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

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

Рассмотрим поведение системы, если использовать данное свойство.

Рисунок 3. Схема работы при “БлокироватьДляИзменения=Истина”

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

При этом ожидание будет происходить на управляемых блокировках, то есть на сервере 1С. Сервер СУБД даже не будет «знать» о том, что транзакция Петрова ожидает своей очереди.

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

Несколько вопросов и заблуждений по теме

Часто нам задают вопросы по использованию свойства БлокироватьДляИзменения. Рассмотрим наиболее популярные из них.

Вопрос 1

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

Ответ

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

Вопрос 2

Нужно ли использовать БлокироватьДляИзменения в файловом режиме?

Ответ

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

Вопрос 3

Нужно ли устанавливать БлокироватьДляИзменения при очистке движений?

Ответ

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

Вопрос 4

Нужно ли использовать свойство БлокироватьДляИзменения при автоматических блокировках?

Ответ
При попытке использовать БлокироватьДляИзменения в автоматическом режиме блокировок система выдаст сообщение об ошибке: «Ошибка записи! Блокировка для изменения запрещена для автоматического режима блокировки». Данное свойство можно использовать только для управляемого режима блокировок.

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

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

Выводы

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

Следует использовать данное свойство только при выполнении всех 3 условий:

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

Надеемся, теперь механика работы платформы будет ясна и белых пятен в знаниях специалистов 1С станет меньше :)

Об авторе

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

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

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

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.

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

Если по каким-либо причинам одно из действий транзакции невыполнимо или произошло какое-либо нарушение работы системы, база данных возвращается в то состояние, которое было до начала транзакции (происходит откат транзакции).

Блокировка (в общем случае) — это информация о том, что данный ресурс «захвачен» кем-то для выполнения какого-то действия.

Суть блокировки:

  • запрет некоторых действий над общим ресурсом на некоторое ограниченное время.

В силу различных причин блокировки могут быть:

  1. необходимыми («хорошими») — благодаря им обеспечивается предсказуемость действий пользователей, целостность и непротиворечивость данных;
  2. избыточными («плохими»).

В системе 1С:Предприятие 8 различают:

  • объектные блокировки (позволяют осуществлять конкурентный доступ пользователей к данным 1С:Предприятия в терминах объектов информационной базы, например, при интерактивной работе пользователей в формах: редактировании существующих объектов, удалении, создании новых и др.);
  • транзакционные блокировки (обеспечивают конкурентный доступ к данным в целях целостности и непротиворечивости хранимых данных).

Виды блокировок объектов базы данных 1С:

  1. объектная пессимистическая;
  2. объектная оптимистическая;

Объектная пессимистическая блокировка

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

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

Пессимистическая блокировка объектов базы данных:

  • используется системой 1С:Предприятие для блокировки объектов, редактируемых в форме;
  • устанавливается:
    1. автоматически — в момент начала модификации объекта в форме, указанного в качестве основного реквизита формы (при этом если другой пользователь попытается выполнить редактирование того же объекта, ему будет выдано сообщение о том, что не удалось заблокировать объект);
    2. программно — метод объектов Заблокировать() или метод глобального контекста ЗаблокироватьДанныеДляРедактирования().
  • снимается, когда пользователь, редактировавший объект, закроет форму объекта.

Пример

Отсюда

Войдем в информационную базу под пользователем Иванов, откроем форму элемента 1С:Предприятие 8.0. Управление торговлей справочника Номенклатура (код 12) и изменим цену продажи с 420,00 на 450,00Не сохраняя сделанные изменения, войдем в информационную базу еще раз, но теперь под именем пользователя Петров. Откроем форму того же элемента справочника и попробуем изменить значение какого-либо реквизита. Любая попытка изменения приведет к появлению специального окна с сообщением об ошибке:

Пессимистическая блокировка 1С

[свернуть]

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

Использование объектной пессимистической блокировки

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

  1. убедиться, не заблокирован ли он другими объектами;
  2. попытаться предотвратить его изменение другими пользовательскими сеансами (или другими экземплярами объекта в этом же сеансе).

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

Примеры

Отсюда

Пример № 1.

Требуется заблокировать объект и, если это удалось, модифицировать данные. В противном случае – проинформировать пользователя об отказе в выполнении операции с помощью сообщения вида:

«Не удалось заблокировать запись. Действие (изменение, удаление или блокировка записи) не выполнено. Ошибка блокировки объекта. Объект уже заблокирован: компьютер: <имя компьютера>, пользователь: <имя пользователя>, сеанс: <номер сеанса>, начат: <дата и время>, приложение: <тип клиентского приложения>».

ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();

// Выполнить блокировку объекта от изменения другими режимами

// или пользователями; в случае блокировки — 

// вывести пользователю сообщение об исключении.

ФайлОбъект.Заблокировать(); 

// Затем изменить и записать объект

ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();

ФайлОбъект.Записать();

Аналогичным образом, можно воспользоваться методом глобального контекста ЗаблокироватьДанныеДляРедактирования:

ФайлОбъект = ДанныеФайла.Ссылка.ПолучитьОбъект();

// Выполнить блокировку объекта от изменения другими режимами

// или пользователями; в случае блокировки — 

// вывести пользователю сообщение об исключении.

ЗаблокироватьДанныеДляРедактирования(ДанныеФайла.Ссылка); 

// Затем изменить и записать объект

ФайлОбъект.Редактирует = Справочники.Пользователи.ПустаяСсылка();

ФайлОбъект.Записать();

Пример № 2.

Требуется пропустить обработку объекта, если он заблокирован для редактирования. При очередном вызове процедуры (например, из фонового или регламентного задания) будет предпринята повторная попытка изменения объекта.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Объект = ТекущаяВерсия.ПолучитьОбъект();

// Выполнить блокировку объекта от изменения другими режимами

// или пользователями

УстановитьПолноеНаименование = Истина;

Попытка 

ФайлОбъект.Заблокировать();

Исключение

// в случае блокировки — не выполнять изменение объекта

УстановитьПолноеНаименование = Ложь;

// записать предупреждение в журнал регистрации

ЗаписьЖурналаРегистрации(НСтр(«ru = ‘Фоновое обновление имен файлов’», Метаданные.ОсновнойЯзык.КодЯзыка),

УровеньЖурналаРегистрации.Предупреждение,, ФайлОбъект, ОписаниеОшибки());

КонецПопытки;

// Пропустить обработку объекта, если он заблокирован.

Если УстановитьПолноеНаименование Тогда

  Объект.ПолноеНаименование = ПолноеНаименование;

  Объект.Записать();

КонецЕсли;

[свернуть]

Не следует проверять блокировку объектов для редактирования в следующих случаях:

  1. при выполнении отдельных операций, имеющих по логике работы больший приоритет по сравнению с интерактивными действиями пользователя (например, загрузка данных при обмене);
  2. при действиях, которые гарантированно выполняются в монопольном режиме (например, в процедурах обновления и первоначального заполнения данных информационной базы).

Для снятия пессимистической блокировки разработчик может использовать метод объекта Разблокировать(), причем использовать его для того же самого экземпляра объекта, для которого ранее была установлена блокировка.

ВАЖНО! Объектные блокировки не влияют на операции над данными и на процесс течения транзакций (они расположены на другом уровне работы с данными):

  1. если блокировка объекта вызвала исключение, то оно может быть обработано разработчиком конфигурации и не приведет к обязательному откату транзакции;
  2. блокировки объектов, установленные в течение транзакции, сохраняются при фиксации транзакции и снимаются при откате транзакции.

Объектная оптимистическая блокировка

Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных другими сеансами или другими программными объектами этого же сеанса.

Таким образом оптимистическая блокировка гарантирует, что пользователь изменяет актуальные данные объекта, которые хранятся в информационной базе, а не какой-то их предыдущий вариант.

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

Примеры

Отсюда

Рассмотрим пример. Откроем два сеанса работы с прилагаемой к работе информационной базой: один под пользователем Иванов, а другой — под пользователем Петров. В обоих сеансах откроем откроем форму элемента Управление торговлей справочника Номенклатура (код 12). Теперь в сеансе, открытом от имени пользователя Иванов, изменим цену продажи с 420,00 на 450,00 и запишем сделанные изменения. После этого, в сеансе, открытом от имени пользователя Петров попробуем изменить значение какого-либо реквизита. Любая попытка изменения приведет к появлению другого окна с сообщением об ошибке:

[свернуть]

Механизм транзакционных блокировок

Возможные проблемы при многопользовательском доступе к одним и тем же данным

Подробнее…

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

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

  1. Проблема потерянного изменения (англ. The Lost Update Problem) — если две транзакции изменяют одни и те же данные, взяв в качестве первоисточника начальное значение этих данных, то в системе останутся изменения внесенные той транзакцией, которая записала свои изменения последней, поскольку эти изменения заменят собой все изменения, внесенные до этого. Вывод:
    • нельзя одновременно изменять одни и те же данные.
  2. Проблема «грязного» чтения (англ. The Uncommitted Dependency Problem) — если одна транзакция начнет считывать некоторые данные не дождавшись окончания внесения изменений, вносимых в эти данные другой транзакцией, то достаточно вероятен случай, когда прочитанные данные будут содержать неверную информацию. Вывод:
    • нельзя читать уже измененные, но еще не записанные данные.
  3. Проблема неповторяемого чтения (англ. The Inconsistent Analysis Problem) — если одна транзакция несколько раз считывает одни и те же данные, а вторая — вносит изменения в эти данные между циклами чтения данных первой транзакции, то при повторном считывании первая транзакция может получить другой набор данных. Вывод:
    • нельзя повторно читать измененные и записанные данные, если эти же самые данные уже были прочитаны до внесения в них изменений.
  4. Проблема чтения фантомов (англ. The Phantom Read Problem) — если первая транзакция считывает данные и потом на их основе осуществляет определенные действия, а вторая транзакция в этот момент добавляет в эти данные новую информацию, то как и в предыдущем случае это может привести к некорректному результату. Вывод:
    • нельзя вводить новые данные (удалить имеющиеся), если они могут попасть в уже один раз прочитанные данные при повторном чтении.

Строго говоря, список вышеперечисленных проблем не является окончательным.

[свернуть]

Уровни изоляции транзакций

Уровни изоляции транзакций в современных СУБД являются механизмом гибкой настройки ограничений, позволяющих:

  1. допустить параллельное выполнение транзакций ради увеличения производительности системы;
  2. обеспечить необходимую степень целостности данных (ограничить параллельность транзакций при работе с одними ресурсами).

Например, MS SQL Server 2000 позволяет использовать следующие уровни изоляции транзакции:

  • READ UNCOMMITED — незавершенное чтение. Низший уровень изоляции, обеспечивает максимальную параллельность выполнения транзакций. Данный уровень защищает изменяемые текущей (актуальной) транзакцией данные от изменений, которые могут внести конкурирующие транзакции. Если другой транзакции необходимо изменить те же самые данные, то она должна ожидать завершения изменения данных текущей (актуальной) транзакцией. Однако чтение данных разрешено. Таким образом этот уровень изоляции допускает чтение незавершенных изменений данных.
  • READ COMMITED —  обеспечивает запрет «грязного» чтения. Если текущая (актуальная) транзакция начала изменять данные, то конкурирующая транзакция не может не только изменить, но даже прочитать их до завершения изменений, вносимых текущей (актуальной) транзакцией. После того, как изменения, вносимые текущей (актуальной) транзакцией закончены, конкурирующие транзакции могут читать данные, не дожидаясь окончания текущей (актуальной) транзакции в целом. Таким образом решается проблема неповторяемого чтения.
  • REPEATABLE READ — обеспечивает повторяемость чтения данных. Если текущая (актуальная) транзакция начинает читать данные, то другая транзакция не может их изменить до окончания текущей (актуальной) транзакции.
  • SERIALIZABLE — последовательное выполнение. Этот уровень изоляции является максимальным и обеспечивает полную изоляцию транзакций друг от друга. Решаются все рассмотренные проблемы, включая проблему «фантомов».

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

Режим автоматических блокировок

В режиме автоматических блокировок 1С:Предприятие целиком «полагается» на возможности, предоставляемые СУБД.

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

  СУБД
   Файловая база данных  MS SQL Server  IBM DB2  PostgreSQL
 Вид блокировок  Таблиц  Записей  Записей  Таблиц
 Уровень изоляции транзакций  Serializable  Repeatable Read или Serializable  Serializable  Read Committed

Режим автоматических блокировок:

  1. может привести к возникновению избыточных блокировок;

  2. не позволяет достичь желаемой параллельности работы пользователей.

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

Тип блокировок, устанавливаемых в том или ином случае, зависит от вида операции, используемого 1С:Предприятием уровня изоляции транзакций и определяется внутренними механизмами самой СУБД (например, MS SQL Server).

Режим управляемых блокировок

В 1С:Предприятии реализован дополнительный режим работы, позволяющий использовать собственный менеджер транзакционных блокировок 1С:Предприятия, независимый от используемой СУБД.

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

При работе в этом режиме система использует гораздо более низкий уровень изоляции транзакций для MS SQL Server и IBM DB2, и блокировку на уровне записей для PostgreSQL, что позволяет достичь более высокой параллельности работы пользователей:

  СУБД
   Файловая база данных  MS SQL Server  IBM DB2  PostgreSQL
 Вид блокировок  Таблиц  Записей  Записей  Записей
 Уровень изоляции транзакций  Serializable  Read Committed  Read Committed  Read Committed

Однако этот уровень изоляции транзакций СУБД уже не может сам по себе обеспечить целостность и непротиворечивость данных во всех случаях. Поэтому 1С:Предприятие 8 при модификации данных методами встроенного языка (например, метод Записать() у объектных данных) устанавливает собственные управляемые блокировки в транзакции, которые обрабатываются собственным менеджером транзакционных блокировок. Эти блокировки также могут быть установлены и разработчиком самостоятельно в тех местах кода, где требуется:

  • обеспечить неизменность считываемых в транзакции данных (разделяемая блокировка);
  • запретить чтение данных другими транзакциями (исключительная блокировка).

Порядок действия механизма управляемых блокировок:

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

Установка режима управления блокировками для объектов конфигурации

В структуре объектов конфигурации существует несколько возможностей для задания режима управления блокировками:

  1. через свойство «Режим управления блокировкой данных» в палитре свойств конфигурации и(или) объекта;
  2. установка управляемых блокировок средствами встроенного языка.

Установка режима управления блокировками через свойство «Режим управления блокировкой данных» в палитре свойств конфигурации или объекта

Управление блокировками 1С

  • режим Автоматический используются автоматические блокировки, устанавливаемые СУБД. Собственный менеджер блокировок 1C:Предприятия не задействован.
  • режим Управляемый — система всегда самостоятельно устанавливает необходимые управляемые блокировки, обрабатываемые собственным менеджером транзакционных блокировок (независимо от того, какие режимы управления блокировками установлены для конкретных объектов конфигурации). Этот режим предназначен для работы всей конфигурации только с управляемыми блокировками в транзакции.
  • режим Автоматический и управляемый — для конкретного объекта конфигурации режим блокировки будет определяться значением свойства Режим управления блокировкой данных самого объекта конфигурации. Этот режим предназначен для постепенного или частичного перевода конфигурации в режим управляемых блокировок. Он позволяет отдельным объектам метаданных работать с управляемыми блокировками (например, наиболее «проблемным» документам и регистрам), в то время как остальные объекты работают в режиме автоматических блокировок.

Сочетания режимов управления блокировками в транзакции в режиме Автоматический и управляемый:

Режим существующей транзакции Режим начинаемой транзакции Результат
 Автоматический  Автоматический  Начинаемая транзакция будет выполнена в автоматическом режиме
 Управляемый  Управляемый  Начинаемая транзакция будет выполнена в управляемом режиме
 Автоматический  Управляемый  Начинаемая транзакция будет выполнена в автоматическом режиме
 Управляемый  Автоматический  Будет вызвана исключительная ситуация

Особенности режимов управления блокировками для документов

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

Интерактивное проведение документа по регистру делает две транзакции:

  1. запись самого документа;
  2. внутри этой записи (транзакции) запись набора строк по регистру.

В зависимости от режима управления блокировками для самого документа и двигаемого им регистра, возможны четыре ситуации:

  1. Режим документа Автоматический, режим регистра Автоматический -> запись по регистру в автоматическом режиме
  2. Режим документа Управляемый, режим регистра Управляемый-> запись по регистру в управляемом режиме
  3. Режим документа Автоматический, режим регистра Управляемый -> запись по регистру в автоматическом режиме
  4. Режим документа Управляемый, режим регистра Автоматический -> исключительная ситуация (ошибка)

[свернуть]

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

  1. свойство конфигурации Режим управления блокировкой данных необходимо установить в значение Автоматический и управляемый;
  2. свойство Режим управления блокировкой данных объекта метаданных документ необходимо установить в значение Управляемый;
  3. у всех регистров, по которым данный документ выполняет движения, следует установить свойство Режим управления блокировкой данных в значение Управляемый;
  4. проанализировать процедуру проведения документа на предмет наличия:
    • явных вызовов транзакций
    • неявных вызовов транзакций, которые выполняются системой при модификации данных каких-либо объектов конфигурации
  5. для найденных явных и неявных вызовов транзакций обеспечить их выполнение в управляемом режиме
    • для явных вызовов — параметр метода НачатьТранзакцию();
    • для неявных вызовов — свойство Режим управления блокировкой данных модифицируемого объекта конфигурации;
  6. в теле процедуры проведения документа установить необходимые управляемые блокировки.

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

Средствами встроенного языка установка управляемых блокировок внутри явной или скрытой (неявной) транзакции происходит с помощью специального объекта БлокировкаДанных,  который предназначен для явной блокировки данных от чтения или изменения другими сессиями.

Управление блокировкой данных средствами встроенного языкаОписание доступных свойств и методов которого можно посмотреть в синтакс-помощнике в ветви «Общие объекты» — «Управление блокировкой данных».

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

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

Допустимы следующие имена пространств блокировок и имена полей пространств блокировок:

  • для объектных данных (справочник, документ и др.) определено единственное пространство блокировки — сам объект данных;
  • для необъектных данных (например, регистры) определено по два пространства блокировок, которые имеют разный логический смысл.

Перечень допустимых имен

  Имя пространства блокировок Поля пространства блокировок
 Справочник.<имя>  Ссылка
 Документ.<имя>   Ссылка
 ПланОбмена.<имя>   Ссылка
 ПланСчетов.<имя>   Ссылка
 БизнеcПроцесс.<имя>   Ссылка
 Задача.<имя>   Ссылка
 ПланВидовРасчета.<имя>   Ссылка
 ПланВидовХарактеристик.<имя>   Ссылка
 РегистрСведений.<имя>.НаборЗаписей — только для регистра сведений, подчиненного регистратору  Регистратор
 РегистрСведений.<имя>  Период — если есть;
<имя измерения>
 РегистрНакопления.<имя>.НаборЗаписей  Регистратор
 РегистрНакопления.<имя> Период;
<имя измерения>
 РегистрБухгалтерии.<имя>.НаборЗаписей  Регистратор
 РегистрБухгалтерии.<имя>  Период;
<вид движения> — значение системного перечисления ВидДвиженияБухгалтерии;
Счет — обязательное поле;
Субконто;
<вид субконто>;
<имя измерения>
 РегистрРасчета.<имя>.НаборЗаписей  Регистратор
 РегистрРасчета.<имя>  ПериодРегистрации;
ПериодДействия;
<имя измерения>
 Перерасчет.<имя>.НаборЗаписей  ОбъектПерерасчета
 Перерасчет.<имя>  ВидРасчета
 Последовательность.<имя>.НаборЗаписей  Регистратор
 Последовательность.<имя>  <имя измерения>
 Константа.<имя>  

Пространство блокировок с суффиксом НаборЗаписей используется в тех случаях, когда необходимо заблокировать сами записи данного объекта (например, при добавлении новых записей).

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

[свернуть]

Порядок действий при установке управляемых блокировок средствами встроенного языка:

  1. добавить элемент блокировки, соответствующий некоторому пространству блокировок;
  2. установить для этого элемента режим блокировки (разделяемая или исключительная);
  3. определить значения полей блокировки (указать, какие же именно записи будут заблокированы — для каждого пространства блокировок в платформе определены имена полей, значения которых могут задаваться при установке тех или иных блокировок).

ВНИМАНИЕ!

Следует понимать, что, в данном случае речь не идет о реальных записях базы данных. Несмотря на то, что управляемые блокировки описываются в терминах объектов метаданных и их полей, эти блокировки никак не связаны с реальной структурой хранения данных 1С:Предприятия в СУБД. Это всего лишь записи о том, что заблокировано «нечто».

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

Однако в других случаях провести такую аналогию достаточно затруднительно, да и не нужно. Например, при блокировке регистра бухгалтерии с указанием значения вида субконто, мы запрещаем другим транзакциям каким-либо образом изменять «записи» регистра бухгалтерии, у которых значение вида субконто равно указанному нами. Как при этом данное условие «проецируется» на реальную структуру данных регистра бухгалтерии — для нас совершенно не важно.

При установке новых блокировок менеджер анализирует имеющиеся блокировки. Если оказывается, что «нечто», что мы пытаемся заблокировать, уже заблокировано ранее, сравниваются режимы существующей и новой блокировок. Если режимы совместимы — новая блокировка устанавливается. Если режимы не совместимы — новая блокировка ожидает снятия существующей блокировки.

[свернуть]

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

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

Способы задания условий на поля пространств блокировки

Существует два способа задания условий на поля пространств блокировки:

  1. с помощью явного задания имени поля и его значения;
  2. с помощью указания источника данных, содержащего необходимые значения.

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

При явном задании имени поля и его значения необходимо использовать метод УстановитьЗначение() объекта ЭлементБлокировкиДанных. В этом случае имя и значение указывают в качестве параметров метода, например так, как показано в листинге 1.

Листинг 1

Листинг 1. Пример установки условия блокировки записей с помощью явного указания имени поля и его значения

// Создать объект блокировка данных

БлокировкаДанных = Новый БлокировкаДанных;

// Добавить новый элемент блокировки, блокирующий «нечто» в данных регистра накопления Остатки номенклатуры

ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.ОстаткиНоменклатуры»);

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

ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

// Указать, что именно мы блокируем в данных регистра Остатки номенклатуры — все «записи», у которых значение измерения Склад равно значению, содержащемуся в переменной Склад

ЭлементБлокировки.УстановитьЗначение(«Склад», Склад);

[свернуть]

Для значений типа Дата или Число в качестве значения может быть задан некоторый диапазон значений. Диапазон значений передается методу с помощью объекта встроенного языка — Диапазон. Данный объект позволяет задать верхнюю и нижнюю границы диапазона, причем в диапазон включаются и границы диапазона (листинг 2).

Листинг 2

Листинг 2. Пример установки условия блокировки записей с помощью задания диапазона

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

// Создать объект блокировка данных

БлокировкаДанных = Новый БлокировкаДанных;

// Добавить новый элемент блокировки, блокирующий «нечто» в данных регистра накопления Продажи

ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.Продажи»);

// Установить режим блокировки — разделяемый. Эти данные гарантировано не будут изменены другими транзакциями до окончания существующей транзакции

ЭлементБлокировки.Режим = РежимБлокировкиДанных. Разделяемый;

// Указать, что именно мы блокируем в данных регистра Продажи — все «записи», у которых значение измерения Контрагент равно значению, содержащемуся в переменной Контрагент

ЭлементБлокировки.УстановитьЗначение(«Контрагент», Контрагент);

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

Диапазон = Новый Диапазон(НачалоМесяца(Дата), Дата);

// Указать, что именно мы блокируем в данных регистра Продажи — все «записи», у которых значение измерения Контрагент равно значению, содержащемуся в переменной Контрагент, и значение поля Период содержится в указанном диапазоне

ЭлементБлокировки.УстановитьЗначение(«Период», Диапазон);

[свернуть]

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

При указании источника данных сначала необходимо задать свойство ИсточникДанных объекта ЭлементБлокировкиДанных, после чего, используя метод ИспользоватьИзИсточникаДанных(), настроить соответствие полей области блокировки данных полям источника данных (листинг 3).

Листинг 3

Листинг 3. Пример установки условия блокировки записей с помощью источника данных

БлокировкаДанных = Новый БлокировкаДанных;

// Добавить новый элемент блокировки, блокирующий «нечто» в данных регистра накопления Остатки номенклатуры

ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.ОстаткиНоменклатуры»);

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

ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

// Указать, что именно мы блокируем в данных регистра Остатки номенклатуры — все «записи», у которых значение измерения Склад равно значению, содержащемуся в переменной Склад

ЭлементБлокировки.УстановитьЗначение(«Склад», Склад);

// Указать источник данных, который содержит данные для установки ограничений на другие поля этого элемента блокировки — в данном случае таблица значений СписокНоменклатуры

ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; 

// Указать, что именно мы блокируем в данных регистра Остатки номенклатуры — все «записи», у которых значение измерения Склад равно значению, содержащемуся в переменной Склад, и у которых значение измерения Номенклатура равно какому-либо значению, содержащемуся в колонке Номенклатура указанного источника данных

ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);

[свернуть]

В качестве источника данных можно указывать:

  • результат запроса;
  • табличную часть;
  • набор записей;
  • таблицу значений.

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

Объект Диапазон также может являться значением поля источника данных.


Для установки всех созданных блокировок используется метод объекта БлокировкаДанных — Заблокировать():

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

В многопользовательских системах важную роль играет правильная организация структуры и настройка блокировок. Если ее нет, пользователям придется часто сталкиваться с ошибками, вызванными конкуренцией за определенные ресурсы системы. Но существует проблема конфликта блокировок, знакомая многим пользователям. Почему возникает конфликт блокировок 1С и как его устранить?

Содержание

    • Конфликт блокировок в 1С 8.3 и его значение
    • Причины возникновения ошибок блокировки в 1С
    • Как исправить конфликт блокировок в 1С 8.3
    • Быстрое решение конфликта блокировок 1С
  • Изменение настроек конфигурации
  • Переключение объекта в управляемый режим
  • Перевод регистров в управляемый режим
  • Найти все транзакции с этими объектами
    • Корректировка программного кода в транзакция
    • Заменить конструкцию ДЛЯ ИЗМЕНЕНИЯ
    • Рекомендуем к прочтению

Конфликт блокировок в 1С 8.3 и его значение

Для большинства пользователей сообщение о конфликте блокировок 1С означает лишь ошибку, мешающую им выполнять свою работу. Они хотят поскорее избавиться от этой проблемы и осаждают IT-отдел жалобами на то, что «1С не работает».

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

1С блокировка при проведении документа

Причины возникновения ошибок блокировки в 1С

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

Если не брать идеальные варианты, то конфликты блокировок 1С встречаются по следующим причинам:

Одновременная работа пользователей с большим объемом данных. Эта первопричина продиктована внутренними механизмами 1С. Они предполагают запрет изменения данных, вовлеченных в транзакцию, запущенную от имени другого пользователя;

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

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

Как исправить конфликт блокировок в 1С 8.3

Системное сообщение «конфликт блокировки при выполнении транзакции 1С 8.3» не характеризует конфигурацию в качестве неверно спроектированной. Но если подобные сигналы игнорировать, то существует вероятность в самый ответственный момент, например, при сдаче квартальной или годовой отчетности получить большие проблемы. В лучшем случае – тормозящую систему и недовольных пользователей. В худшем – неправильные данные на выходе, что может повлечь за собой штрафные санкции от контролирующих органов.

Решением проблемы конфликта блокировок в 1С 8.3 может стать перевод конфигурации на управляемый (ручной) режим управления блокировками. Реализованный в версии 8.1, механизм в руках грамотных специалистов решает проблему конфликта блокировок при транзакции в 1С.

1С блокировка при проведении документа

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

Быстрое решение конфликта блокировок 1С

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

Для быстрого решения проблемы существуют два пути:

  • Найти и завершить сеанс, заблокировавший необходимые данные. В небольших компаниях, где количество пользователей 1С не превышает пары десятков человек, это оптимальный вариант решения;
  • Если вы контролируете систему, в которой работают сотни сотрудников, поиск нужного сеанса без специализированного программного обеспечения может затянуться надолго. В этом случае намного эффективнее будет перезагрузить сервер.

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

Ошибка 1С: “Конфликт блокировок при выполнении транзакции”. В чем причина?

Этот вопрос возник у нас на проекте по внедрению ЗУП2.5 с численностью 20000 и средним количеством одновременных пользовательских сессий 200.

На этапе опытной эксплуатации при расчете зарплаты пользователи начали интенсивно работать с документами «Начисление зарплаты сотрудникам организаций». Объем документов был порядка 2500 строк. У пользователей начали появляться сообщения «Конфликт блокировок при выполнении транзакции», и расчет приходилось запускать заново.

1С блокировка при проведении документа

Стали разбираться. Оказалось, мы столкнулись с эффектом «Избыточной блокировки». Обычно этот эффект появляется при параллельном проведении документов, во время него самым первым документом блокируется большой объем записей регистров на все время проведения документа. Эта блокировка задерживает проведение остальных документов, мешает параллельной работе пользователей и замедляет рабочий процесс. Вообще блокировка данных при проведении документов вещь полезная, она сохраняет целостность данных и гарантирует правильность выполнения расчетных алгоритмов. Но бывает так, что либо объем заблокированных данных чрезмерен, либо время блокировки слишком велико. В результате мы имеем многопользовательскую систему, которая по сути является однопользовательской: вместо параллельного проведения документов — последовательное.

Ошибки в 1С из-за блокировок

Пример необходимой блокировки в 1С

Представим такую ситуацию – есть два документа «Начисление зарплаты сотрудникам организаций», в которых указан одинаковый налоговый период, а на закладке НДФЛ указаны одинаковые сотрудники. Рассмотрим случай, когда блокировка вообще отсутствует. Если последовательно запускать расчет этих документов, то в первом сумма НДФЛ посчитается правильно, а во втором будет равна нулю, т.к. рассчитанный и фактически начисленный НДФЛ на момент проведения второго документа будут совпадать.

Но если запустить эти документы параллельно, то они одновременно начислят НДФЛ, не подозревая о существовании друг друга, и в результате налог удвоится. Если блокировка настроена верно, то первый документ, запущенный на долю секунды раньше второго, успеет первым прочитать и заблокировать данные о фактически исчисленном налоге в регистре «НДФЛ расчеты с бюджетом» по сотруднику Пушкину А.С. Из этого запроса будет видно, что фактический налог за январь пока не начислялся и значит надо выполнить движение по регистру. Блокировка будет отпущена только после завершения записи в регистр. Второй документ, дойдя до запроса чтения фактически начисленного налога будет поставлен системой на ожидание до тех пор, пока первый документ не закончит транзакцию проведения, после чего он прочитает в запросе, что налог уже начислен и движение по регистру выполнять не надо. Это необходимая блокировка.

Конечно, этот пример притянут за уши для простоты объяснения. На самом деле логика ЗУП 2.5 такова, что для задвоения НДФЛ пользователям не нужно прикладывать особых усилий. НДФЛ рассчитывается до проведения документа, а при проведении содержимое табличной части просто заносится в регистры без всякой проверки. Пользователям между расчетом и проведением предоставляется возможность посмотреть будущий результат и при необходимости поправить руками. Конечно это большой плюс в пользу гибкости ЗУПа, но предъявляет высокие требования к профессиональному уровню расчетчиков. Поэтому вопрос предотвращения задвоения НДФЛ решается организационным путем или с помощью дополнительных проверочных отчетов. Конечно, в ЗУП2.5 есть регистры, которые рассчитываются и записываются одновременно при проведении документа, например «НДФЛ к зачету», но этот пример пришлось бы дольше объяснять ;).

Пример избыточной блокировки в 1С

А теперь представим другую ситуацию. При проведении документа выполняется запрос, который должен отобрать документы, в которых присутствует сотрудник из этого документа. Но запрос написан так, что сервер SQL вынужден находить нужные документы методом перебора. Для технических специалистов это означает, что вместо CLUSTERED INDEX SCAN выполняется TABLE SCAN, т.е. вместо сканирования таблицы индексов происходит сканирование самой таблицы. Причем в процессе перебора блокируются все записи, к которым прикоснулся запрос, даже те, в которых не присутствуют искомые сотрудники. И эта блокировка будет действовать до конца завершения проведения документа, что будет препятствовать параллельному проведению документов с другими сотрудниками. Это избыточная блокировка.

Как избавиться от избыточных блокировок в 1С

Лечение избыточных блокировок может идти двумя путями. Первый — это оптимизация запросов, выполняемых внутри транзакций и добавление необходимых табличных индексов в конфигураторе. Второй — это перевод выполнения SQL-запросов на более низкий уровень изоляции, когда при выполнении запросов записи в таблицах блокируются только на момент выполнения самого запроса, либо не блокируются вовсе. А необходимые блокировки устанавливаются средствами объекта «БлокировкаДанных» и выполняются на стороне сервера 1С.

Теперь немного теории про уровни изоляции на SQL сервере:

1. В автоматическом режиме в транзакциях используется уровень изоляции SERIALIZABLE. Этот уровень накладывает блокировки типа X (запрещает чтение и запись) до конца транзакции на все данные, которых коснулись запросы или произошла запись данных.

2. В управляемом режиме в транзакциях используется уровень изоляции ReadCommitted. Этот уровень на записанные данные также устанавливает блокировки типа X до конца транзакции. Но при выполнении запросов на данные накладывает блокировки типа S (запрещает запись и проверяет нет ли в этот момент параллельных записей), при завершении запроса блокировки снимаются не дожидаясь завершения транзакции.

3. Если база данных переведена в режим ReadCommitted SNAPSHOT, то в управляемом режиме при чтении данных не накладывается блокировка типа S, есть только блокировка типа X при записи.

Тоже самое чуть более подробно в таблице:

1С блокировка при проведении документа

Обычно лечение начинают с понижения уровня изоляции, т.к. это не особо трудозатратно и дает быстрый результат. Достаточно перевести конфигурацию из «Автоматического» режима управления блокировкой данных в «Управляемый», и транзакции начнут выполняться на уровне изоляции типа ReadCommitted, вместо SERIALIZABLE или Repeatable Read.

Чтобы переключить базу данных в режим READ COMMITTED SNAPSHOT (RCSI) необходимо в «SQL Server Management Studio» в свойствах базы данных установить параметр «Is Read Committed Snapshot On» в значение «True»:

1С блокировка при проведении документа

В некоторых источниках предлагают установить параметр «Allow Snapshot Isolation» в значение «True», но в этом нет необходимости, т.к. это приведет к включению другого режима изоляции SNAPSHOT, который не поддерживается платформой 1С (На момент написания статьи релиз платформы 8.3.9).

Режим управления блокировкой данных задается для неявных транзакций, которые выполняются при записи или при проведении документов, т.е. внутри предопределенных процедур типа ПриЗаписи() или ОбработкаПроведения(). Но большинство «тяжелых» вычислений в типовой конфигурации ЗУП2.5 происходит при выполнении команды «Рассчитать». При этом в модуле объекта запускается процедура РассчитатьВсе(), внутри которой неоднократно повторяется конструкция НачатьТранзакцию() …ЗафиксироватьТранзакцию(). Это явно указанные транзакции, внутри которых происходит запись и очистка регистров и выполняются запросы. Нам необходимо убедиться, что при переключении конфигурации в управляемый режим в процедуре «РассчитатьВсе()» транзакции также начинают выполняться на уровне ReadCommitted.

Для этого проведем небольшой эксперимент:

• Запустим SQL Server Profiler.

• Запустим «NEW TRACE».

• Выполним подключение к серверу SQL.

• В окне «Trace Properties» на закладке «General» выберем «Use the template» = «Blank», а на закладке «Events Selections» раскроем группу «Stored Procedures» и выберем «RPC:Complited». По кнопке «Column Filters» укажем имя базы и длительность выполнения запросов более 1.

1С блокировка при проведении документа 1С блокировка при проведении документа
• Кнопку RUN пока нажимать не будем, т.к. нам надо сначала запустить базу данных в режиме отладки и остановить выполнение расчета документа «Начисление зарплаты сотрудникам организаций» перед выполнением самого массивного запроса. Например, это будет команда
«Результат = Запрос.ВыполнитьПакет();» в функции «ПолучитьДанныеНДФЛПоРегистратору» в общем модуле «ПроведениеРасчетов». Здесь происходит выполнение основного запроса для расчета НДФЛ. Поставим на ней точку останова отладчика и запустим расчет в документе.
1С блокировка при проведении документа
· После того как отладчик остановится, нажмем кнопку RUN в Профайлере.

· Теперь сделаем один шаг в отладчике кнопкой F11. Когда запрос будет выполнен и отладчик перейдет на следующий шаг, остановим чтение Профайлера кнопкой «Pause Selected Trace».

· Теперь найдем самый длительный запрос по колонке Duration и внимательно изучим текст запроса. Если при обращении к реальной (а не временной) таблице после слова WITH стоит SERIALIZABLE, то мы имеем дело с автоматическим режимом блокировки. Если ничего не стоит – то с управляемым.

1С блокировка при проведении документа 1С блокировка при проведении документа

Если в хинте запроса (Hint – это параметр после слова WITH, позволяющий влиять на план выполнения запроса) не указан уровень изоляции, то выполняется уровень изоляции, установленный по умолчанию для текущей SQL-сессии. Определить уровень изоляции, действующий по умолчанию для текущих сессий можно в «SQL Server Management Studio» с помощью команды

SELECT CASE transaction_isolation_level

WHEN 0 THEN ‘Unspecified’

WHEN 1 THEN ‘ReadUncommitted’

WHEN 2 THEN ‘ReadCommitted’

WHEN 3 THEN ‘Repeatable’

WHEN 4 THEN ‘SERIALIZABLE’

WHEN 5 THEN ‘SNAPSHOT’ END AS TRANSACTION_ISOLATION_LEVEL

В управляемом режиме для всех сессий будет указан режим ReadCommitted.

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

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

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

Но на мой взгляд, для таких конфигураций, как ЗУП2.5 вообще нет смысла использовать какие-либо блокировки, лучше использовать проверочные отчеты для выявления нарушения целостности данных — на практике это самый быстрый способ расчета зарплаты. Особенно на крупных предприятиях, где точно есть сотрудники с внутренним совмещением в обособленных подразделениях, а за каждым ОП закреплен отдельный расчетчик, что и является причиной задвоения НДФЛ. Какой бы не был вышколенный персонал, сама идеология конфигурации допускает возможность задвоения НДФЛ. Поэтому лучше не мешать пользователям работать параллельно во время массированных месячных расчетов, а по завершении точечно и быстро исправить небольшой процент ошибок, чем заставлять их сидеть и нервничать в очереди из-за страха допустить хотя бы одну ошибку. В этом проекте мы использовали самописный отчет «Проверка НДФЛ», который отображал сотрудников с некорректным НДФЛ.

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

О пользе перехода на управляемые блокировки в 1С 8.3 было сказано не раз — это сильно повышает эффективность и производительность работы оборудования.

Если Вам необходим партнер для перевода конфигурации в управляемый режим блокировок, просто обратитесь к нам! Подробности — услуги 1С.

Сам по себе процесс не такой уж и трудный. Однако процесс достаточно тонкий. Переход на управляемый режим неквалифицированным специалистом может сделать еще хуже.

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

1С блокировка при проведении документа

Вся методика умещается в 7 коротких пунктах:

Изменение настроек конфигурации

Переключите в палитре свойств конфигурации режим блокировок — «Управляемый и автоматический»:

1С блокировка при проведении документа

Получите 267 видеоуроков по 1С бесплатно:

Переключение объекта в управляемый режим

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

1С блокировка при проведении документа

Перевод регистров в управляемый режим

Необходимо перевести ВСЕ регистры 1С (накопления, бухгалтерии, сведений, расчета), которые производят движения данным документом, в режим управляемых блокировок:

1С блокировка при проведении документа

Найти все транзакции с этими объектами

Необходимо найти все транзакции с этими объектами метаданных. Как явные, так и не явные.

Явные — те, которые вызываются в коде с помощью метода «НачатьТранзакцию()».

НЕ явные — те, которые вызываются в обработчиках объектов — «ПриЗаписи», «ОбработкаПроведения» и т.д.

Корректировка программного кода в транзакция

Для явных транзакций необходимо передать в параметр метода «НачатьТранзакцию()» параметр «РежимУправленияБлокировкойДанных.Управляемый».

Для НЕ явных транзакций установить блокировки с помощью объекта системы «БлокировкаДанных».

Пример использования блокировки:

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ТоварыНаСкладах»);
ЭлементБлокировки.УстановитьЗначение(«Качество», Справочники.Качество.НайтиПоКоду(«1»));
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ДокументОбъект.ВозвратнаяТара;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Склад», «Склад»);
Блокировка.Заблокировать();

Заменить конструкцию ДЛЯ ИЗМЕНЕНИЯ

Эта конструкция не отрабатывает в режиме управляемых блокировок. Данную конструкцию следует заменить объектом «БлокировкаДанных».

Если Вам необходим партнер для перевода конфигурации в управляемый режим блокировок, просто обратитесь к нам! Подробности — услуги 1С.

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

  • Печать

Страницы: 1 29 30 [31] 32 33 36

Тема: Билет 2. Спец по платформе V8  (Прочитано 117213 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Коллеги а кто подскажет по этому вопросу, что за ошибка такая?
Ошибка записи! Блокировка для изменения запрещена для автоматического режима блокировки (Регистр накопления: Остатки номенклатуры)

Измените режим управления блокировкой на управляемый. Сейчас у Вас автоматический


Записан


Добрый день, почему в СПР для документов нужно установить «Оперативное проведение — запретить»? С каким условием это связано

Включение оперативного проведения влечет за собой активацию ряда дополнительных механизмов, дополнительного контроля, в частности:
1) Документ будет стремиться проводиться оперативно — при проведении нового документа, а также документа с датой текущего дня, его время будет установлено в соответствии с оперативной отметкой времени, а именно — крайним на временной оси. То есть документы будут последовательно выстроены как минимум с разницей в секунду, таким образом все документы будут выстроены в хронологической последовательности в соответствии с очередностью проведения.
2) Запрещено будет проводить документы с датой, большей даты сегодняшнего дня.
Во многих типовых конфигурациях контроль остатков происходит именно при оперативном проведении.

Всё сказанное выше никоим образом не относится к расчетным механизмам. Поэтому для документа Начисления (и Табеля) оперативное проведение нужно отключать (запрещать).

« Последнее редактирование: Май 13, 2019, 04:14:18 am от Михаил Проходцев »


Записан



Коллеги, так кто-нибудь понял, как распределять суммы затрат на номенклатуру проекта в задаче БУ, если теперь из билета вроде убрали фразу — «пропорционально их проданному количеству» ?


Записан


я Номенклатуру из прибыли убрал получаю просто суммы по проекту.
дт ПрибылиИУбытки Кт Общехозяйственные затраты, но предварительно сгруппировать суммы по проекту мне кажется правильно запросом. Там можно просто конструктором движения. Ну а если все-таки надо распределять то субконто Номенклатура на Прибыли.

« Последнее редактирование: Май 15, 2019, 11:54:54 am от kmdtyjr »


Записан


Коллеги а кто подскажет по этому вопросу, что за ошибка такая?
Ошибка записи! Блокировка для изменения запрещена для автоматического режима блокировки (Регистр накопления: Остатки номенклатуры)

Измените режим управления блокировкой на управляемый. Сейчас у Вас автоматический

Да, спасибо разобрался.


Записан


Коллеги а кто подскажет по этому вопросу, что за ошибка такая?
Ошибка записи! Блокировка для изменения запрещена для автоматического режима блокировки (Регистр накопления: Остатки номенклатуры)

Измените режим управления блокировкой на управляемый. Сейчас у Вас автоматический

А у тебя нет второго решенного билета, я опять на расчетах встрял)))


Записан


Хочу поделиться впечатлениями, второй билет какое — то извращение))))))


Записан


как задачу на управляемые формы решить?


Записан


как задачу на управляемые формы решить?

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


Записан


Хочу поделиться впечатлениями, второй билет какое — то извращение))))))

Подтверждаю, не особо хотелось на него попасть на экзамене.


Записан


Здравствуйте товарищи. Проверьте пожалуйста мое решение


Записан


Подскажите, а в бухгалтерской задаче склад так прям необходим?


Записан


Подскажите, а в бухгалтерской задаче склад так прям необходим?

В задаче:
«При проведении документа (расходная накладная) анализируется наличие этого товара на указанном в шапке документа складе.«

Сам как думаешь?


Записан


Подскажите, а в бухгалтерской задаче склад так прям необходим?

В задаче:
«При проведении документа (расходная накладная) анализируется наличие этого товара на указанном в шапке документа складе.«

Сам как думаешь?

Точно, виноват. Не актуальные билеты были


Записан


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

« Последнее редактирование: Июнь 19, 2019, 09:15:02 am от KVAS »


Записан



  • Печать

Страницы: 1 29 30 [31] 32 33 36

Что это за свойство?

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

Для чего используется?

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

На что стоит обратить внимание?

Блокировка итогов регистра по набору значений измерений выполняется в момент записи набора записей.

Контроль итогов регистра можно выполнять без применений опции «ДЛЯ ИЗМЕНЕНИЙ» (в случае использования автоматического режима) или явной установки управляемой блокировки (в случае использования управляемого режима).

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

Движения.ОстаткиТоваров.Очистить();
Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина;
// Будут заблокированы записи, которые могли существовать
// у документа до его перепроведения.
Движения.ОстаткиТоваров.Записать();

Если записать новый набор данных, не очищая старый, то блокировка итогов выполняется по «новым» и «очищаемым» записям;

Движения.ОстаткиТоваров.Очистить();
Пока Следующий() Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
КонецЦикла;
Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина;
// Будут заблокированы записи, которые могли существовать
// у документа до его перепроведения и вновь созданные записи.
Движения.ОстаткиТоваров.Записать();

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

При попытке использования в автоматическом режиме блокировки вызывает исключительную ситуацию. После успешной записи документа свойство устанавливается в Ложь у всех наборов записей. При отмене транзакции значение свойства восстанавливается в состояние до транзакции. Значение по умолчанию Ложь.

Контролируйте остатки после записи!

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

Очень-очень полезные статьи:
Методика оперативного проведения и управляемые блокировки
Новая методика проведения документа в 1С 8.2
Пример решения экзаменационного задания из сборника задач (ошибка остатков)

  • Ошибка записи write 28 на устройстве не осталось свободного места
  • Ошибка записи write 28 no space left on device
  • Ошибка записи mbr ultraiso
  • Ошибка записи illegal request invalid address for write
  • Ошибка записи hl dt st dvdram