Уважаемые коллеги, мы рассмотрим важную и актуальную проблему, с которой часто сталкиваются пользователи устаревших конфигураций 1С:Предприятия, таких как УТ 10.3, работающих на платформе 8.2 под управлением MS SQL Server – это проблема интенсивных блокировок. Особенно остро она проявляется при выполнении массовых операций, например, при загрузке и проведении большого количества заказов с сайта. Такие операции приводят к значительным задержкам и снижению производительности системы.
Мы выясним, как использование версионирования на уровне СУБД в сочетании с переходом на управляемые блокировки в 1С может помочь в борьбе с этими проблемами. Разберем по шагам, какие изменения необходимо внести как в базу данных MS SQL Server, так и непосредственно в конфигурацию 1С.
Прежде чем перейти к решениям, давайте проанализируем, почему возникают блокировки. В старых конфигурациях 1С, особенно в режиме автоматического управления блокировками, платформа часто использует высокий уровень изоляции транзакций на СУБД, такой как SERIALIZABLE или REPEATABLE READ. Эти уровни изоляции гарантируют строгую согласованность данных, но ценой частых и длительных блокировок. Любое чтение данных, к которым обращается транзакция, может блокировать другие операции записи или даже чтения, если они пытаются получить доступ к тем же данным. Это приводит к взаимоблокировкам (deadlocks) и значительным очередям при многопользовательской работе.
Опыт показывает, что переход на версионирование в SQL Server, в частности на режим READ_COMMITTED_SNAPSHOT ON, существенно снижает количество блокировок, особенно при операциях чтения. Это происходит потому, что операции чтения вместо блокировки данных начинают использовать сохраненные версии строк из базы данных tempdb. Однако, для полноценного решения проблемы в 1С, необходим комплексный подход, включающий также переход на управляемые блокировки в самой конфигурации 1С.
Первым и обязательным шагом является настройка самой СУБД. Нам необходимо активировать режим READ_COMMITTED_SNAPSHOT ON для вашей базы данных 1С. Этот режим позволяет транзакциям, работающим на уровне изоляции READ COMMITTED (который будет использоваться 1С после перехода на управляемые блокировки), читать данные без блокировки, используя версии строк.
Подготовка к изменению: Прежде чем вносить изменения, мы должны убедиться, что все пользователи отключены от базы данных. Изменение параметра уровня изоляции требует эксклюзивного доступа к базе.
Выполнение SQL-скрипта: Откройте SQL Server Management Studio (SSMS) и выполните следующий скрипт, заменив [МояБаза] на актуальное имя вашей базы данных 1С:
USE [master]
GO
ALTER DATABASE [МояБаза] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [МояБаза] SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE [МояБаза] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Давайте разберем каждую строку скрипта:
USE [master]: Мы переключаемся на системную базу данных master, чтобы иметь возможность изменять параметры целевой базы.ALTER DATABASE [МояБаза] SET SINGLE_USER WITH ROLLBACK IMMEDIATE: Эта команда переводит вашу базу данных [МояБаза] в однопользовательский режим. Параметр WITH ROLLBACK IMMEDIATE принудительно завершает все активные соединения с базой данных, откатывая текущие транзакции. Это необходимо для обеспечения эксклюзивного доступа к базе во время изменения ее свойств.ALTER DATABASE [МояБаза] SET READ_COMMITTED_SNAPSHOT ON: Это ключевая команда, которая активирует режим версионирования. После ее выполнения, SQL Server будет сохранять версии изменяемых строк в tempdb, позволяя операциям чтения получать доступ к данным без блокировки других операций.ALTER DATABASE [МояБаза] SET MULTI_USER WITH ROLLBACK IMMEDIATE: После успешного включения версионирования, мы возвращаем базу данных в многопользовательский режим, чтобы пользователи 1С могли снова к ней подключаться.Важные замечания по tempdb: При использовании режима READ_COMMITTED_SNAPSHOT ON значительно возрастает нагрузка на системную базу данных tempdb, поскольку именно в ней хранятся версии изменяемых строк. Мы должны убедиться, что tempdb настроена оптимально:
tempdb должна располагаться на самых быстрых дисках вашего сервера (например, SSD/NVMe).tempdb, а также настроить авторост с разумным шагом, чтобы избежать фрагментации и проблем с производительностью.tempdb (обычно 1 файл на каждое ядро процессора, до 8 файлов).После успешной настройки SQL Server, перейдем к изменениям в самой конфигурации 1С. Этот шаг является критически важным, поскольку без него эффекта от настроек СУБД может не быть, или даже могут возникнуть новые проблемы.
Перевод в режим управляемых блокировок:
Выбор этого режима сигнализирует платформе 1С о том, что она должна использовать более низкий уровень изоляции транзакций в СУБД (Read Committed) и полагаться на собственный механизм управления блокировками.
Переработка программного кода:
Это, пожалуй, самый трудоемкий и ответственный этап. Простое переключение режима блокировок в свойствах конфигурации, как было упомянуто в обсуждении, может не дать желаемого результата без доработки кода. Если раньше 1С автоматически управляла блокировками на основе уровня изоляции транзакции, то теперь разработчик должен явно указывать, какие данные и каким образом необходимо блокировать.
Мы должны переписать все модули проведения документов, а также другие операции, которые активно изменяют данные или работают с остатками. Для этого в 1С:Предприятии существует специальный объект БлокировкаДанных.
Рассмотрим, как это работает:
БлокировкаДанных: В модуле документа при проведении мы создаем новый экземпляр объекта:
Блокировка = Новый БлокировкаДанных;
Использование для чтения, Исключительная для записи).
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваровНаСкладах");
ЭлементБлокировки.УстановитьЗначение("Склад", Склад);
ЭлементБлокировки.УстановитьЗначение("Номенклатура", Номенклатура);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; // Для записи
Заблокировать():
Блокировка.Заблокировать();
Менеджер управляемых блокировок 1С:Предприятия позволяет очень точно управлять блокировками, учитывая логическую структуру прикладного решения. Это помогает избежать избыточных блокировок, которые характерны для автоматического режима.
Почему это важно: Без явного указания блокировок в коде, после переключения режима, система может просто перестать блокировать необходимые данные должным образом. Это может привести к потере данных, некорректным остаткам, нарушению целостности и другим ошибкам, которые гораздо сложнее отловить, чем обычные блокировки.
Например, в УТ 10.3 при проведении реализации мы обычно списываем остатки. В автоматическом режиме 1С сама ставила необходимые блокировки на записи регистра остатков. В управляемом режиме, если мы явно не укажем, что нужно заблокировать остатки по конкретным номенклатурам и складам, другие документы смогут одновременно списывать тот же товар, что приведет к отрицательным остаткам или ошибкам контроля.
Особенности старых конфигураций: В старых конфигурациях 1С, таких как УТ 10.3, работающих на платформе 8.2 (особенно в режиме совместимости 8.2.13), может возникать специфическая проблема: все константы хранятся в одной строке таблицы констант. Это приводит к блокировкам всей таблицы при обращении к любой константе, что особенно заметно при интенсивной работе. Если вы сталкиваетесь с такой проблемой, возможно, потребуется пересмотреть логику работы с константами или рассмотреть возможность повышения режима совместимости, если это применимо для вашей платформы.
Преимущества:
Снижение блокировок: Основное преимущество — значительное уменьшение количества взаимоблокировок и повышение параллельности работы пользователей. Это особенно заметно при операциях чтения, которые перестают блокировать операции записи.
Повышение производительности: Общая производительность системы при большом количестве одновременно работающих пользователей значительно улучшается за счет уменьшения времени ожидания блокировок.
Точное управление: Менеджер управляемых блокировок 1С позволяет более точно блокировать только те данные, которые действительно необходимы, избегая избыточных блокировок всей таблицы или диапазона.
Недостатки:
Нагрузка на tempdb: Как мы уже обсуждали, возрастает нагрузка на базу данных tempdb на SQL Server. Требуется ее тщательная настройка и мониторинг.
Трудозатраты на доработку: Переход на управляемые блокировки требует серьезных трудозатрат на анализ и переработку существующего программного кода конфигурации 1С. Это полноценный проект по рефакторингу, требующий высокой квалификации разработчиков.
Потенциальные ошибки: Неправильное или недостаточное использование объекта БлокировкаДанных может привести к ошибкам целостности данных, которые будет сложно диагностировать.
Переход на версионирование в MS SQL Server в сочетании с управляемыми блокировками в 1С:Предприятии — мощный инструмент для борьбы с проблемами производительности и блокировок в старых конфигурациях, таких как УТ 10.3. Однако, мы должны понимать, что это не "волшебная кнопка", а комплексная задача, требующая внимательной настройки как на стороне СУБД, так и серьезной доработки кода 1С. Правильное выполнение всех шагов позволит значительно улучшить параллельность работы пользователей и стабильность вашей информационной системы.