При попытке запуска или загрузки информационной базы платформы 1С:Предприятие 7.7 на сервере MS SQL Server 2008 R2 администраторы часто сталкиваются с ошибкой: SQL State: 45S02 Native: 208 Message: [Microsoft][ODBC SQL Server driver][SQL Server]Invalid object name 'master..sksprocesses', после чего соединение с сервером базы данных прерывается. Разберем по шагам, почему возникает эта неполадка и как корректно настроить СУБД для стабильной работы платформы.
Проанализируем природу проблемы: штатный движок платформы 1С 7.7 изначально проектировался под MS SQL Server 6.5/7.0/2000. При контроле монопольного режима и подсчете количества активных пользователей платформа опрашивает системную таблицу sysprocesses. В версиях SQL Server 2005 и 2008 R2 появилось множество фоновых системных потоков (сборщики мусора, ленивая запись, задачи пула ресурсов), из-за которых 1С ошибочно считает, что база занята, и блокирует вход с сообщением о невозможности монопольного доступа.
Для обхода этой проблемы бинарные файлы платформы (обычно BkEnd.dll) модифицируют: обращение к стандартной таблице sysprocesses заменяется на вызов кастомного представления sksprocesses. Если на SQL Server в базе master это представление отсутствует или у пользователя нет к нему доступа, сервер возвращает ошибку Invalid object name 'master..sksprocesses'.
Рассмотрим основной способ решения, заключающийся в создании необходимого представления в системной базе данных master с правильной фильтрацией служебных подключений и раздачей прав.
sysadmin).
USE master;
GO
IF OBJECT_ID('dbo.sksprocesses', 'V') IS NOT NULL
DROP VIEW dbo.sksprocesses;
GO
CREATE VIEW dbo.sksprocesses AS
SELECT * FROM sys.sysprocesses
WHERE cmd NOT IN ('CHECKPOINT', 'LAZY WRITER', 'LOG WRITER', 'LOCK MONITOR', 'BRKR TASK', 'BRKR EVENT')
OR program_name LIKE '1C%';
GO
GRANT SELECT ON dbo.sksprocesses TO public;
GO
Разберем подробнее, что делает данный скрипт:
master.dbo (то есть dbo.sksprocesses). Это критично, так как обращение master..sksprocesses ищет объект по умолчанию именно в схеме владельца базы данных.GRANT SELECT) роли public, что позволяет любому пользователю 1С успешно выполнять данный запрос.В современных версиях Microsoft SQL Server чтение системных таблиц процессов ограничено. Даже при наличии созданного представления непривилегированный пользователь SQL увидит только свои собственные процессы, если ему не выдано специальное серверное право.
Выясним причину: для корректного отображения всех сессий 1С пользователь базы данных должен иметь серверную привилегию VIEW SERVER STATE. Назначим ее пользователю, под которым 1С 7.7 подключается к базе данных:
USE master;
GO
GRANT VIEW SERVER STATE TO [ИмяПользователяSQL];
GO
Вместо [ИмяПользователяSQL] укажем реальный логин пользователя SQL Server, настроенный для работы информационной базы 1С.
Если после создания представления ошибка сохраняется или появляются смежные проблемы с кодировкой, проверим дополнительные параметры экземпляра СУБД и базы данных:
Cyrillic_General_CI_AS (регистронезависимая). Если сервер настроен с параметром CS (Case-Sensitive), имя представления должно строго соответствовать регистру, указанному в бинарных файлах платформы (обычно все буквы строчные: sksprocesses).AUTO_CLOSE и AUTO_SHRINK, так как они вызывают разрыв системных сессий и ошибки монопольного захвата.OrdNoChk.prm.После создания представления dbo.sksprocesses и выдачи прав VIEW SERVER STATE подключение 1С:Предприятия 7.7 к MS SQL Server 2008 R2 проходит штатно, восстанавливая полноценную многопользовательскую работу.