В процессе эксплуатации крупных информационных баз, таких как 1С:Управление производственным предприятием (УПП) 1.3, специалисты часто сталкиваются с ситуацией, когда нагрузка на процессор сервера SQL достигает 100%. При анализе средствами SQL Server Management Studio (SSMS) удается выделить конкретный «тяжелый» запрос, однако его текст на языке SQL сильно отличается от того, что программист привык видеть в конфигураторе 1С. Разберем по шагам, как найти место в коде, инициирующее данный запрос, и как интерпретировать специфические конструкции SQL-транслятора платформы.
Рассмотрим представленный фрагмент запроса, который вызывает максимальную нагрузку. В нем мы видим сложные конструкции с использованием DATEADD и DATEPART. Проанализируем этот участок:
DATEADD(DAY, CAST(DATEPART(DAY, T1._Q_003_F_005) AS NUMERIC(4)) - 1, DATEADD(MONTH, ...))
Такой громоздкий код является результатом работы платформы 1С по трансляции функции НАЧАЛОПЕРИОДА. Если в исходном запросе 1С вы используете, например, НАЧАЛОПЕРИОДА(Таблица.Дата, ДЕНЬ), то СУБД получает именно такую математическую конструкцию для вычисления даты. Особое внимание уделим фрагменту (CAST(DATEPART(YEAR, ...) AS NUMERIC(4)) - 2000) - 2000. Это явный признак того, что в базе данных используется смещение дат 2000. Платформа прибавляет или вычитает 2000 лет, чтобы корректно обрабатывать даты в SQL Server.
Выясним причину, почему глобальный поиск по строке ДОБАВИТЬКДАТЕ в конфигураторе часто не дает результатов. Дело в том, что SQL-запрос может формироваться динамически или быть частью системы компоновки данных (СКД). Поэтому искать нужно не точное совпадение текста, а логические конструкции:
НАЧАЛОПЕРИОДА в запросах.Наиболее эффективным и надежным способом определения источника запроса является настройка Технологического журнала (ТЖ). ТЖ позволяет сопоставить SQL-запрос с конкретной строкой кода в модуле 1С. Для этого нам необходимо создать файл конфигурации logcfg.xml в каталоге bin/conf сервера приложений 1С.
Разберем пример настройки ТЖ для отлова конкретного запроса. Нам важно включить событие DBMSSQL и, самое главное, свойство Context, которое покажет стек вызова программного кода.
<config xmlns="http://v8.1c.ru/7.4/config/log">
<log location="C:\LOGS\SQL_QUERIES" history="2">
<event>
<eq property="Name" value="DBMSSQL"/>
<like property="Sql" value="%DATEADD(DAY,CAST(DATEPART(DAY,T1._Q_003_F_005)%"/>
</event>
<property name="All"/>
</log>
</config>
После активации этой настройки система начнет записывать в логи все SQL-запросы, содержащие указанный фрагмент. В поле Context вы увидите подробную информацию, например:
Context=ОбщийМодуль.ПроцедурыРасчетаСебестоимости.Модуль : 1452 : Запрос.Выполнить()
Это позволит вам мгновенно перейти к проблемному участку кода в конфигураторе.
Проанализируем структуру самого запроса. Наличие вставок в таблицы вида #tt25 из #tt21 говорит о том, что выполняется длинная цепочка расчетов с использованием Менеджера временных таблиц. В конфигурации УПП 1.3 такая логика характерна для механизмов РАУЗ (Расширенная аналитика учета затрат).
Посмотрим, какие объекты могут быть задействованы:
Если запрос содержит 3 ключевых ссылки (организация, склад, номенклатура), скорее всего, это этап распределения затрат или формирования движений по регистру УчетЗатратРегл или УчетЗатрат. В базах объемом более 500 Гб эти таблицы разрастаются, и стандартные алгоритмы могут требовать оптимизации или обновления статистики индексов.
Рассмотрим ситуацию, когда Технологический журнал по каким-то причинам включить невозможно (например, из-за риска падения производительности на слабом сервере). В этом случае воспользуемся следующими методами:
_AccumReg1234 в понятные имена РегистрНакопления.Продажи.Plan Handle запроса, вы можете посмотреть его план выполнения. Если вы видите Index Scan (сканирование индекса) вместо Index Seek (поиск в индексе), значит, запрос не оптимален и требует добавления индексов или переписывания условий ГДЕ.#tt, попробуйте найти в коде места, где в запросе 1С используется конструкция ПОМЕСТИТЬ. Именно там закладывается фундамент для последующих тяжелых соединений.Выяснив причину тормозов, выполним ряд профилактических действий, которые помогут разгрузить сервер SQL:
Во-первых, необходимо регулярно обновлять статистику. Для баз объемом 600 Гб стандартного задания SQL может быть недостаточно. Настройте ежедневное обновление статистики для наиболее нагруженных таблиц (регистров накопления и сведений).
Во-вторых, проанализируйте возможность выноса тяжелых отчетов на копию базы. Если пользователи формируют отчеты за большие периоды с группировками по дням, это неизбежно приведет к генерации запросов с DATEADD и DATEPART, которые нагружают CPU.
В-третьих, проверьте настройки регламентных заданий. Часто «тормоза» вызваны совпадением времени работы фоновых заданий (например, «Извлечение текста», «Обновление индекса ПП») и активной работы пользователей. Распределите их выполнение по времени.
Подводя итог, отметим, что поиск источника SQL-запроса — это комплексная задача, требующая понимания механизмов платформы 1С. Сочетание глубокого анализа Технологического журнала и понимания бизнес-логики типовых решений (таких как РАУЗ в УПП) позволяет быстро локализовать проблему и найти пути ее решения.