При администрировании высоконагруженных систем на платформе 1С:Предприятие часто возникает ситуация, когда в базе данных появляются блокировки. Используя мониторинг активности в SQL Server Management Studio (Activity Monitor) или профилировщик, мы можем увидеть, что некий процесс блокирует работу остальных. В этот момент нам известен только Session ID (он же SPID) и, возможно, системный логин, под которым выполняется процесс (чаще всего это служебная учетная запись, например, USR1CV8). Однако SQL-сервер ничего не знает об именах пользователей 1С.
Рассмотрим подробно, как сопоставить технический идентификатор сессии SQL с конкретным пользователем или заданием в системе 1С. Этот навык — ключевой при замере производительности и поиске узких мест. Разберем причины несовпадения номеров и выясним, как действовать в различных ситуациях.
Прежде чем приступать к поиску, давайте разберемся, почему возникают вопросы с номерами. В теме обсуждения автор столкнулся с тем, что в консоли 1С номер сеанса — пятизначный (например, 58814), а в SQL Session ID — двузначный (например, 96). Прямой связи между этими числами нет.
Это происходит из-за трехзвенной архитектуры платформы:
rphost. Каждому физическому подключению он присваивает свой SPID (Session ID).Один и тот же процесс rphost может использовать одно соединение с СУБД для обслуживания запросов от разных пользователей 1С по очереди. Однако в момент выполнения запроса или транзакции конкретный сеанс 1С "захватывает" конкретное соединение СУБД.
Самый надежный и штатный способ найти виновника блокировки — воспользоваться консолью администрирования кластера 1С. Давайте пройдем этот путь по шагам.
Предположим, в мониторе SQL мы увидели, что блокировка исходит от Session ID = 96.
Важный нюанс: Часто эта колонка скрыта или находится далеко в правой части таблицы, и ее не видно без прокрутки. Проверим настройки видимости колонок или прокрутим список вправо.
В этой колонке отображаются числа, соответствующие SPID в SQL Server. Теперь нам нужно:
Часто бывает ситуация, описанная в теме: логин в SQL определен как USR1CV8 (пользователь, от имени которого запущена служба сервера 1С), а в консоли 1С в найденной строке поле пользователя может быть пустым или содержать служебное имя.
Это указывает на то, что активность проявляет не интерактивный пользователь, а серверный процесс. Рассмотрим, что это может быть:
BackgroundJob (Фоновое задание), значит, блокировку накладывает какой-то автоматический процесс.Чтобы выяснить, какое именно задание работает, выполним следующие действия:
Если доступа к консоли 1С нет, но есть полный доступ к SQL Server, мы можем попытаться получить информацию напрямую из системных представлений. Существуют готовые обработки, позволяющие анализировать SQL сервер глазами 1С-ника, но мы рассмотрим ручной способ.
Используем запрос к sys.dm_exec_sessions и sys.dm_exec_sql_text. Хотя SQL Server не знает имен пользователей 1С, платформа 1С иногда добавляет комментарии к транзакционным запросам или устанавливает Application Name специфическим образом.
Посмотрим пример запроса для анализа текущих сессий:
SELECT
sess.session_id,
sess.program_name,
sess.login_name,
req.command,
text.text AS sql_text
FROM sys.dm_exec_sessions AS sess
LEFT JOIN sys.dm_exec_requests AS req ON req.session_id = sess.session_id
OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) AS text
WHERE sess.session_id = 96 -- Наш искомый SPID
Проанализируем результат:
program_name мы увидим что-то вроде "1CV8 Server...". Это подтвердит, что соединение от сервера приложений.sql_text мы увидим текст выполняемого запроса. В случае управляемых блокировок 1С или временных таблиц там могут быть подсказки. Например, имена таблиц вида _Document345. По метаданным конфигурации можно понять, какой это документ, особенно если сделать работу с функцией ПолучитьСтруктуруХраненияБазыДанных() удобнее и быстрее.Если мы хотим автоматизировать процесс мониторинга и сразу получать имя пользователя по SPID без ручного поиска в консоли, можно воспользоваться средствами администрирования через COM-соединение или Java/Ras интерфейс.
Рассмотрим логику скрипта на встроенном языке 1С, который подключается к агенту сервера и ищет нужную сессию. Для этого используется объект IClusterInfo и коллекции сеансов.
В современных версиях платформы через COM-объект V83.COMConnector (или соответствующей версии) можно получить список соединений. В свойствах каждого соединения есть атрибут, отвечающий за Соединение СУБД. В разных версиях API он может называться DBMSConnection.
Алгоритм действий для скрипта:
DBMSConnection (или аналог) с искомым номером (например, 96).Подведем итог. Ошибка транзакционной блокировки требует быстрого выявления виновника. Несоответствие номеров в SQL и 1С — это нормальное явление архитектуры.
Для решения задачи: