Администрирование · 12 мин
Как сделать замер производительности в 1С
Как сделать замер производительности в 1С через конфигуратор, ЦУП и технологический журнал. Пошаговая инструкция, анализ результатов и типичные ошибки.
Медленное проведение документа, «подвисающий» отчёт или долгое открытие формы — типичные жалобы пользователей 1С. Чтобы понять, где именно теряется время, недостаточно догадок: нужен замер производительности — инструмент, который показывает, сколько времени заняла каждая строка кода и каждый запрос к базе данных.
Платформа 1С:Предприятие предлагает несколько способов измерения: встроенный замер производительности в конфигураторе (отладка), программный замер через объект «ОписаниеПроцедурИФункций», центр управления производительностью (ЦУП) и технологический журнал для анализа на уровне сервера. Каждый инструмент решает свою задачу — от поиска «тяжёлой» строки в модуле до диагностики блокировок СУБД.
Ниже разобраны практические сценарии: как включить замер, как читать его результаты, как отличить проблему в коде от проблемы в запросе и в каких случаях замер в конфигураторе не поможет.
Какие инструменты замера есть в платформе 1С
Выбор инструмента зависит от того, что именно тормозит. Если подозрение падает на конкретный код — обработку, проведение документа, построение отчёта, — достаточно встроенного замера производительности в конфигураторе. Он работает на уровне строк встроенного языка и показывает, сколько раз вызывалась каждая строка и сколько времени она заняла.
Если проблема проявляется на рабочей базе у многих пользователей (взаимоблокировки, долгие запросы СУБД, превышение времени вызовов), нужен технологический журнал — лог событий кластера серверов 1С. Для постоянного мониторинга продуктивной системы предназначен ЦУП (центр управления производительностью) — отдельная конфигурация, собирающая показатели через технологический журнал.
Дополнительно разработчики используют программный замер фрагментов кода — например, через функции текущего времени или специализированные подсистемы из типовых конфигураций. Это удобно, когда нужно измерить длительность конкретного участка без запуска полноценной отладки.
Сравнение инструментов
Подходит для поиска медленных строк кода и запросов в конкретной операции. Ограничение: работает только в режиме отладки и искажает реальные тайминги.
Нужен для анализа событий сервера: долгие запросы СУБД, блокировки, ошибки. Ограничение: требует настройки logcfg.xml и разбора больших логов.
Постоянный мониторинг продуктивной базы, сбор показателей и оценка APDEX. Ограничение: требует развёртывания отдельной базы и настройки.
Точечное измерение длительности участка кода в любом режиме. Ограничение: показывает только общее время, без детализации по строкам.
Замер производительности через конфигуратор: пошагово
Самый доступный способ — встроенный механизм отладки. Он не требует изменения кода и работает как для файловых, так и для клиент-серверных баз, если у вас есть право на отладку и доступ к конфигуратору.
- 1Откройте конфигуратор и запустите отладку: Отладка → Начать отладку (или F5). Если сеанс клиента уже запущен, подключите его через Отладка → Подключение.
- 2Включите замер: Отладка → Замер производительности. Пункт должен стать отмеченным флажком.
- 3Перейдите в клиентское приложение и выполните операцию, которая работает медленно: проведите документ, сформируйте отчёт, откройте форму.
- 4Вернитесь в конфигуратор и снова выберите Отладка → Замер производительности — откроется окно результатов.
- 5Изучите колонки: имя модуля, номер строки, количество вызовов, чистое и суммарное время, процент от общей длительности.
- 6Отсортируйте по времени и найдите строки с максимальным вкладом — это и есть точки оптимизации.
В окне результатов есть важные колонки. «Количество вызовов» показывает, сколько раз выполнялась строка — большое число при малом времени одной строки часто указывает на запрос или обращение к данным внутри цикла. «Время (чистое)» — время самой строки без вложенных вызовов, «время (суммарное)» — с учётом вызванных из неё процедур. Для поиска узкого места в первую очередь смотрят именно чистое время.
Отдельный признак полезен для запросов: в замере видно, какая доля времени ушла на выполнение запроса к СУБД. Если строка «Запрос.Выполнить()» занимает основную часть времени, оптимизировать нужно запрос или индексы, а не код обхода результата.
Как читать результаты замера и находить узкие места
Типичная картина проблемного замера: одна-две строки занимают 70–90% суммарного времени, остальное распределено равномерно. Именно эти строки и стоит анализировать. Если «горячая» строка — выполнение запроса, откройте текст запроса и проверьте его план: соединения без условий по индексированным полям, выборка лишних полей, вложенные запросы вместо временных таблиц.
Если лидирует строка внутри цикла — например, обращение к реквизиту через точку от ссылки (Документ.Контрагент.ИНН), — это классический признак «запроса в цикле»: каждое обращение порождает неявное обращение к базе. Решение — получить все нужные данные одним запросом до цикла.
Обращайте внимание на количество вызовов. Строка, выполненная 50 000 раз по 0,001 секунды, суммарно «съест» 50 секунд — хотя по отдельности выглядит безобидно. В таких случаях оптимизируют алгоритм целиком: уменьшают число итераций, кэшируют результаты, выносят повторяющиеся вычисления из цикла.
Смотрите, что делает строка: запрос, обращение к СУБД, вызов тяжёлой функции
Проверьте, нет ли запроса или обращения к данным внутри цикла
Анализируйте план запроса, индексы и соединения таблиц
Ищите проблему на уровне СУБД или сети через технологический журнал
Программный замер длительности фрагмента кода
Когда нужно измерить реальное время выполнения без отладки — например, на продуктивной базе или в регламентном задании, — используют программный замер. Простейший вариант — зафиксировать универсальное время до и после фрагмента и записать разницу в журнал регистрации или в файл.
НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
// измеряемый фрагмент кода
ВыполнитьТяжелуюОперацию();
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера;
ЗаписьЖурналаРегистрации("Замер", УровеньЖурналаРегистрации.Информация,,,
"Длительность операции, мс: " + Длительность);В типовых конфигурациях на базе БСП есть готовые механизмы оценки производительности: подсистема «Оценка производительности» собирает замеры ключевых операций и позволяет смотреть статистику по ним. Это удобнее самописных замеров, если конфигурация типовая — механизм уже встроен и накапливает историю.
Программный замер показывает только суммарную длительность фрагмента, без разбивки по строкам. Поэтому его используют как датчик: сначала фиксируют, что операция действительно медленная и замедление воспроизводится, а затем уже запускают детальный замер в конфигураторе или анализируют технологический журнал.
Технологический журнал и ЦУП для серверных проблем
Если замер в конфигураторе показывает, что время уходит на ожидание ответа СУБД, а код и запросы выглядят нормально, следующий шаг — технологический журнал. Он включается через файл logcfg.xml в каталоге конфигурации сервера (или клиента) и позволяет логировать события DBMSSQL/DBPOSTGRS (запросы к СУБД с длительностью), TLOCK и TDEADLOCK (управляемые блокировки и взаимоблокировки), CALL и EXCP (вызовы и исключения).
Практический сценарий: настраивают лог с фильтром по длительности (например, события СУБД дольше заданного порога), воспроизводят проблемную операцию и анализируют, какие запросы выполнялись долго и какие блокировки возникали. Работа с технологическим журналом требует аккуратности: подробное логирование создаёт большие файлы и дополнительную нагрузку на диск, поэтому на продуктивном сервере его включают точечно и на ограниченное время.
ЦУП решает задачу постоянного наблюдения: он автоматически собирает данные технологического журнала, строит показатели APDEX по ключевым операциям и показывает деградацию производительности во времени. Его имеет смысл разворачивать, когда база большая, пользователей много, а проблемы носят плавающий характер и не воспроизводятся по требованию.
Типичные ошибки при замере производительности
Ещё одна частая ошибка — замер «в вакууме», когда анализируют только код 1С и не смотрят на окружение. Медленная работа может быть вызвана антивирусом на сервере СУБД, нехваткой оперативной памяти, сетевыми задержками между сервером 1С и СУБД или конкуренцией за блокировки с другими пользователями. Если замер показывает время на ожидании, а не на коде, расширяйте диагностику до уровня инфраструктуры.
Как проверить, что оптимизация сработала
После изменения кода или запроса замер повторяют в тех же условиях: та же база, те же входные данные, тот же порядок действий. Сравнивают не только общее время операции, но и структуру замера: «горячая» строка должна исчезнуть из верхних позиций или существенно снизить долю.
Для объективности полезно зафиксировать длительность операции программным замером до и после изменений — это даёт воспроизводимые цифры без искажений отладчика. Если операция выполняется у пользователей, дополнительно собирают обратную связь и статистику через подсистему оценки производительности.
Как проверить результат
Строка ушла из верхних позиций, время распределено равномерно
Строка по-прежнему занимает большую часть времени
Время операции заметно снизилось при тех же данных
Длительность не изменилась или выросла
Число обращений к базе сократилось на порядки
Запросы в цикле остались, изменился только код вокруг
Ускорение воспроизводится на реальном объёме данных
Эффект виден только на маленькой тестовой базе
Часто задаваемые вопросы
Можно ли сделать замер производительности без конфигуратора?
Да. Программный замер через ТекущаяУниверсальнаяДатаВМиллисекундах() работает в любом режиме, включая продуктивный. Для серверной диагностики без отладки используют технологический журнал и ЦУП. Детализацию по строкам кода без конфигуратора получить нельзя — это ограничение платформы.
Почему замер показывает разное время при повторных запусках?
На длительность влияют кэш СУБД, компиляция модулей, фоновые процессы и нагрузка от других сеансов. Поэтому первый прогон используют для прогрева, а выводы делают по нескольким повторным замерам, сравнивая относительные доли строк, а не абсолютные секунды.
Замер показывает, что всё время уходит на Запрос.Выполнить(). Что делать?
Анализируйте сам запрос: проверьте, что соединения и условия идут по индексированным полям, что не выбираются лишние поля и таблицы, что большие выборки разбиты через временные таблицы. Полезно получить план запроса средствами СУБД — он покажет полные сканирования таблиц.
Как измерить производительность на клиент-серверной базе, если нет доступа к серверу?
Замер в конфигураторе через подключение к сеансу отладки работает и в клиент-серверном режиме — для этого нужны права на отладку. Технологический журнал сервера без доступа к серверу настроить нельзя; в этом случае запросите логи у администратора сервера.
Что такое APDEX и зачем он в ЦУП?
APDEX — сводный показатель удовлетворённости временем отклика: операции делятся на быстрые, приемлемые и медленные по заданному целевому времени, и вычисляется индекс от 0 до 1. Он позволяет отслеживать деградацию производительности системы в целом, а не отдельных операций.
Опасно ли включать замер производительности на рабочей базе?
Замер в конфигураторе требует режима отладки, который на продуктивной базе применять не рекомендуется — он замедляет сеанс и может мешать пользователям. Безопасная практика: замеры на копии базы, а на продуктиве — только программные замеры и точечный технологический журнал с ограничением по времени.
Что важно запомнить
Основной инструмент — замер производительности в конфигураторе через меню «Отладка»; выводы делают по относительным долям строк, а не по абсолютному времени. Ключевые признаки проблем: одна строка с большой долей времени, запрос в цикле, время на выполнении запроса. Для серверных проблем и блокировок подключают технологический журнал и ЦУП, а эффект оптимизации подтверждают повторным замером в тех же условиях на копии продуктивной базы.