Замедление работы отчетов в 1С:Предприятие — одна из самых распространенных проблем, с которой сталкиваются как бухгалтеры, так и разработчики. Отчет, который раньше формировался за несколько секунд, вдруг начинает «висеть» минутами, а то и часами. Но прежде чем пытаться оптимизировать код или настройки сервера, нужно точно определить источник тормозов. Без корректных замеров любые доработки рискуют оказаться бесполезными — или даже ухудшить ситуацию.

В этой статье мы разберем 5 проверенных методов измерения производительности отчетов в 1С: от встроенных инструментов платформы до сторонних утилит. Вы узнаете, как выявить «узкие места» — будь то медленные запросы к базе, неэффективные алгоритмы или проблемы с аппаратной частью. А в конце статьи вас ждет FAQ с ответами на типичные вопросы по оптимизации.

Важно: все описанные методы актуальны для 1С:Предприятие 8.3 (включая последние релизы), но некоторые подходы работают и в более ранних версиях. Если вы используете облачную версию 1С или сервис 1С:Fresh, учтите, что доступ к ряду инструментов может быть ограничен.

1. Встроенный профайлер запросов: первый шаг к диагностике

Самый простой и доступный способ начать анализ — использовать встроенный профайлер запросов в конфигураторе. Этот инструмент показывает, сколько времени занимает выполнение каждого SQL-запроса, отправленного в базу данных. Чаще всего именно «тяжелые» запросы становятся основной причиной тормозов.

Чтобы включить профайлер:

  1. Откройте конфигуратор 1С в режиме Отладка.
  2. Перейдите в меню Сервис → Профайлер запросов (или нажмите Ctrl+Shift+P).
  3. Запустите проблемный отчет в пользовательском режиме.
  4. После завершения формирования отчета вернитесь в конфигуратор и изучите логи.

В окне профайлера вы увидите таблицу с данными:

  • 📊 Время выполнения — сколько миллисекунд занял каждый запрос.
  • 🔍 Текст запроса — сам SQL-код, который можно проанализировать на предмет оптимизации.
  • 📈 Количество чтений — сколько раз обращались к таблицам базы (чем больше, тем хуже).
💡

Если в логах профайлера вы видите запросы с временем выполнения более 1000 мс, это явный сигнал к оптимизации. Начните с добавления индексов на часто используемые поля или перепишите запрос с учетом особенностей СУБД (например, для PostgreSQL и MS SQL оптимальные запросы могут отличаться).

Обратите внимание на запросы с операторами LIKE, NOT IN или подзапросами в условии WHERE — они часто становятся «тормозами». Также стоит проверить, не дублируются ли одинаковые запросы (это может говорить о неэффективной логике в коде отчета).

⚠️ Внимание: Профайлер запросов показывает только время работы с базой данных, но не учитывает затраты на выполнение кода на стороне 1С (например, обработку результатов запроса в цикле). Если отчет тормозит, а профайлер не показывает критичных задержек, проблема может крыться в алгоритмах на встроенном языке.

2. Технологический журнал: глубокий анализ производительности

Если профайлер запросов не дал достаточно информации, следующий шаг — включение технологического журнала (ТЖ). Этот инструмент фиксирует все события платформы 1С, включая выполнение запросов, блокировки, работу фоновых задач и даже ошибки. ТЖ позволяет увидеть полную картину того, что происходит «под капотом» системы.

Чтобы настроить технологический журнал:

  1. Откройте файл conf.cfg (расположен в каталоге информационной базы).
  2. Добавьте или измените параметры:
    
    

    # Включение технологического журнала

    enable-technology-log = yes

    # Уровень детализации (recommended — для большинства задач)

    technology-log-level = recommended

    # Путь к файлу журнала

    technology-log-file = C:\Logs\1C\techlog.lgf

  3. Перезапустите сервер 1С.
  4. Воспроизведите проблему (запустите медленный отчет).
  5. Проанализируйте лог с помощью утилиты 1C:LogViewer (входит в комплект поставки платформы).

В логе обратите внимание на следующие события:

  • ⏱️ Длительные операции (более 1 секунды) — отмечены в логе как LongQuery или Slow.
  • 🔒 Блокировки — события Lock или Wait могут указывать на конфликты между пользователями.
  • 🖥️ Ошибки СУБД — например, SQLDeadlock или SQLTimeout.
Тип события в ТЖ Что означает Как исправить
LongQuery Запрос к базе выполнялся дольше 1 секунды. Оптимизировать запрос, добавить индексы, разбить на части.
LockWait Сеанс ожидает снятия блокировки с объекта базы. Проверить транзакции, уменьшить время удержания блокировок.
MemoryLimit Превышен лимит памяти для операции. Увеличить параметр -MemoryLimit в запуске 1С или оптимизировать код.
FullTextSearch Используется полнотекстовый поиск (может быть медленным). Заменить на поиск по индексированным полям или ограничить область поиска.

Анализ технологического журнала требует опыта, но дает максимально полную информацию. Если вы не уверены в своих силах, можно выгрузить лог и обратиться за помощью к специалистам .

⚠️ Внимание: Технологический журнал может значительно увеличивать нагрузку на диск и снижать производительность системы при высокой детализации (technology-log-level = debug). Используйте уровень recommended для большинства задач.
📊 Какой инструмент вы чаще используете для анализа производительности в 1С?
Профайлер запросов
Технологический журнал
Средства СУБД (например, SQL Profiler)
Собственные скрипты на встроенном языке
Не анализирую

3. Средства СУБД: SQL Profiler и Explain Plan

Если 1С работает на MS SQL Server или PostgreSQL, можно использовать встроенные инструменты этих СУБД для анализа производительности. Они дают более низкоуровневую информацию, чем профайлер 1С, и помогают выявить проблемы, связанные с исполнением запросов на стороне базы данных.

Для MS SQL Server: SQL Server Profiler

Утилита SQL Server Profiler позволяет отслеживать все запросы, поступающие от 1С к базе данных, с детализацией по времени выполнения, используемым индексам и планам выполнения. Чтобы начать анализ:

  1. Запустите SQL Server Profiler (входит в комплект SQL Server Management Studio).
  2. Создайте новый след (File → New Trace).
  3. Подключитесь к базе данных 1С.
  4. Запустите проблемный отчет в 1С.
  5. Проанализируйте самые долгие запросы (сортировка по колонке Duration).

Для PostgreSQL: Explain Analyze

В PostgreSQL есть встроенная команда EXPLAIN ANALYZE, которая показывает план выполнения запроса и реальное время его исполнения. Чтобы ею воспользоваться:

  1. Найдите медленный запрос в логах 1С или технологическом журнале.
  2. Подключитесь к базе данных через pgAdmin или psql.
  3. Выполните команду:
    EXPLAIN ANALYZE [ВАШ_ЗАПРОС]
  4. Изучите вывод, обращая внимание на узлы с большим временем (actual time) и отсутствием индексов (Seq Scan вместо Index Scan).

Пример вывода EXPLAIN ANALYZE для проблемного запроса:


Seq Scan on документ_расходнаянакладная (cost=0.00..14820.00 rows=1000 width=36) (actual time=0.014..45.231 rows=1000 loops=1)

Filter: (дата >= '2023-01-01'::date)

Rows Removed by Filter: 50000

Planning Time: 0.078 ms

Execution Time: 45.309 ms

В этом примере видно, что запрос выполняет полное сканирование таблицы (Seq Scan) и отфильтровывает 50 000 строк. Решение — добавить индекс на поле дата.

💡

Если в плане выполнения запроса вы видите операторы Hash Join или Nested Loop с большим временем, это сигнал о необходимости оптимизации соединений таблиц. Часто помогает денормализация данных или использование временных таблиц.

4. Замеры времени выполнения в коде 1С

Иногда тормоза отчета связаны не с запросами к базе, а с неэффективным кодом на встроенном языке. Например, обработка больших массивов данных в циклах или рекурсивные функции могут значительно замедлять работу. Чтобы выявить такие участки, можно добавить в код отчета ручные замеры времени.

Для этого используйте глобальную функцию ТекущаяДатаВремя() или объект Таймер:


// Пример 1: Простой замер времени

Начало = ТекущаяДатаВремя();

// ... код, время выполнения которого нужно замерить

Конец = ТекущаяДатаВремя();

Сообщить("Время выполнения: " + (Конец - Начало) + " секунд");

// Пример 2: Использование объекта Таймер (более точно)

Таймер = Новый Таймер;

Таймер.НачатьОтсчет();

// ... код

Таймер.ОстановитьОтсчет();

Сообщить("Прошло миллисекунд: " + Таймер.ПолучитьИнтервал());

Где лучше размещать замеры:

  • Перед и после основного цикла обработки данных.
  • 📄 В начале и конце выполнения каждого запроса (если их несколько).
  • 🔄 Перед и после рекурсивных функций или вложенных циклов.

Если вы обнаружили, что какой-то участок кода выполняется слишком долго, попробуйте:

  • 🔄 Заменить вложенные циклы на использование Массив.Найти() или Соответствие.
  • 🗃️ Перенести обработку данных в SQL-запрос (если это возможно).
  • 🧹 Уменьшить количество временных объектов (например, создавать ТаблицаЗначений только при необходимости).

Убрать вложенные циклы (заменить на Соответствие или Массив.Найти())|

Перенести фильтрацию данных в SQL-запрос|

Использовать ТаблицуЗначений вместо массивов для больших данных|

Проверять наличие индексов на полях, используемых в условиях|

Избегать рекурсивных вызовов без ограничения глубины-->

Обратите внимание, что ручные замеры могут немного искажать реальную картину из-за накладных расходов на сам замер. Для точных данных лучше комбинировать этот метод с профайлером или технологическим журналом.

5. Аппаратные замеры: мониторинг ресурсов сервера

Иногда проблема кроется не в коде или запросах, а в недостаточных ресурсах сервера. Например, если во время формирования отчета загруженность процессора достигает 100%, а оперативной памяти не хватает, система начинает активно использовать файл подкачки, что приводит к резкому падению производительности.

Чтобы проверить аппаратную часть, используйте:

  • 🖥️ Диспетчер задач Windows (для локальных установок 1С).
  • 📊 Performance Monitor (для серверных версий).
  • 🐧 Утилиты top, htop, vmstat (для Linux-серверов).

На что обратить внимание:

Ресурс Критическое значение Что делать
Загрузка CPU Более 90% в течение длительного времени Оптимизировать запросы, добавить процессорные мощности
Использование RAM Более 80% от доступной памяти Увеличить объем ОЗУ или оптимизировать код (утечки памяти)
Дисковая активность Постоянная запись/чтение (100% загрузка диска) Проверить фрагментацию базы, перенести базу на SSD
Сетевая нагрузка Высокая задержка (ping > 100 мс) Проверить канал связи, оптимизировать трафик

Если вы работаете с 1С:Предприятие на сервере, проверьте настройки кластера серверов 1С. Например, параметр -MemoryLimit в файле srvinfo.reg ограничивает количество памяти, доступной для одного сеанса. Если отчет обрабатывает большие объемы данных, этого лимита может не хватать.

⚠️ Внимание: На виртуальных машинах (например, в облачных решениях) производительность может падать из-за «соседей» по хосту, которые потребляют ресурсы. В этом случае поможет только миграция на выделенный сервер или увеличение мощностей.
Как проверить фрагментацию базы данных?

Фрагментация таблиц в базе данных может значительно замедлять выполнение запросов. Чтобы проверить фрагментацию в MS SQL Server, выполните запрос:


SELECT

OBJECT_NAME(ind.OBJECT_ID) AS TableName,

ind.name AS IndexName,

indexstats.avg_fragmentation_in_percent

FROM

sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') indexstats

INNER JOIN

sys.indexes ind ON ind.object_id = indexstats.object_id AND ind.index_id = indexstats.index_id

WHERE

indexstats.avg_fragmentation_in_percent > 30

ORDER BY

indexstats.avg_fragmentation_in_percent DESC;

Если фрагментация превышает 30%, выполните реорганизацию или перестроение индексов с помощью команд ALTER INDEX REORGANIZE или ALTER INDEX REBUILD.

6. Сравнительный анализ: тестирование на разных данных

Иногда отчет работает быстро на небольших объемах данных, но начинает тормозить при увеличении выборки. Чтобы выявить зависимость производительности от объема данных, проведите сравнительное тестирование:

  1. Создайте тестовую копию базы с минимальным набором данных (например, за 1 месяц).
  2. Запустите отчет и замерьте время выполнения.
  3. Постепенно увеличивайте объем данных (за квартал, год, 5 лет) и фиксируйте изменения во времени выполнения.
  4. Постройте график зависимости времени от объема данных.

Типичные сценарии:

  • 📈 Линейный рост — время увеличивается пропорционально объему данных. Это нормально, но можно оптимизировать код.
  • 🚀 Экспоненциальный рост — время растет лавинообразно (например, из-за вложенных циклов). Требует срочной оптимизации.
  • Постоянные задержки — время не зависит от объема данных. Возможно, проблема в блокировках или аппаратных ограничениях.

Для автоматизации тестирования можно написать скрипт на встроенном языке, который будет:

  1. Генерировать тестовые данные разного объема.
  2. Запускать отчет в цикле.
  3. Собирать статистику по времени выполнения.

Пример простого скрипта для тестирования:


Процедура ТестироватьПроизводительность()

МассивОбъемов = Новый Массив;

МассивОбъемов.Добавить(100); // 100 документов

МассивОбъемов.Добавить(1000); // 1 000 документов

МассивОбъемов.Добавить(10000); // 10 000 документов

Для Каждого Объем Из МассивОбъемов Цикл

Начало = ТекущаяДатаВремя();

// ... код генерации тестовых данных объема "Объем"

// ... запуск отчета

Конец = ТекущаяДатаВремя();

Сообщить("Объем: " + Объем + ", Время: " + (Конец - Начало) + " сек");

КонецЦикла;

КонецПроцедуры

Такой подход поможет выявить пороговые значения, после которых производительность резко падает. Например, если отчет работает быстро до 5 000 строк, но тормозит на 10 000, это может указывать на неэффективную обработку больших массивов в коде.

FAQ: Ответы на частые вопросы

Как понять, что тормозит именно отчет, а не вся система?

Если тормоза наблюдаются только при формировании конкретного отчета, а остальные операции в 1С работают нормально, проблема точно в отчете. Чтобы подтвердить это:

  1. Проверьте загрузку сервера во время выполнения отчета (через Диспетчер задач).
  2. Запустите другой отчет с похожей структурой — если он работает быстро, проблема в коде или данных первого отчета.
  3. Используйте профайлер запросов: если во время тормозов нет долгих запросов, виноват код на встроенном языке.
Можно ли ускорить отчет без изменения кода?

Да, в некоторых случаях помогают следующие меры:

  • 🔧 Добавить индексы на поля, используемые в условиях отчета (особенно в WHERE и ORDER BY).
  • 🗃️ Оптимизировать СУБД: обновление статистики, дефрагментация индексов, настройка параметров сервера (например, max_memory в MS SQL).
  • 🖥️ Увеличить ресурсы сервера: добавить ОЗУ, перенести базу на SSD, увеличить мощность CPU.
  • 🕒 Запускать отчет в фоновом режиме (если тормоза связаны с блокировками).

Однако если проблема в неэффективном алгоритме (например, вложенные циклы по большим массивам), без правок кода не обойтись.

Почему отчет тормозит только у некоторых пользователей?

Вероятные причины:

  • 🔒 Блокировки: другие пользователи удерживают блокировки на данных, которые нужны для отчета.
  • 🖥️ Локальные настройки: у пользователя слабый компьютер или медленное сетевое соединение.
  • 📋 Разные права доступа: отчет может выполнять дополнительные проверки для пользователей с ограниченными правами.
  • 🗂️ Разные настройки отчета: пользователи могут использовать разные периоды или фильтры, что влияет на объем обрабатываемых данных.

Чтобы диагностировать проблему, сравните логи технологического журнала для «быстрых» и «медленных» пользователей.

Как оптимизировать отчет с большим количеством вложенных циклов?

Вложенные циклы — одна из самых распространенных причин тормозов. Чтобы оптимизировать:

  1. Замените вложенные циклы на Соответствие или Массив.Найти().
  2. Перенесите логику в SQL-запрос (используйте ВЫБРАТЬ РАЗЛИЧНЫЕ, ГРУППИРОВКА).
  3. Разбейте отчет на части: сначала получите основные данные, затем детализируйте их отдельными запросами.
  4. Используйте временные таблицы для промежуточных результатов.

Пример оптимизации:

Плохо: Цикл по 10 000 документов, внутри которого еще один цикл по 100 строкам табличной части.

Хорошо: Один запрос с группировкой, который сразу возвращает нужные данные без вложенных итераций.

Какие инструменты для анализа производительности есть в 1С:Fresh?

В облачной версии 1С:Fresh доступ к низкоуровневым инструментам (например, технологическому журналу или SQL Profiler) ограничен. Однако вы можете:

  • 📊 Использовать встроенный профайлер запросов (доступен в режиме отладки).
  • ⏱️ Добавлять ручные замеры времени в код отчета (как описано в разделе 4).
  • 📧 Обратиться в техническую поддержку 1С:Fresh с просьбой проанализировать производительность (приложите скриншоты или логи, если есть).
  • 🔧 Оптимизировать код отчета (убрать вложенные циклы, перенести логику в запросы).

Если отчет тормозит в 1С:Fresh, чаще всего проблема решается оптимизацией кода или настройкой индексов (если у вас есть доступ к управлению структурой базы).