Каждый разработчик 1С рано или поздно сталкивается с необходимостью анализа тяжелых запросов. Самым популярным и проверенным временем инструментом для этой задачи является MS SQL Server Profiler. Однако при локальной разработке, когда сервер приложений «1С:Предприятие» и СУБД MS SQL Server развернуты на одном компьютере, часто возникает неприятная ситуация: Profiler запускается, показывает событие начала трассировки Trace Start, но дальше этого дело не идет. Запросы из 1С выполняются, отчеты формируются, а в окне профайлера царит полная тишина.
В этой статье мы подробно разберем, почему возникает эта техническая проблема, проанализируем внутренние механизмы сетевого взаимодействия MS SQL Server и 1С, а также рассмотрим пошаговые инструкции по ее устранению.
Когда СУБД и сервер 1С функционируют на одном физическом сервере (или рабочем компьютере разработчика), они могут общаться между собой по нескольким различным каналам. Выбор канала зависит от того, как именно прописан адрес сервера базы данных в настройках подключения 1С.
Существует три основных сетевых протокола для взаимодействия клиентских приложений (в данном случае сервера 1С) с MS SQL Server:
localhost, локальный IP-адрес 127.0.0.1 или просто точка .. Данный протокол является самым производительным (прирост скорости работы может достигать 10–15%), поскольку данные не упаковываются в сетевые пакеты, а передаются напрямую через оперативную память компьютера.SRV-WORKSTATION) или внешнему IP-адресу машины в локальной сети.Проблема «невидимости» запросов в SQL Profiler чаще всего возникает из-за несовпадения протоколов или экземпляров СУБД. Если в настройках базы данных в консоли кластера 1С прописан адрес localhost, сервер 1С подключается к СУБД по сверхбыстрому протоколу Shared Memory. В то же время, если сам SQL Profiler или среда SQL Server Management Studio (SSMS) запущены с подключением по реальному имени хоста (компьютера), они работают через сетевой стек TCP/IP.
В некоторых конфигурациях операционной системы и служб SQL Server, сессия трассировки, запущенная под сетевым протоколом TCP/IP, физически не может перехватить низкоуровневые сообщения, проходящие через локальный протокол Shared Memory. Еще более критичная ситуация возникает, когда на компьютере установлено несколько экземпляров (инстансов) SQL Server. В этом случае обращение к localhost и к имени компьютера может вести на совершенно разные экземпляры СУБД (например, основной экземпляр Developer и скрытый экземпляр SQL Express, установленный сторонним софтом).
Для начала нам необходимо выяснить, как именно прописано подключение к СУБД на стороне сервера «1С:Предприятие». Выполним следующие действия:
Если там написано localhost, 127.0.0.1 или ., то сервер 1С общается со СУБД через общую память. Если указано имя компьютера (например, Server-PC), то взаимодействие идет по протоколу TCP/IP.
Чтобы SQL Profiler гарантированно перехватывал запросы, необходимо настроить единообразие подключений. Самый надежный способ — перевести оба приложения на работу по имени хоста. Это заставит весь трафик проходить через сетевой стек TCP/IP, который Profiler отслеживает без каких-либо затруднений.
Выполним перенастройку:
localhost на реальное имя вашего компьютера (узнать его можно в свойствах системы Windows).После выравнивания адресов запустим трассировку заново и проверим работу в 1С. Запросы должны начать мгновенно отображаться на экране.
Если мы хотим точно удостовериться, по каким именно протоколам и к какому экземпляру СУБД сейчас подключены наши сессии 1С, выполним специальный диагностический запрос в SSMS. Этот запрос обращается к системным динамическим представлениям СУБД и возвращает детальную информацию обо всех текущих подключениях.
Откроем окно создания нового запроса в SSMS и выполним следующий код:
SELECT
s.session_id AS [ID Сессии],
s.program_name AS [Имя программы],
s.login_name AS [Логин],
c.net_transport AS [Протокол подключения],
c.client_net_address AS [IP-адрес клиента]
FROM sys.dm_exec_sessions AS s
INNER JOIN sys.dm_exec_connections AS c
ON s.session_id = c.session_id
WHERE s.program_name LIKE '%1C%'
OR s.program_name LIKE '%Profiler%';
Проанализируем результаты выполнения запроса:
1C:Enterprise или содержат имена rphost).net_transport) мы увидим реальный тип соединения. Значение Shared memory подтвердит работу через локальную память, а значение TCP укажет на работу через сетевой драйвер.Shared memory, а сессия профайлера подключена по TCP, это является прямой подсказкой к необходимости выравнивания адресов, описанного в Шаге 2.Если адреса выровнены, но запросы все равно не появляются, велика вероятность, что в настройках самой трассировки отключены важные события или случайно наложен избыточный фильтр. Проверим настройки трассировки в окне создания нового шаблона Profiler:
Stored Procedures (а именно RPC:Completed — выполнение хранимых процедур, через которые 1С выполняет большинство параметризованных запросов) и из группы TSQL (событие SQL:BatchCompleted — выполнение пакетов инструкций SQL).DatabaseName или DatabaseID. Часто разработчики ошибаются при вводе имени базы данных, из-за чего профайлер просто отсекает нужные события. Для теста рекомендуется полностью очистить все фильтры, оставив только стандартный дефолтный фильтр, исключающий отображение самого SQL Profiler (поле ApplicationName -> Not like -> SQL Profiler).Рассматривая работу с СУБД MS SQL Server 2016 и выше, важно упомянуть крайне важный факт: корпорация Microsoft официально объявила SQL Server Profiler устаревшим инструментом (deprecated). Использовать его на реальных высоконагруженных базах данных настоятельно не рекомендуется.
Дело в том, что Profiler работает во внешнем потоке операционной системы. При генерации огромного количества событий (что типично для систем на платформе 1С) Profiler начинает перегружать процессор сервера СУБД, создавая значительные задержки и блокировки, вплоть до полного зависания рабочей базы данных.
Современной, легкой и гораздо более надежной заменой являются Extended Events (Расширенные события). Этот инструмент встроен непосредственно в ядро СУБД, работает в сотни раз быстрее и лишен проблем с конфликтами локальных сетевых протоколов.
Для создания сессии расширенных событий выполним следующие действия:
Trace_1C) и перейдем на шаг выбора шаблонов. Можно выбрать пустой шаблон и вручную добавить интересующие нас события: sql_batch_completed и rpc_completed.sqlserver.database_name равным имени нашей базы данных 1С.Сессия Extended Events перехватит абсолютно все запросы от сервера приложений 1С, независимо от того, подключен ли он через localhost по общей памяти или по имени хоста через сеть TCP/IP. Это исключит любые проблемы с сетевой адресацией и убережет рабочий сервер от нежелательных перегрузок.