Управление блокировками в транзакции
Механизм управления блокировками данных в транзакции позволяет осуществлять блокировку изменяемых данных не средствами используемой системы управления базами данных, а средствами платформы. Такое управление блокировками данных выполняется не в терминах данных СУБД, а в терминах предметной области. Благодаря этому блокировки накладываются «точнее» и параллельность работы пользователей повышается.
Конфигурация 1С:Предприятия 8 может работать в одном из трех режимов управления блокировками в транзакции:
- автоматический;
- управляемый — стандартный режим для новых конфигураций;
- автоматический и управляемый.
В автоматическом режиме управления блокировками данных используются уровни изоляции транзакций repeatable read и serializable, обеспечиваемые системой управления базами данных. Эти уровни изоляции транзакций обеспечивают согласованное и целостное чтение данных, и от разработчика не требуется каких-либо дополнительных действий по управлению блокировками.
Управляемый режим позволяет повысить параллельность работы пользователей в клиент-серверном варианте работы за счет использования более низкого уровня изоляции транзакций базы данных (Read Committed). При записи данных в транзакции объекты встроенного языка автоматически блокируют необходимые данные. Разработчику требуется управлять блокировками данных в тех случаях, когда бизнес-логика требует согласованного и целостного чтения данных в транзакции.
Автоматический и управляемый режим позволяет использовать возможность управления блокировками в транзакции только для некоторых объектов конфигурации. Этот режим может использоваться для оптимизации параллельности работы пользователей с отдельными прикладными объектами (например, с несколькими наиболее интенсивно используемыми документами) или для постепенного перевода больших конфигураций в режим управления блокировками в транзакции.
В сводном виде отличия при работе в режиме автоматических блокировок и в режиме управляемых блокировок приведены в следующей таблице:
Наиболее часто необходимость в управлении блокировками данных в транзакции возникает в процессе проведения документов, когда нужно прочитать, а затем записать измененные данные в те же самые таблицы. Например, если выполняется контроль остатков при проведении документа.
Специально для этого у наборов записей регистров накопления и регистров бухгалтерии существует свойство БлокироватьДляИзменения.
Если нужно контролировать остатки, а затем записывать движения в этот же регистр, то это свойство нужно установить для набора записей этого регистра в свойстве Движения.

Действие этого свойства аналогично тому, как если бы разработчик самостоятельно установил (прописал в коде) нужные управляемые блокировки 1С:Предприятия 8. Необходимую управляемую блокировку платформа установит автоматически при записи этого набора записей. В результате другие управляемые транзакции, использующие аналогичную блокировку, не смогут начать читать этот регистр, пока не закончится текущая транзакция.
Ниже приведен пример «ручного» управления блокировками данных при чтении данных регистра накопления УчетНоменклатуры в обработке проведения документа РасходнаяНакладная. В этом примере управляемые блокировки создаются и устанавливаются полностью только средствами встроенного языка.
Управляемые блокировки
Блокировка – обязательный функционал многопользовательской системы. Любой объект системы во время чтения и изменения должен быть заблокирован от других процессов. Блокироваться объект может как СУБД, так и самим приложением 1С. Именно из-за области воздействия блокировок они бывают объектными и транзакционными. Объектное блокирование – это вид, реализованный на уровне платформы 1С, не затрагивающий СУБД. Транзакционное блокирование – это механизм, который работает на уровне СУБД. Транзакционные подразделяются на автоматические и управляемые блокировки. Режим автоматических блокировок предоставляется и исполняется СУБД. Режим управляемых блокировок данных выполняется не моделями данных СУБД, а в терминах предметной области 1С. Благодаря этому блокировки накладываются «точнее» и параллельность работы пользователей повышается. При выполнении каждой операции с базой данных менеджер блокировок 1С 8.3 проверяет возможность блокировки ресурсов.
2. Режимы управления блокировками для объектов конфигурации
В Конфигураторе в свойствах можно установить вариант блокировки на все объекты конфигурации. Свойство «Режим управления блокировкой данных»:
Рис. 1 Режим управления блокировкой данных Для конкретного объекта конфигурации тоже можно установить режим блокировки – свойство «Режим управления блокировкой»:
Рис. 2 Свойство «Режим управления блокировкой» Этот режим предназначен для частичного перевода конфигурации в режим управляемых блокировок. Он позволяет отдельным объектам метаданных работать с управляемыми блокировками в 1С, в то время как остальные объекты работают в режиме автоматических блокировок. Это и есть автоматический и управляемый режимы.
3. Управляемая блокировка в коде
Блокировки в коде создаются и устанавливаются с помощью методов и свойств. Создать объект блокировка данных – БлокировкаДанных = Новый БлокировкаДанных; Добавить новый элемент блокировки ЭлементБлокировки = БлокировкаДанных.Добавить(«ключ») Установить режим блокировки ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый/Исключительный Установить значение блокируемых данных ЭлементБлокировки.УстановитьЗначение(«ключ», ЗначениеКлюча); ЭлементБлокировки.УстановитьЗначение(«Период», ЗаданныйДиапазонДат); ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«ключ», «ключ») Блокировки в коде устанавливаются при изменении объектов, реквизитов, данных, и т.д. 1.Явное задание имени объекта блокировки и его значения БлокировкаДанных = Новый БлокировкаДанных; ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.ОстаткиТоваровНаСкладах»); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение(«Склад», Склад); В данном случае мы блокируем в данных регистра «ОстаткиТоваровНаСкладах» все записи, у которых значение измерения «Склад» равно значению, содержащемуся в переменной «Склад» 2.Задание блокировки с указанием источника данных, содержащего необходимые значения БлокировкаДанных = Новый БлокировкаДанных; ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.ПродажиТоваров»); ЭлементБлокировки.Режим = РежимБлокировкиДанных. Разделяемый; ЭлементБлокировки.УстановитьЗначение(«Покупатель», Покупатель); Диапазон = Новый Диапазон(НачалоМесяца(Дата), Дата); ЭлементБлокировки.УстановитьЗначение(«Период», Диапазон); Ну, а в этом примере, мы блокируем в данных регистра «ПродажиТоваров» все записи, у которых значение измерения «Покупатель» равно значению, содержащемуся в переменной «Покупатель», а значение поля «Период» содержится в указанном диапазоне (НачалоМесяца(Дата), Дата). 3.Установка условия блокировки записей с помощью источника данных БлокировкаДанных = Новый БлокировкаДанных; ЭлементБлокировки = БлокировкаДанных.Добавить(«РегистрНакопления.ОстаткиТоваровНаСкладах»); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение(«Склад», Склад); ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»); Данные для установки ограничений на поля этого элемента блокировки – это таблица значений «СписокНоменклатуры». Блокируем в данных регистра «ОстаткиТоваровНаСкладах» все записи, у которых значение измерения «Склад» равно значению переменной «Склад», а значение измерения «Номенклатура» равно какому-либо значению из колонки «Номенклатура», указанного источника данных. В качестве источника данных можно указывать результат запроса, и для последнего примера можно было бы создать запрос, который бы отсекал номенклатуру, содержащую «услугу», тем самым нивелируя избыточность блокировки.
4. Исключительная управляемая блокировка
При любой попытке модификации данных информационной базы система автоматически будет устанавливать исключительные блокировки для этих данных. Использование «разделяемой» блокировкой может привести к конфликту блокировок. Например, две транзакции начали считывать остатки из регистра «Списки номенклатуры», остатки имеют одинаковые элементы. При этом система в первой и второй транзакции устанавливает разделяемую блокировку на считываемые ресурсы. Эти две блокировки на один и тот же ресурс совместимы друг с другом, потому что они разделяемые. Далее первая транзакция прочитала данные, изменила и теперь хочет их записать, но сделать это не может, т.к. для этого система должна установить исключительную блокировку на записываемые данные, чему мешает разделяемая блокировка второй транзакции. Первая транзакция становится в очередь, ожидая снятия разделяемой блокировки, установленной второй транзакцией. Вторая транзакция также закончила чтение данных и хочет записать новые данные. Все повторяется – она не может это сделать, т.к. для этого система должна установить исключительную блокировку на записываемые данные, но этому мешает разделяемая блокировка, установленная на часть этих данных первой транзакцией. Вторая транзакция становится в очередь, ожидая снятия разделяемой блокировки, установленной первой транзакцией – круг замкнулся, и мы получаем конфликт блокировок. При установлении исключительной блокировки таких конфликтов возникать не может. Специалист компании «Кодерлайн» Ольга Волкова
3 принципа работы блокировок, о которых стоит знать каждому программисту 1С

Если мы хотим, чтобы многопользовательская система работала быстро – нужно, среди прочего, подумать, как минимизировать ожидания на блокировках. Как только появляются ожидания – замедляется проведение документов.
Поэтому важно проектировать поведение системы на самых ранних этапах – до написания программного кода.
И здесь есть важный нюанс:
программисты часто думают, что управляемые блокировки происходят на уровне записей.
Мы подготовили для Вас видео, в котором рассказали, по каким принципам блокируются строки во время работы пользователей и как свести к минимуму количество ожиданий из-за блокировок.
Как это часто бывает, некоторые из этих нюансов в документации не описаны…
Длительность видео 9 минут – и оно того стоит.
Это же всегда неловкий момент, когда ты веришь, что что-то должно работать одним образом, а потом оказывается, что все совсем иначе 🙂
Тайминг ключевых моментов:
00:41 – постановка задачи
01:52 – демонстрация ожидания при управляемых блокировках
03:09 – первый принцип работы управляемых блокировок
04:40 – второй принцип работы управляемых блокировок
06:46 – третий принцип работы управляемых блокировок
07:37 – анализ причин ожидания на блокировках в решаемой задаче
08:47 – решение проблемы
![]()
play-sharp-fill
![]()
play-sharp-fill
Умение находить и устранять причины медленной и нестабильной работы систем на 1С — обязательно для программистов 1С
Чтобы Вы могли быстро и без ошибок решать эти задачи, мы выпустили курс «Ускорение и оптимизация 1С».
После курса Вы сможете:
- Оценивать состояние системы в любой момент времени
- Быстро находить причины замедления в программном коде – и сразу писать его так, чтобы замедления в будущем не было
- Отслеживать динамику производительности за определенный период
- Устранять ожидания на блокировках и решать проблемы со взаимоблокировками
Для кого этот курс
- Писать код, за который не стыдно – в нестабильное время особенно важно быть в компании на хорошем счету
- Быть востребованным специалистом – на каждом втором собеседовании спрашивают про умение оптимизировать 1С
- Не терять клиентов из-за того, что «ваша 1С тормозит, а вы ничего не делаете» – это и раньше было нехорошо, а теперь и вовсе непозволительная роскошь.
Программа, стоимость и условия:
- 16 учебных часов видео
- 50 практических заданий
- 3 месяца поддержки и доступа к ответам на вопросы
- Пожизненный доступ к видео-урокам и учебным материалам
Комментарии / обсуждение (42):
Так сделано в УТ11 при выгрузке остатков на оффлайн ККМ, скорее всего, для устранения фантомного чтения. Обзор практики применения блокировок, оставшийся за пределами промо- видео, заслуживает отдельного внимания. имхо
Зачем накладывать УБ при чтении Штрихкодов из РС?
Андрей Бурмистров
Какое отношение этот вопрос имеет к данному видео?
Arshanskiy Sergey
А это так работает и на файловой базе? А то у меня почему-то конфликт блокировок происходит даже если я задаю все отборы, включая период – не могу понять почему.
Андрей Бурмистров
Сергей, здравствуйте.
На файловой базе при записи всегда блокируется вся таблица целиком, она изначально не предназначена для параллельной работы.
Явные управляемые блокировки можно установить на разные записи, но когда вы будете объект записывать, блокировка все равно будет на всю таблицу.
Правильно ли я понял, что это справедливо и для объектных сущностей, например для документов. В типовой ЕРП есть строки:
1-я блокировка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(“Документ.СообщениеЭДО”);
ЭлементБлокировки.УстановитьЗначение(“Ссылка”, Ссылка);
Блокировка.Заблокировать(); 2-я блокировка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(“Документ.СообщениеЭДО”);
ЭлементБлокировки.УстановитьЗначение(“ЭлектронныйДокумент”, СообщениеОбъект.ЭлектронныйДокумент);
Блокировка.Заблокировать(); 2-я блокировка будет ожидать первую?
Андрей Бурмистров
Да вы все верно поняли, в принципе это легко проверить если провести опыт.
Эти блокировки не будут ждать друг друга только если у них режим Разделяемый, но т.к. тут режим явно не указан, то по умолчанию используется режим Исключительный, поэтому ожидание будет.
Хорошая визуализация! У меня как-то понимание пространства блокировок появилось сразу, без уточнений, видео и прочего, хотя у меня в голове это немного не так выглядит, но я бы даже не смог сходу визуализировать это (возможно потому, что у меня в голове нет четкой установки, что у таблицы обязательно должно быть поле первичного ключа, поэтому понятие “запись” для меня слишком абстрактна, чтобы на него вешать еще и понятие блокировки) Из видео, кстати, понятно, что в любом месте кода можно случайно забыть уточнить блокировки и будут неожиданные эффекты конфликтов.
А вот то, до чего сам доходишь, так это например то, что порядок измерений играет роль – это было для меня неожиданностью
Андрей Бурмистров
Большое спасибо вам за отзыв.
Очень полезное видео, принципиальная разница между записями и пространствами. Спасибо.
Кузьмин Сергей
Рады, что материалы были полезны!
Блин. Все таблицы плоские, Нет там областей, есть записи. 10 лет писал а FoxPro и ни каких проблем не возникало с блокировками записей. Откуда этот гимор.
Андрей Бурмистров
Речь идет не о таблицах и блокировках СУБД, в видео говорится про управляемые блокировки которые “живут” на сервере 1С, они блокируют не таблицы СУБД, а пространства 1С.
Спасибо за ценную информацию!
Алексей Катеринич
Пожалуйста!
Интересного обучения!
Андрей, добрый день! Спасибо за разъяснение.
Подскажите, если блокировка набора записи (подчинен регистратору) происходит по регистратору. Значит при проведении двух документов регистраторов возникнут блокировки на наборах, у которых совпадают значения хотя бы одного из измерений, правильно?
Андрей Бурмистров
Здравствуйте.
1. То что регистр подчинен регистратору здесь роли не играет, т.к. регистраторы разные то и ожидания на пространстве ИмяРегистра.НаборЗаписей практически никогда не бывает.
2. Что бы было ожидание на обычном пространстве блокировок, у вас должна быть хотя бы одна одинаковая комбинация значений измерений в обоих документах.
Если значение хотя бы в одном измерении отличается то это уже другая область.
Попробуйте от руки начертить координатную сетку как на видео, и в уме провести 2 документа параллельно закрашиваю квадраты, думаю все сразу встанет на свои места.
Вообще ситуация из видео когда не указано значение поля блокировки не возможна при записи движений при проведении, т.к. в этот момент платформа сама ставит упр. блокировку по всем измерениям регистра. Надеюсь я правильно понял вопрос, если что-то не понятно пишите.
Типы блокировок данных «1С» и СУБД. Как они работают?

Что такое «блокировка данных» в «1С»? Краткое определение блокировки можно выразить так: блокировка – это «сообщение» о том, что определенный ресурс системы заблокирован или «захвачен» другим пользователем.
Какие бывают блокировки в «1С»?
1. «Хорошие» блокировки данных в «1С»
Чтобы лучше понять, что такое блокировка и какой она может быть, проведем аналогию с реальным миром. Возьмем в пример продавца лампочек и его потенциальных покупателей – Иванова и Петрова. Пусть продавец лампочек выступит в роли системы «1С», а Петров и Иванов – в роли пользователей системы.
Итак, в магазин приходит Иванов, и ему нравится одна из 6 моделей лампочек (допустим, №4). Он собирается ее купить и достает из кошелька деньги. Продавец лампочек по натуре – рассеянный человек. Поэтому в целях усиления своей бдительности и контроля товара, он все записывает и сразу отмечает, что лампочка №4 продана Иванову. Эта запись и будет аналогией блокировки данных «1С».
На самом деле, Иванов еще не купил лампочку, а только собирается это сделать. Возможно, у него не хватит денег, и у него не получится ее приобрести. Но продавец уже записал, что лампочку нельзя предлагать другим покупателям до тех пор, пока Иванов не завершит покупку.
Весь этот процесс (от выбора лампочки до передачи денег продавцу и получения товара в руки) будет назваться «транзакцией». Блокировка ставится в момент выбора лампочки Ивановым и снимается после завершения транзакции – совершения покупки.
Но самое интересное только впереди. В магазин лампочек приходит Петров. Он сможет купить любую из 6 лампочек, кроме №4 (она ведь «забронирована» Ивановым). Если говорить об «1С», смысл блокировки данных заключается в том, чтобы на некоторое время запретить действия над общим ресурсом. В нашем случае Петрову запрещено выбирать лампочку №4. Только в случае отказа Ивановым о покупки лампочки, Петров сможет ее приобрести.
Сразу становится понятно, что в данном случае блокировка – это необходимое явление при конкурентном доступе к общему ресурсу. Иначе между Петровым и Ивановым возник бы конфликт. Возможно, и продавец попал бы «под раздачу».
2. «Плохие» блокировки в «1С»
Теперь рассмотрим иной вариант развития событий, чтобы пояснить, откуда берутся «плохие» блокировки данных в «1С».
Покупатель Иванов снова хочет купить лампочку. Он достает их из контейнера по одной, проверяя, какая ярче светит. Тем временем продавец записывает («блокирует») номера лампочек, которые понравились Иванову. Как раз в этот момент в магазин приходит Петров, но не может купить ни одной лампочки, потому что все они «захвачены» Ивановым.
Как поступает Петров? Некоторое время он ждет, но вскоре обижается и уходит. Именно это событие и соответствует возникающей в системе «1С» ошибке блокировки данных – «Превышение времени ожидания блокировки».
Если бы избыточной блокировки не возникло, то Петров тоже купил бы лампочку. Таких блокировок не должно быть в «1С».
Виды блокировок данных в «1С»
Ответим на этот вопрос с помощью рисунка.

Объектные блокировки
Чтобы помочь пользователям изменять данные одновременно и согласовано, необходим механизм объектных блокировок. Объектные блокировки позволяют осуществлять конкурентный доступ пользователей к данным «1С:Предприятия» в терминах объектов информационной базы. Как правило, это происходит при интерактивной работе пользователей в формах: редактирование существующих объектов, удаление, создание новых и др. Объектные блокировки позволяют осуществлять конкурентный доступ к данным в «1С» в терминах объектов информационной базы.
Объектные блокировки данных «1С» делятся на:
- Оптимистические. Построены на анализе номера версии объекта, хранящейся в базе данных и номера версии, помещенной в память компьютера в момент считывания данных из информационной базы. Если при записи объекта номера его версий отличаются, то будет выдано предупреждение о том, что версия объекта изменилась или он был удален, то есть сработает оптимистическая блокировка.
- Пессимистические. В тот момент, когда пользователь начинает модификацию объекта в форме, расширение формы устанавливает пессимистическую блокировку. Если после этого другой пользователь, например, попытается выполнить редактирование того же объекта, ему будет выдано сообщение о невозможности блокировки объекта. Когда пользователь, редактировавший объект, закроет форму объекта, расширение формы снимет пессимистическую блокировку.
Транзакционные блокировки
Речь идет о блокировках на уровне СУБД. Такие блокировки напрямую связаны с понятием «транзакция». Вы можете узнать подробнее о том, что такое «транзакции» и зачем они нужны, в специальной статье.
Транзакционные блокировки «1С» делятся на автоматические и управляемые.
- Автоматические. В автоматическом режиме ответственность за блокировки полностью лежит на СУБД. Это облегчает работу IT-специалиста «1С», но создание информационной системы для большого количества пользователей на автоматических блокировках нежелательно (особенно для СУБД PostgreSQL, Oracle BD, т.к. при модификации данных они полностью блокируют таблицу).
- Управляемые. В управляемом режиме есть возможность использовать менеджер транзакционных блокировок данных «1С:Предприятие». В этом режиме система использует гораздо более низкий уровень изоляции транзакций для MS SQL Server и IBM DB2, и блокировку на уровне записей для PostgreSQL (см. таблицу 3). Это позволяет достичь более высокой параллельности работы пользователей.
Что еще нужно знать о блокировках?
Физические блокировки находятся в таблице syslockinfo базы данных master и имеют следующие обозначения:
- S – разделяемая (чтения);
- X – исключительная (блокировка на запись);
- U – блокировка обновления (устанавливается в запросе с помощью конструкции «Для изменения»).
Некорректная работа транзакционных блокировок может привести к таким проблемам, как:
- потерянное изменение;
- грязное чтение;
- неповторяемость чтения;
- чтение фантомов.
Если вы столкнулись с проблемой блокировки данных в «1С» и не знаете, как ее исправить, обратитесь за бесплатной консультацией к специалистам «ГЭНДАЛЬФ».
