К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как использовать замер производительности в 1С

Как использовать замер производительности в 1С: включение механизма, чтение результатов, анализ строк кода, поиск узких мест и оптимизация запросов и процедур.

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

Инструмент доступен в конфигураторе и работает с клиентским и серверным кодом. Главная ценность замера — объективность: вместо ощущений «здесь, кажется, медленно» вы получаете таблицу с количеством вызовов, чистым временем выполнения и процентом от общей длительности операции.

Типичный сценарий применения — диагностика медленного проведения документов, долгого формирования отчётов, зависания обменов данными. Замер одинаково полезен разработчику, который оптимизирует свой код, и администратору, который ищет источник нагрузки на сервер.

Что именно измеряет механизм и какие ограничения есть

Замер фиксирует для каждой исполняемой строки встроенного языка количество вызовов, суммарное время, чистое время (без учёта вложенных вызовов) и процент от общего времени замера. Дополнительно собирается статистика по запросам: текст запроса, количество исполнений и длительность.

Чистое время — ключевая колонка. Если процедура «ПровестиДокумент» заняла 10 секунд, но 9,5 из них ушло на вложенный запрос, именно запрос — точка оптимизации, а не сама процедура. Сортировка по чистому времени сразу показывает такие строки.

Ограничения нужно учитывать заранее. Сам замер добавляет накладные расходы и замедляет выполнение, поэтому абсолютные цифры в замере выше реальных — ориентируйтесь на относительные доли. Механизм не показывает время работы СУБД «изнутри» (блокировки, планы выполнения) — для этого используются средства самой СУБД и технологический журнал.

Как включить и выполнить замер

Замер запускается из конфигуратора в режиме отладки. Порядок действий одинаков для тонкого и толстого клиента, для файловых и клиент-серверных баз.

Порядок выполнения замера
  1. 1
    Откройте конфигуратор и запустите отладку (F5) или подключитесь к уже запущенному сеансу через «Отладка → Подключение».
  2. 2
    Включите замер: «Отладка → Замер производительности» — пункт станет отмеченным.
  3. 3
    В клиентском приложении выполните проблемную операцию один раз: проведите документ, сформируйте отчёт, запустите обработку.
  4. 4
    Вернитесь в конфигуратор и снова нажмите «Отладка → Замер производительности», чтобы остановить сбор.
  5. 5
    Проанализируйте открывшуюся таблицу результатов.

Важно включить замер до начала операции, а не во время. Если операция уже «висит», часть вызовов не попадёт в статистику, и картина будет искажена. Для длительных фоновых заданий подключитесь к сеансу фонового задания через диалог подключения — иначе серверный код останется за пределами замера.

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

Как читать таблицу результатов

Таблица замера содержит колонки: модуль и строка, количество вызовов, время (суммарное и чистое), процент от общего времени, а также признак исполнения на клиенте или сервере. Двойной щелчок по строке открывает модуль на нужной строке кода.

Первый приём — отсортировать по чистому времени и посмотреть верхние 5–10 строк. В большинстве реальных случаев 80% времени занимают единицы строк: тяжёлый запрос, обращение к СУБД в цикле, длительная обработка большой таблицы значений.

Второй приём — сортировка по количеству вызовов. Строка с миллионом вызовов и мизерным временем каждого вызова в сумме может дать секунды. Так обнаруживаются циклы, внутри которых выполняется лишняя работа: поиск в массиве вместо соответствия, обращение к реквизиту через точку вместо одного запроса.

Высокое чистое время у одной строкиКонцентрированное узкое место

Что делает строка: запрос, цикл, обращение к СУБД

Огромное число вызовов при малом времениПроблема в цикле

Что выполняется внутри цикла и можно ли вынести за его пределы

Много строк-запросов подрядЗапросы в цикле

Можно ли объединить в один запрос с пакетом или временными таблицами

Большая доля клиентских строкКлиент-серверные вызовы

Не дёргает ли форма сервер при каждом изменении

Типичные узкие места, которые выявляет замер

Самая частая находка — запрос в цикле. Код перебирает строки табличной части и для каждой выполняет запрос к остаткам или ценам. Замер показывает тысячи вызовов одной строки. Решение — один запрос по всей таблице с соединением или временной таблицей, а результаты обходятся в памяти.

Вторая классика — обращение к реквизитам объекта через точку в цикле: Строка.Номенклатура.Артикул внутри перебора вызывает отдельное чтение из базы на каждой итерации. Выгрузка нужных полей одним запросом убирает проблему полностью.

Третья группа — избыточные клиент-серверные вызовы: форма при каждом изменении поля вызывает серверную процедуру, та выполняет запрос. Замер показывает множество коротких серверных вызовов. Лечится кэшированием данных на клиенте и группировкой обращений.

Запросы и временные таблицы

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

bsl
// Плохо: запрос в цикле
Для Каждого Строка Из Товары Цикл
    Запрос.УстановитьПараметр("Номенклатура", Строка.Номенклатура);
    Выборка = Запрос.Выполнить().Выбрать();
КонецЦикла;

// Хорошо: один запрос по всей таблице
Запрос.УстановитьПараметр("Товары", Товары.Выгрузить());
Выборка = Запрос.Выполнить().Выбрать();

Как проверить, что оптимизация сработала

После изменения кода повторите замер в тех же условиях: та же база, те же данные, тот же сценарий. Сравнивайте не абсолютные секунды, а структуру: проблемная строка должна уйти из верхних позиций, доля запросов — сократиться.

Контрольный прогон выполняйте без замера — только так вы увидите реальное время для пользователя. Замер с накладными расходами подходит для поиска мест, но не для финальной оценки скорости.

Контрольные точки

Как проверить результат оптимизации

Позиция бывшей проблемной строки в замере
Норма

Ушла из верхних строк, доля снизилась до единиц процентов

Тревожный признак

Осталась на прежнем месте — изменение не затронуло реальное узкое место

Количество вызовов запросов
Норма

Сократилось на порядки (тысячи → единицы)

Тревожный признак

Количество прежнее — запрос по-прежнему в цикле

Время операции без замера
Норма

Заметно быстрее при повторных прогонах

Тревожный признак

Время то же — ищите другое узкое место или проблему на уровне СУБД

Когда замера недостаточно: технологический журнал и средства СУБД

Замер показывает код встроенного языка, но не видит, что происходит внутри СУБД: блокировки, ожидания, неоптимальные планы запросов. Если замер указывает на запрос, а сам запрос выглядит нормально, следующий шаг — технологический журнал с событиями DBMSSQL/DBPOSTGRS и TLOCK.

Технологический журнал настраивается через файл logcfg.xml на сервере и пишет длительности запросов и блокировок. Для системных проблем — общей медленности всех операций, а не одной процедуры — начинайте именно с него и с мониторинга СУБД, а не с замера кода.

Чем измерять в разных ситуациях

Замер производительности

Конкретная операция медленная, нужно найти строки кода. Ограничение: не видит внутренности СУБД.

Технологический журнал

Блокировки, длительные запросы на уровне СУБД, системная деградация. Требует настройки logcfg.xml и анализа логов.

Средства СУБД (планы запросов)

Один конкретный запрос работает медленно, нужен план выполнения и проверка индексов.

Центр администрирования / счётчики ОС

Подозрение на ресурсы сервера: память, диск, процессор. Не показывает причину в коде.

Типичные ошибки при работе с замером

Типичные ошибки
01
Смотреть только суммарное время — вложенные вызовы маскируют реальное узкое место; сортируйте по чистому времени.
02
Сравнивать абсолютные секунды из замера с реальной работой — замер искажает время, сравнивайте доли и структуру.
03
Делать выводы по одному прогону на непрогретом кэше — повторите операцию и сравните устойчивость картины.
04
Оптимизировать строку с долей 2% — сначала устраните верхние позиции, иначе эффект будет незаметен.
05
Забыть включить отладку на сервере — серверный код не попадёт в замер, и выводы будут сделаны по неполным данным.

FAQ

Можно ли сделать замер без конфигуратора?

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

Почему в замере нет серверных процедур?

Наиболее вероятная причина — сервер приложений запущен без разрешения отладки (нет ключа -debug в параметрах службы агента). Вторая причина — код выполняется в фоновом задании, к сеансу которого вы не подключились отладчиком.

Чем отличается суммарное время от чистого?

Суммарное время включает всё, что было вызвано из данной строки: вложенные процедуры, запросы. Чистое — только собственное время строки. Для поиска узких мест опирайтесь на чистое время, иначе «верхние» процедуры-обёртки будут затенять реальные проблемы.

Замер показывает, что медленный запрос, но он простой. Что делать?

Простой запрос может быть медленным из-за отсутствия индекса, большого объёма таблицы, блокировок или неоптимального плана на стороне СУБД. Снимите план запроса средствами СУБД и проверьте технологический журнал на предмет ожиданий на блокировках.

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

Включите замер, проведите один документ в отладочном сеансе, остановите замер. В таблице найдите обработку проведения и вложенные вызовы — сортировка по чистому времени покажет, какие движения и запросы занимают основное время.

Влияет ли замер на работу пользователей?

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

Итог

Что важно запомнить

Замер производительности включается через «Отладка → Замер производительности», анализ ведётся по чистому времени и количеству вызовов. Чаще всего проблема — запросы в цикле и обращения к базе в переборах. Для проблем уровня СУБД дополняйте замер технологическим журналом, а эффект оптимизации проверяйте повторным прогоном без замера.