Главная страница

БлокироватьДляИзменения. Статья на нашем сайте


Скачать 0.96 Mb.
НазваниеСтатья на нашем сайте
Дата14.11.2022
Размер0.96 Mb.
Формат файлаpdf
Имя файлаБлокироватьДляИзменения.pdf
ТипСтатья
#788107

Курсы-по-1С.рф
Профессиональные курсы по 1С по всей России, в любое время
Страница 1 из 7
Бесплатные материалы проекта:
Электронная почта: support@Kursy-po-1C.ru http://курсы-по-1с.рф/free/
Телефоны: 8-800 1000-613, +7(495) 7777-096
Copyright © 2012-2017, Насипов Фарит и Евгений Гилев, Курсы-по-1С.рф
[ Нюансы платформы 1С:Предприятие 8 ] – Как работает свойство БлокироватьДляИзменения
Как работает свойство БлокироватьДляИзменения набора записей регистра накопления и бухгалтерии, известно далеко не всем специалистам по 1С.
С одной стороны, вроде бы многие знают, когда это свойство нужно использовать (если не знаете – предварительно прочитайте статью про контроль остатков: http://курсы-по-
1с.рф/articles/2017-02-12-two-methods-for-inventory-check/
(
http://kursy-po-1c.ru/articles/2017-
02-12-two-methods-for-inventory-check/
)).
С другой стороны, как это работает, понимают немногие. Показательно будет привести цитату из справки по свойству БлокироватьДляИзменения:
Устанавливает режим, при котором в процессе записи набора будет установлена
управляемая блокировка для всех комбинаций измерений в соответствии с записями
набора записей.
На самом деле никакую блокировку это свойство не устанавливает! Для чего же так пишут справке? Сложно сказать – возможно, чтобы не усложнять жизнь начинающим разработчикам :)
В результате это приводит к неправильному использованию данного инструмента для блокировок. В этой статье докопаемся до истины и покажем внутренние детали реализации этого механизма платформы «1С:Предприятие 8.3».
Для того чтобы точно понять всю статью, необходимо знать, что такое механизм
разделения итогов. Этому механизму посвящена отдельная статья на нашем сайте:
http://курсы-по-1с.рф/articles/режим-разделения-итогов/
(
http://kursy-po-
1c.ru
/articles/режим-разделения-итогов/
).
Начнем с того, что работа свойства БлокироватьДляИзменения отличается для платформы 8.2 и 8.3. Поэтому рассмотрим 2 сценария.

Курсы-по-1С.рф
Профессиональные курсы по 1С по всей России, в любое время
Страница 2 из 7
Бесплатные материалы проекта:
Электронная почта: support@Kursy-po-1C.ru http://курсы-по-1с.рф/free/
Телефоны: 8-800 1000-613, +7(495) 7777-096
Copyright © 2012-2017, Насипов Фарит и Евгений Гилев, Курсы-по-1С.рф
Использование платформы
«1С:Предприятие 8.2» и MS SQL Server
Допустим, что 2 пользователя одновременно проводят 2 документа продажи товаров
(пусть это будут столы). При этом в конфигурации используется новая методика контроля остатков (сначала запись движений, потом чтение остатков).
Если у регистра накопления с остатками товаров включено разделение итогов, можем получить следующую ситуацию:
Рисунок 1. Схема взаимной блокировки
В представленной ситуации 2 пользователя списывают товар «Стол» со склада
«Основной», при этом на складе осталось всего 10 столов.
Так как включено разделение итогов, то оба пользователя параллельно делают движения в таблице итогов, накладывая при этом исключительную управляемую блокировку и X- блокировку СУБД на свои строки. Блокировка будет наложена по полям Склад + Товар +
Разделитель, и так как разделитель (splitter) разный, то обе блокировки установятся успешно.
Далее каждый из пользователей пытается выполнить контроль остатков с помощью запроса, и здесь начинается самое интересное.
Запрос к регистру пытается прочитать все строки, где склад равен «Основной» и товар равен «Стол», без условия по разделителю. При чтении запрос накладывает S- блокировку СУБД.

Курсы-по-1С.рф
Профессиональные курсы по 1С по всей России, в любое время
Страница 3 из 7
Бесплатные материалы проекта:
Электронная почта: support@Kursy-po-1C.ru http://курсы-по-1с.рф/free/
Телефоны: 8-800 1000-613, +7(495) 7777-096
Copyright © 2012-2017, Насипов Фарит и Евгений Гилев, Курсы-по-1С.рф
Иванов может прочитать свою строку, но не может прочитать строку, которую занял пользователь Петров (так как S и X-блокировки не совместимы). В итоге Иванов ждет
Петрова. Петров, в свою очередь, может прочитать свою строку, но не может прочитать строку, занятую Ивановым, и тоже встает в очередь.
На схеме синие стрелки показывают успешно наложенные блокировки, красные
показывают ожидание на блокировке.
В результате мы получаем взаимную блокировку: Иванов ждет Петрова, а Петров ждет
Иванова. Как решить эту проблему, рассмотрим чуть позже. А сейчас перейдем к следующему сценарию.
Отметим, что взаимоблокировки не было бы, если бы режим разделения итогов
регистра был отключен. Но, во-первых, режим разделения итогов в общем случае
положительно влияет на производительность. Во-вторых, нужно всегда делать
устойчивые решения, чтобы при неаккуратных действиях ничего не сломалось :)
Использование платформы
«1С:Предприятие 8.3» или
использование в качестве СУБД
версионника
Сейчас мы рассмотрим
сценарий, когда используется платформа 8.3 без режима
совместимости с 8.2. Либо когда в качестве СУБД выступает версионник
(PostgreSQL, Oracle)
– не важно, с какой платформой и в каком режиме.
Кратко отметим, что особенность СУБД версионника в том, что при чтении он не
блокирует данные. При использовании 8.3 без режима совместимости с 8.2, MS SQL
Server тоже может работать как версионник
В данных условиях оба пользователя смогут прочитать остаток, так как чтение будет не блокирующим и в итоге мы получим минус на складе.

Курсы-по-1С.рф
Профессиональные курсы по 1С по всей России, в любое время
Страница 4 из 7
Бесплатные материалы проекта:
Электронная почта: support@Kursy-po-1C.ru http://курсы-по-1с.рф/free/
Телефоны: 8-800 1000-613, +7(495) 7777-096
Copyright © 2012-2017, Насипов Фарит и Евгений Гилев, Курсы-по-1С.рф
Рисунок 2. Схема получения отрицательных остатков
Как исправить проблемы?
И ситуация взаимоблокировки, и, тем более, отрицательные остатки на складе не могут считаться корректной работой программы.
Чтобы не допустить этих проблем, как раз и было придумано свойство набора записей регистров накопления и бухгалтерии – БлокироватьДляИзменения.
Если до записи движений установить данное свойство в значение «Истина», то
блокировка будет накладываться без учета разделителя. То есть поведение будет таким, как будто разделитель итогов у регистра выключен.
Следует отметить что блокировка будет наложена вне зависимости от значения данного свойства. Если БлокироватьДляИзменения имеет значение «Истина», то блокировка будет без учета разделителя, иначе – с учетом разделителя. По умолчанию значение свойства БлокироватьДляИзменения равно «Ложь».
Допустим программист внес исправления в код:
Движения.ТоварыНаСкладах.БлокироватьДляИзменения
=
Истина
;
Движения.Записать
();
При этом строку «БлокироватьДляИзменения=Истина» можно писать в любом месте кода, но обязательно перед записью движений. Данная строка просто говорит платформе: «когда будешь записывать движения, не учитывай разделитель итогов».

Курсы-по-1С.рф
Профессиональные курсы по 1С по всей России, в любое время
Страница 5 из 7
Бесплатные материалы проекта:
Электронная почта: support@Kursy-po-1C.ru http://курсы-по-1с.рф/free/
Телефоны: 8-800 1000-613, +7(495) 7777-096
Copyright © 2012-2017, Насипов Фарит и Евгений Гилев, Курсы-по-1С.рф
Следует понимать, что сам разделитель итогов при этом никуда не исчезает, просто блокировка будет на поля Склад + Товар без учета разделителя.
Рассмотрим поведение системы, если использовать данное свойство.
Рисунок 3. Схема работы при «БлокироватьДляИзменения=Истина»
При наложении блокировки без учета разделителя оба пользователя попытаются обратиться к одной строке. В результате Петров встанет в очередь (исключительные управляемые блокировки несовместимы) и будет ожидать, пока строка не освободится.
При этом ожидание будет происходить на управляемых блокировках, то есть на сервере
1С. Сервер СУБД даже не будет «знать» о том, что транзакция Петрова ожидает своей очереди.
Данное ожидание на блокировке будет являться необходимым – оно обеспечивает корректную бизнес-логику приложения.
Таким образом мы предотвратили возможную взаимную блокировку или минус на складе с помощью свойство БлокироватьДляИзменения.
Несколько вопросов и заблуждений по
теме
Часто нам задают вопросы по использованию свойства БлокироватьДляИзменения.
Рассмотрим наиболее популярные из них.

Курсы-по-1С.рф
Профессиональные курсы по 1С по всей России, в любое время
Страница 6 из 7
Бесплатные материалы проекта:
Электронная почта: support@Kursy-po-1C.ru http://курсы-по-1с.рф/free/
Телефоны: 8-800 1000-613, +7(495) 7777-096
Copyright © 2012-2017, Насипов Фарит и Евгений Гилев, Курсы-по-1С.рф
Вопрос 1
Почему БлокироватьДляИзменения не устанавливают в истину в документе
«Приходная накладная»? Ведь если я перепровожу документ ПриходнаяНакладная, то должен блокировать поля, по которым был приход, иначе можно товар списать в минус.
Пример: было – Стул 2 шт, перепровожу, меняя Стул на Тумбу, и в этот момент списываю
Стул в минус.
Ответ: БлокироватьДляИзменения ставят там, где у регистра включено разделение итогов и идет контроль остатков после записи. В приходе же при первом проведении контроль остатков не выполняется. Если при перепроведении приходной накладной в конфигурации реализован контроль остатков, то имеет смысл использовать свойство
БлокироватьДляИзменения.
Вопрос 2
Нужно ли использовать БлокироватьДляИзменения в файловом режиме?
Ответ: В файловом режиме блокировка всегда идет на всю таблицу, следовательно режим разделения итогов там бесполезен, поэтому и БлокироватьДляИзменения
ставить не обязательно, но желательно. Следует помнить, что файловая база со временем может стать клиент-серверной, и тогда данное свойство необходимо будет использовать.
Вопрос 3
Нужно ли устанавливать БлокироватьДляИзменения при очистке движений?
Ответ: В большинстве случаев не нужно, так как обычно после очистки движений контроль остатков не выполняется. Если контроль сразу после очистки выполняется, тогда БлокироватьДляИзменения ставить нужно.
Вопрос 4
Нужно ли использовать свойство БлокироватьДляИзменения при автоматических блокировках?
Ответ: При попытке использовать БлокироватьДляИзменения в автоматическом режиме блокировок система выдаст сообщение об ошибке: «Ошибка записи! Блокировка для изменения запрещена для автоматического режима блокировки». Данное свойство можно использовать только для управляемого режима блокировок.

Курсы-по-1С.рф
Профессиональные курсы по 1С по всей России, в любое время
Страница 7 из 7
Бесплатные материалы проекта:
Электронная почта: support@Kursy-po-1C.ru http://курсы-по-1с.рф/free/
Телефоны: 8-800 1000-613, +7(495) 7777-096
Copyright © 2012-2017, Насипов Фарит и Евгений Гилев, Курсы-по-1С.рф
Резюмируя, можно дать следующую рекомендацию: если по регистру при любой записи всегда есть контроль остатков, тогда разделение итогов по нему лучше отключить, так как оно не имеет смысла
– везде придется устанавливать свойство
БлокироватьДляИзменения.
Если же по регистру контроль остатков нужен лишь в определенных документах, тогда в этих документах нужно поставить «БлокироватьДляИзменения=Истина», чтобы предотвратить описанные выше проблемы.
Выводы
Свойство набора записей БлокироватьДляИзменения само по себе ничего не блокирует, оно лишь определяет, будет ли в момент записи при блокировке учитываться разделитель или нет.
Следует использовать данное свойство только при выполнении всех 3 условий:
1.
Используется новая методика контроля остатков
2.
У регистра включено разделение итогов
3.
Используется управляемый режим блокировок.
Надеемся, теперь механика работы платформы будет ясна и белых пятен в знаниях специалистов 1С станет меньше :)
Андрей Бурмистров
2017 г.
Подробнее тема оптимизации 1С рассмотрена в нашем курсе
«Ускорение и оптимизация систем на 1С:Предприятие 8.3.
Подготовка на 1С:Эксперт по технологическим вопросам
Описание курса: http://курсы-по-1с.рф/1c-v8/optimization/
(
http://kursy-po-
1c.ru/1c-v8/optimization/
)


написать администратору сайта