Ситуация, когда проверенная годами система 1С:Предприятие 7.7 на SQL-версии внезапно начинает «тормозить» при выполнении простейших операций, знакома многим администраторам. Особенно остро проблема проявляется при поиске документов по номеру в общем журнале: поиск за один день может занимать 30 и более секунд, даже если документов в базе немного. Рассмотрим подробно причины такого поведения и разберем пошагово методы устранения этой проблемы.
Прежде чем приступать к глобальным изменениям в настройках, нам необходимо понять, что именно происходит в момент поиска. Разберем ситуацию: если на одном компьютере поиск работает мгновенно, а на другом — с задержкой, значит, SQL-сервер получает или обрабатывает запросы от этих клиентов по-разному. Проанализируем это с помощью SQL Server Profiler.
Запустим трассировку и сравним текст запроса и план его выполнения (Execution Plan) для «быстрой» и «медленной» машин. Обратим внимание на следующие моменты:
DOCNO или выполняет полное сканирование таблицы (Table Scan)?SET-параметрах сессии (например, ANSI_NULLS, QUOTED_IDENTIFIER)?CPU, а какое — Duration (ожидание)?Если в плане выполнения мы видим Index Scan вместо Index Seek, значит, оптимизатор SQL-сервера считает индекс неэффективным. Это отправная точка для дальнейших действий.
Часто корень проблемы кроется в способе взаимодействия клиента с сервером. Разберем работу утилиты cliconfg.exe. В операционных системах Windows она находится в системных папках (например, C:\Windows\System32\cliconfg.exe или C:\Windows\SysWOW64\cliconfg.exe для 64-битных систем).
Выясним причину задержек: старые версии 1С 7.7 могут использовать протокол Named Pipes, который в современных сетевых инфраструктурах работает значительно медленнее, чем TCP/IP, из-за избыточных проверок безопасности и аутентификации. Проделаем следующие шаги на проблемных компьютерах:
cliconfg.exe.Проанализируем настройки самого SQL-сервера. Для 1С 7.7 критически важен параметр Max Degree of Parallelism. Платформа генерирует запросы, которые не рассчитаны на параллельное выполнение. Если сервер пытается разделить простой поиск по номеру на несколько потоков, это приводит к накладным расходам на координацию потоков, что и дает задержку в 30 секунд.
Установим значение MAXDOP в 1. Это заставит SQL-сервер выполнять каждый запрос в один поток, что для архитектуры 7.7 является оптимальным. Выполним следующий скрипт в SQL Query Analyzer или Management Studio:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max degree of parallelism', 1;
RECONFIGURE;
После этого изменения необходимо проверить скорость поиска. Как правило, это действие существенно стабилизирует время отклика системы.
Если стандартная реиндексация (через 1С или SQL) не помогает, проблема может заключаться в устаревшей статистике. Оптимизатор SQL-сервера строит план на основе данных о том, сколько уникальных значений содержится в поле. Если статистика «протухла», сервер может решить, что поиск по DOCNO вернет 90% таблицы, и выберет сканирование вместо индекса.
Выясним название таблицы журнала. В 1С 7.7 это обычно _1SJOURN. Выполним принудительное обновление статистики с полным сканированием:
UPDATE STATISTICS _1SJOURN WITH FULLSCAN;
GO
Это гарантирует, что SQL-сервер обладает актуальной информацией о распределении номеров документов и будет правильно использовать существующие индексы.
Посмотрим на настройки источника данных ODBC. 1С 7.7 взаимодействует с SQL через драйвер SQL Server (не путать с Native Client). В настройках системного DSN или в параметрах подключения могут быть активны опции AnsiNPW (ANSI Padding, Nulls, and Warnings).
Если на одной машине эти параметры включены, а на другой — нет, SQL-сервер будет хранить разные планы выполнения для одного и того же запроса. Убедимся, что настройки идентичны. Рекомендуется отключать опции, связанные с ANSI, для обеспечения совместимости со старым кодом 1С 7.7, который не всегда корректно обрабатывает NULL или специфические предупреждения драйвера.
Проанализируем ситуацию с безопасностью. Поиск в журнале — это передача множества мелких сетевых пакетов. Если на компьютере установлен антивирус с функцией «Сетевой экран» или «Проверка почты/веб-трафика», он может перехватывать каждый пакет от 1cv7s.exe, проверяя его содержимое. Это вносит микрозадержки, которые при массовом запросе складываются в десятки секунд.
Попробуем добавить процесс 1cv7s.exe и папку с базой данных (а также исполняемые файлы SQL-клиента) в исключения антивируса. Также стоит проверить настройки сетевой карты: отключение функций TCP Chimney Offload и Receive Side Scaling (RSS) в свойствах адаптера часто решает проблемы с «замиранием» SQL-сессий.
Несмотря на то что данные хранятся на сервере, 1С 7.7 активно использует локальный кэш. Рассмотрим шаги по его очистке:
Temp пользователя (как локальную, так и в профиле на сервере терминалов)..lst и .cfg. В них хранятся настройки колонок журналов, отборы и позиции курсора, которые могут быть повреждены и вызывать деградацию производительности при открытии форм.Выполнив эти действия, мы исключим влияние «мусорных» данных на процесс формирования поискового запроса.