В процессе разработки на платформе 1С:Предприятие часто возникают ситуации, когда выполнение тяжелого отчета или сложной обработки вызывает остановку работы других пользователей. Это проявляется в виде ошибок таймаута при попытке записи данных в справочники. Давайте разберем, почему это происходит и как минимизировать такие конфликты.
Когда база работает в автоматическом режиме управления блокировками, платформа 1С берет на себя управление доступом к данным. Даже если на уровне СУБД (Microsoft SQL Server) включен режим READ_COMMITTED_SNAPSHOT (RCSI), платформа в автоматическом режиме зачастую запрашивает уровень изоляции REPEATABLE READ. Это необходимо для обеспечения целостности данных, гарантирующей, что данные не изменятся в процессе чтения.
При выполнении метода Запрос.Выполнить() система накладывает S-блокировки (разделяемые блокировки) на считываемые данные. Когда другой пользователь пытается изменить эти же данные (наложить X-блокировку — исключительную блокировку), возникает конфликт. Система вынуждена ждать завершения тяжелого запроса, что приводит к таймауту.
Для борьбы с конфликтами блокировок рассмотрим следующие подходы:
Рассмотрим, как правильно организовать работу с данными, чтобы снизить нагрузку на блокировки. Если вы выполняете запрос, который сканирует тысячи записей, попробуйте переписать его с использованием временных таблиц:
// Пример использования временных таблиц для оптимизации
ВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = ВТ;
Запрос.Текст =
"ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ПОМЕСТИТЬ ВТ_Выборка ГДЕ ...;
ВЫБРАТЬ * ИЗ ВТ_Выборка ...";
Запрос.Выполнить();
Использование МенеджерВременныхТаблиц позволяет сфокусировать запрос на конкретном наборе данных, тем самым сокращая «радиус поражения» блокировок.
Важно помнить, что параметр READ_COMMITTED_SNAPSHOT (RCSI) в 1С работает преимущественно для операций чтения в управляемом режиме. В автоматическом режиме 1С принудительно повышает уровень изоляции, из-за чего преимущества версионности строк (Row Versioning) нивелируются. Это приводит к тому, что транзакции записи в SQL Server блокируются длительными транзакциями чтения.
Если ваша конфигурация позволяет, рекомендуем провести аудит кода на предмет перевода объектов метаданных (справочников, документов) в управляемый режим блокировок. Это позволит сделать отчеты и записи практически независимыми друг от друга, так как управляемые блокировки не являются блокировками СУБД в классическом понимании — это внутренний механизм платформы 1С.
Если вы столкнулись с конфликтом:
Технологический журнал 1С или SQL Server Profiler.Помните, что борьба с блокировками — это всегда баланс между производительностью чтения и конкурентностью записи. Начните с оптимизации самых ресурсоемких запросов, и вы заметите значительное снижение количества конфликтов в вашей системе.