При работе с базами данных 1С:Предприятие 7.7 на современных версиях MS SQL Server (2005, 2008, 2008 R2, 2012 и выше) администраторы часто сталкиваются с аварийным завершением длительных процедур обслуживания. Наиболее распространенный сценарий — полный пересчет бухгалтерских итогов как в режиме предприятия, так и через меню «Тестирование и исправление ИБ» в Конфигураторе.
Через некоторое время после запуска регламентной процедуры 1С аварийно закрывается с ошибкой: «База данных "имя_базы" уже открыта, и одновременно к ней может обращаться только один пользователь».
Разберем детально механизм возникновения этой коллизии, выясним причины сбоя и рассмотрим пошаговые способы исправления ситуации.
Проанализируем логику взаимодействия платформы 1С 7.7 с сервером баз данных MS SQL Server при выполнении монопольных операций:
sa (System Administrator): Если база подключена под системным администратором СУБД (sa), процесс 1С видит абсолютно все служебные и фоновые процессы экземпляра SQL Server._1SBKTTL, _1SBKTTLC) SQL Server запускает внутренние потоки (сброс «грязных» страниц из буферного пула данных, фоновый процесс CHECKPOINT, обновление статистики). Платформа 1С 7.7 ошибочно воспринимает эти системные потоки как подключение второго реального пользователя и принудительно прерывает операцию.Основное и самое надежное решение проблемы — отказаться от подключения к базе данных под учетной записью sa и создать отдельного пользователя для каждой информационной базы с точечными привилегиями.
Разберем по шагам настройку учетной записи в SQL Server Management Studio (SSMS):
usr1c_buh) с проверкой подлинности SQL Server Authentication.db_owner на эту конкретную базу. Не назначайте роль sysadmin на уровне сервера.
USE [master];
GRANT VIEW SERVER STATE TO [usr1c_buh];
При таких настройках процесс 1С видит только свои пользовательские сессии и изолирован от глобальных фоновых процессов экземпляра СУБД, что исключает ложные срабатывания проверки монопольного режима.
Посмотрим на параметры базы данных, которые могут вызывать внезапное появление конкурирующих системных процессов во время длительного пересчета итогов:
AUTO_CLOSE и AUTO_SHRINK инициируют служебные блокировки базы данных, несовместимые с монопольным режимом 1С 7.7.AUTO_UPDATE_STATISTICS_ASYNC) создает параллельное подключение во время выполнения тяжелых запросов.Выполним следующий T-SQL скрипт для оптимизации свойств информационной базы:
ALTER DATABASE [ИмяБазы1С] SET AUTO_CLOSE OFF WITH NO_WAIT;
ALTER DATABASE [ИмяБазы1С] SET AUTO_SHRINK OFF WITH NO_WAIT;
ALTER DATABASE [ИмяБазы1С] SET AUTO_UPDATE_STATISTICS_ASYNC OFF WITH NO_WAIT;
При полном пересчете бухгалтерских итогов объем генерируемых транзакций может многократно превышать обычную нагрузку. В модели восстановления Full это приводит к разрастанию журнала транзакций (файла .ldf) и частым задержкам на контрольные точки.
Рекомендуется временно перевести базу в простую модель восстановления перед запуском длительной процедуры:
ALTER DATABASE [ИмяБазы1С] SET RECOVERY SIMPLE;
После завершения пересчета итогов при необходимости можно вернуть модель FULL и обязательно сделать полную резервную копию базы данных.
Проанализируем сопутствующие факторы, которые помогают избежать сбоев при обслуживании базы:
SQL Server Agent на период пересчета итогов.