Каждый администратор и разработчик 1С рано или поздно сталкивается с парадоксальной ситуацией: пользователь жалуется, что тяжелый ежемесячный отчет формируется десятки минут, но при анализе производительности сервера выясняется, что нагрузка на центральный процессор (ЦП) составляет скромные 1–2%, а дисковая активность практически нулевая. Сервер выглядит абсолютно ненагруженным, однако отчет «висит». На примере отчета «Ведомость расчетов с клиентами по документам» в конфигурации «Управление торговлей 11.4» мы подробно разберем, почему так происходит, и как решить эту проблему комплексными методами.
Этот симптом часто вводит в заблуждение технических специалистов. На самом деле за низкой утилизацией ресурсов скрываются вполне конкретные архитектурные особенности работы платформы 1С:Предприятие 8.3 и СУБД MS SQL Server:
rphost) и SQL-сервер физически разделены, СУБД может быстро подготовить порцию данных и ожидать, пока 1С примет ее по сети. В этот момент возникает ожидание ASYNC_NETWORK_IO, при котором оба сервера показывают околонулевую активность.Nested Loops) вместо хэш-соединения (Hash Match). Это приводит к миллионам последовательных чтений из кэша оперативной памяти. Дисковая активность при этом равна нулю, а общая нагрузка на процессор минимальна из-за выполнения операции в один поток.tempdb настроена некорректно, возникает конкуренция за страницы распределения памяти, и процессор простаивает в ожиданиях внутренних защелок (latch contention).Типовой отчет «Ведомость расчетов с клиентами по документам» строится по регистрам накопления расчетов с клиентами. В современных конфигурациях на базе ERP-платформы (УТ 11, КА 2, ERP) существует два режима ведения взаиморасчетов:
Решение: В настройках программы перейдем в раздел НСИ и администрирование -> Казначейство и взаиморасчеты и проверим, включена ли новая архитектура взаиморасчетов (режим «Онлайн»). Если используется старый офлайн-режим, крайне рекомендуется запланировать переход на новую онлайн-архитектуру.
Для устранения узких мест на уровне базы данных проанализируем и скорректируем настройки MS SQL Server:
Для баз данных 1С настоятельно рекомендуется устанавливать параметр максимальной степени параллелизма MAXDOP = 1. Если этот параметр установлен в значение 0 (по умолчанию), SQL-сервер будет пытаться распараллелить тяжелый запрос отчета. В условиях сложной структуры таблиц 1С это гарантированно приводит к взаимным блокировкам и деградации производительности.
Начиная с версии MS SQL Server 2014, новый оптимизатор запросов часто некорректно оценивает кардинальность (количество строк) для временных таблиц 1С, что ведет к выбору крайне неэффективных планов запросов. Чтобы исправить это, включим устаревший оценщик стоимости запросов. В свойствах базы данных SQL перейдем в раздел Database Scoped Configurations и установим для параметра Legacy Cardinality Estimation значение ON.
Если сервер приложений 1С и сервер СУБД MS SQL установлены на одном физическом сервере, проверим строку подключения в кластере 1С. В качестве имени сервера баз данных следует указывать точку . или (local). Это заставит систему обмениваться данными через протокол Shared Memory (общая память), минуя сетевой стек TCP/IP, что значительно ускорит передачу больших выборок данных (например, отчетов на 170 тысяч строк).
Регулярность обслуживания базы данных критически важна. Проведение обслуживания один раз в неделю — слишком редкий интервал для активно работающей торговой базы. Разберем оптимальный график регламентных процедур:
FREEPROCCACHE, чтобы SQL-сервер гарантированно построил новые оптимальные планы.Вывод 173 480 строк в один табличный документ — это экстремальная нагрузка на клиентское приложение и рабочий процесс rphost. Даже если база данных отдаст результат запроса за 5 секунд, платформа 1С потратит несколько минут на обработку макета, применение условного оформления, расчет итогов по группировкам и отрисовку графических элементов в памяти.
Проанализируем структуру отчета и оптимизируем настройки СКД:
Разберем последовательность действий для локализации и решения проблемы:
СкомпоноватьРезультат(), значит, основная проблема кроется в тяжелом SQL-запросе или неоптимальном плане на стороне СУБД.Index Scan (сканирование индекса) вместо Index Seek (поиск в индексе) создадим недостающие индексы или обновим статистику по соответствующим таблицам.Применяя данные подходы комплексно — от оптимизации настроек СУБД до правильной настройки регламентных заданий в самой 1С — мы сможем сократить время формирования тяжелых аналитических отчетов в разы, снизив нагрузку на аппаратную часть сервера.