Зачем нужны управляемые блокировки данных в 1С и как их использовать?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Назначение управляемых блокировок: не ускорение, а стабильность

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

Когда мы говорим о параллельной записи или изменении данных, возникает риск так называемых "грязных чтений" или "фантомных записей".

  1. "Грязное" чтение (Dirty Read): Это когда одна транзакция считывает данные, которые были изменены другой транзакцией, но еще не зафиксированы. Если вторая транзакция отменяется, то данные, считанные первой транзакцией, оказываются неверными.
  2. "Фантомные" записи (Phantom Read): Это когда в процессе одной транзакции выполняется два одинаковых запроса на чтение, и второй запрос возвращает другой набор строк (больше или меньше), чем первый, из-за того что другая транзакция добавила или удалила записи между двумя чтениями первой транзакции.

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

Два уровня блокировок в 1С:Предприятие

В 1С существуют два основных уровня блокировок, которые важно различать:

  1. Блокировки на уровне СУБД (автоматические блокировки): Сама система управления базами данных (например, MS SQL Server, PostgreSQL) устанавливает свои собственные блокировки. В автоматическом режиме 1С полностью полагается на СУБД, которая может устанавливать блокировки с высокими уровнями изоляции (например, Serializable для MS SQL Server). Однако СУБД не "знает" о бизнес-логике 1С и может блокировать целые таблицы, даже если конфликт затрагивает лишь отдельные записи.
  2. Блокировки на уровне платформы 1С (управляемые блокировки): Эти блокировки активируются, когда в свойствах конфигурации установлен флажок "Управляемый режим блокировки данных". В этом режиме 1С понижает уровень изоляции на СУБД до Read Committed и берет управление параллельностью на себя. Это позволяет блокировать данные более точно, например, по значениям измерений регистра, а не по всей таблице целиком.

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

Как работает механизм БлокировкаДанных

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

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

Ключевой момент: механизм управляемых блокировок работает исключительно в рамках транзакции. При фиксации или отмене транзакции все установленные этой транзакцией блокировки автоматически снимаются.

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

Сценарии использования управляемых блокировок

Управляемые блокировки жизненно необходимы для обеспечения транзакционной целостности данных при параллельной работе. Рассмотрим типичные сценарии:

  1. Предотвращение дублирования при одновременной записи:

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

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

  2. Расчет и запись изменяемых данных:

    Очень частый сценарий: вы читаете какие-то данные из регистра (например, остатки), на их основе производите расчеты, а затем записываете измененные данные обратно в этот регистр. Если в момент между чтением и записью другой процесс изменит эти же данные, ваш расчет будет основан на устаревшей информации, и результат будет некорректным.

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

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

  3. Изменение реквизитов после отправки данных:

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

  4. Автоматическое присвоение уникальных номеров:

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

  5. Работа с наборами записей регистра:

    При замещающей записи набора записей регистра сведений, например, с помощью Набор.Записать(ИСТИНА), блокировка будет установлена автоматически на весь отбор, даже если вы четко укажете измерения. Это сделано для предотвращения фантомных записей.

    
    НаборЗаписей = РегистрыСведений.РаспределениеЗапасов.СоздатьНаборЗаписей();    
    НаборЗаписей.Отбор.Склад.Установить(СкладОтбор); 
    НачатьТранзакцию();
    Попытка                  
        НаборЗаписей.ОбменДанными.Загрузка = Истина;
        НаборЗаписей.Записать(Истина); // Здесь будет установлена блокировка на все записи по отбору.
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
    КонецПопытки;
    

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

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

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

  1. В рамках транзакции: Блокировки устанавливаются и снимаются только в рамках транзакции. Вызов метода Заблокировать() объекта БлокировкаДанных вне транзакции бессмысленен.
  2. Короткие транзакции: Рекомендуется делать транзакции максимально короткими. Выполняйте тяжелые вычисления и подготовительные действия до начала транзакции и установки блокировки. Блокировать нужно как можно позже и держать блокировку как можно меньше времени.
  3. Минимизация области блокировки: Блокируйте только те записи или объекты, которые реально будут обрабатываться. Избыточные блокировки могут привести к снижению производительности и "подвисаниям".
  4. Единый порядок установки: Следует придерживаться единого порядка установки блокировок во всей конфигурации. Это помогает избежать взаимоблокировок (дедлоков). Взаимоблокировки возникают, когда две транзакции ждут ресурсы, заблокированные друг другом (Транзакция А ждет ресурс, заблокированный Транзакцией Б, а Транзакция Б ждет ресурс, заблокированный Транзакцией А). Менеджер взаимоблокировок (как СУБД, так и 1С) откатывает одну из транзакций для разрешения конфликта, что приводит к ошибкам у пользователя.
  5. Замена "ДЛЯ ИЗМЕНЕНИЯ": В управляемом режиме не используется конструкция "ДЛЯ ИЗМЕНЕНИЯ" в запросах. Вместо нее применяется объект БлокировкаДанных.

Когда управляемые блокировки не нужны или избыточны

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

  1. Для файловых баз с небольшим числом пользователей: Для "ларьков" с файловыми базами на одного-двух пользователей управляемые блокировки не являются критически необходимыми, так как конкурентность минимальна, а файловый режим сам по себе не поддерживает детализированные блокировки записей.
  2. При получении данных динамическими списками: Динамические списки предназначены для отображения данных и обычно не требуют блокировки.
  3. При поиске данных или формировании большинства отчетов: Отчеты обычно только читают данные, не изменяя их. Блокировка в таких случаях только замедлит работу.
  4. При обращении к условно постоянной информации: Например, к константам, которые редко меняются и не влияют на критичные бизнес-процессы.
  5. В действиях, гарантированно выполняемых в монопольном режиме: Например, при обновлении конфигурации или первоначальном заполнении данных, когда никто другой не работает с базой.

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

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

Хотя управляемые блокировки не предназначены для ускорения, они критически важны для сохранения целостности данных. Однако, неправильное использование управляемых блокировок может привести к:

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

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

Заключение

Управляемые блокировки данных в 1С:Предприятии — это мощный и необходимый инструмент для поддержания целостности и согласованности данных в многопользовательской среде. Мы рассмотрели, что их основная задача — не ускорение, а предотвращение ошибок и обеспечение надежности работы системы. Понимая принцип их работы и применяя их согласно рекомендациям, вы сможете создавать стабильные и устойчивые к конкурентному доступу решения на платформе 1С.

← На главную