В практике разработчика 1С часто встречается парадоксальная ситуация: запрос, запущенный напрямую в SQL Server Management Studio или отслеженный через SQL Profiler, выполняется за считанные миллисекунды, однако пользователь в интерфейсе 1С видит результат лишь спустя несколько минут. Рассмотрим подробно причины этого явления и разберем по шагам методы диагностики и решения проблемы.
Одной из наиболее распространенных причин задержки является разница между получением «сырых» данных в SQL и объектов в 1С. Проанализируем ситуацию: когда мы выбираем поле типа Ссылка в запросе 1С, платформа не просто получает уникальный идентификатор (GUID) из таблицы. Если эти данные выводятся в динамический список, консоль запросов или форму, платформе необходимо получить представление этой ссылки.
Разберем, что происходит «под капотом»:
Как показала практика обсуждения, замена получения Ссылка на прямое получение представления через ПРЕДСТАВЛЕНИЕ(ПолеСсылки) может сократить время ожидания в разы. Однако важно помнить, что если в модуле объекта или менеджера переопределена функция ОбработкаПолученияПредставления, в которой написан неоптимальный код (например, обращение через точку к другим реквизитам), это создаст катастрофическую нагрузку. Платформа будет выполнять тысячи мелких запросов для каждой строки выборки.
Если запрос выполняется быстро на SQL, а данные долго «едут» до клиента, необходимо исключить проблемы сетевого уровня. Проанализируем важный технический аспект: 1С:Предприятие при передаче больших объемов данных между сервером приложений и клиентом использует пакеты нестандартного размера.
Выясним причину возможных задержек с помощью диагностики сети. Для этого рекомендуется выполнить проверку команды ping с указанием размера буфера, близкого к максимальному значению MTU:
ping [адрес_сервера] -l 65000 -t
Если при обычном пинге потерь нет, а при использовании ключа -l 65000 пакеты начинают теряться или время отклика резко возрастает, это сигнализирует о проблемах в настройке сетевого оборудования (коммутаторов, маршрутизаторов) или сетевых карт. В современных ОС Windows стоит обратить внимание на функции TCP Chimney Offload и Receive Side Scaling (RSS). Эти технологии призваны ускорить сеть, перенося нагрузку на сетевую карту, но в связке с 1С они часто вызывают необъяснимые «зависания» потоковых данных.
Чтобы понять, на каком этапе происходит задержка, проведем серию тестов. Посмотрим на пример модификации запроса для проверки пропускной способности:
// Оригинальный запрос
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Артикул = &Артикул";
// Тестовый запрос для исключения влияния передачи данных
Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Номенклатура ГДЕ Артикул = &Артикул";
Если запрос с КОЛИЧЕСТВО(*) отрабатывает мгновенно и на клиенте, значит, проблема точно не в логике SQL и не в индексах. Проблема заключается либо в объеме передаваемых данных (сериализация миллиона записей в XML/XDTO), либо в построении представлений на стороне сервера 1С.
Проанализируем ситуацию на стороне сервера приложений. Процесс rphost отвечает за маршалинг (преобразование) данных из формата SQL-драйвера во внутренний формат 1С. Рассмотрим факторы, замедляющие этот процесс:
rphost активно использует временные файлы в папке пользователя, под которым запущена служба. Если антивирус или DLP-система сканирует эти файлы в реальном времени, скорость работы упадет в десятки раз.Иногда «быстрота» запроса в консоли SQL обманчива. SQL Server кэширует планы выполнения запросов. Рассмотрим ситуацию: 1С передает запрос через системную процедуру sp_executesql с определенными параметрами. Если первый запуск (например, утром после очистки кэша) прошел с нетипичными параметрами, SQL построит план, который будет неэффективен для всех последующих вызовов.
В то же время, когда администратор копирует текст запроса в Management Studio и подставляет значения вручную, SQL строит новый, оптимальный план, и запрос «летает». Для решения этой проблемы в 1С иногда помогает использование временных таблиц вместо сложных вложенных соединений, что заставляет оптимизатор SQL пересчитывать статистику для промежуточных результатов.
ВЫБРАТЬ ПЕРВЫЕ... или агрегатные функции.Наименование, Код) вместо ссылки.srvinfo и пути к temp файлам пользователя службы 1С добавлены в исключения сканирования.Таким образом, если вы столкнулись с медленной работой 1С при быстром SQL, последовательно проверьте: неявное получение представлений, настройки сетевых пакетов (MTU) и работу rphost с памятью и временными файлами. В большинстве случаев проблема кроется в избыточности передаваемых данных со ссылочными типами.