Отладчик 1С 8.3: от первой точки останова до замера производительности
Содержание
Отладка в 1С работает так: Конфигуратор запускает сеанс 1С:Предприятия и подключается к нему, а платформа останавливает код на строке с точкой останова. Начать проще всего клавишей F5 (Отладка → Начать отладку) и точкой останова на нужной строке модуля (F9). В момент остановки видны значения переменных, стек вызовов, можно шагать по коду построчно.
Типичная ситуация: бухгалтер жалуется, что доработанная печатная форма выводит не ту сумму. Читать сотни строк кода и гадать долго. С отладчиком это пять минут: ставите точку останова в процедуре заполнения макета, открываете документ и смотрите, откуда берётся число. Ниже по порядку: режимы отладчика, управление выполнением, просмотр данных, серверная отладка и поиск медленных мест.
Как включить режим отладки в 1С
Отладчик встроен в Конфигуратор, отдельно ставить ничего не нужно. Для файловой базы достаточно открыть Конфигуратор
и нажать F5. Платформа сама запустит клиента с ключом отладки и подключит его.
Каким клиентом запускать, выбирают в подменю Отладка → Начать отладку: тонкий клиент, толстый клиент, веб-клиент. Режим по умолчанию для F5 задаётся в Сервис → Параметры → Запуск 1С:Предприятия.
Протокол отладки: TCP или HTTP
С версии 8.3.7 в платформе два механизма отладки:
| Протокол | Как работает | Когда выбирать |
|---|---|---|
| TCP/IP | Отлаживаемые процессы связываются с Конфигуратором напрямую | Старые релизы платформы, простые файловые базы |
| HTTP | Работает через сервер отладки dbgs, по умолчанию порт 1550 | Клиент-серверные базы, удалённая отладка, отладка из 1С:EDT |
Протокол для текущей базы выбирают в Конфигураторе: Сервис → Параметры → Отладка. Там же указывают адрес сервера отладки, если он не локальный. Для новых проектов разумно сразу брать HTTP: он стабильнее работает через сеть и нужен для отладки из EDT.
Если запускаете клиента вручную (например, ярлыком), ключ отладки добавляют в командную строку. Для HTTP-отладки это /DEBUG -http -attach /DEBUGGERURL "http://localhost:1550". Адрес меняется на адрес вашего сервера отладки.
Что меняется в клиент-серверной базе
Серверный код в клиент-серверном варианте выполняется в рабочих процессах кластера, а не на машине разработчика. Чтобы его можно было отлаживать, агент сервера 1С должен работать с ключом -debug. Для HTTP-протокола добавляют ещё -http.
Ключ прописывают в строке запуска службы агента (ragent.exe). Фрагмент выглядит примерно так:
"C:\Program Files\1cv8\8.3.xx.xxxx\bin\ragent.exe" -debug -http -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
Номер версии, порты и путь к каталогу кластера берите из своей текущей строки, меняйте только ключи отладки.
После правки строки запуска службу «Агент сервера 1С:Предприятия» нужно перезапустить. Перезапуск оборвёт сеансы всех пользователей на этом сервере — делайте это вне рабочего времени и предупредите людей заранее.
Точки останова и пошаговое выполнение
Точка останова — это метка на строке модуля. Когда выполнение доходит до неё, платформа замораживает сеанс и передаёт управление Конфигуратору.
Основные действия:
- 🔴
F9— поставить или снять точку останова на текущей строке; - 📋
Отладка → Список точек останова— все точки в конфигурации, их можно временно отключать, не удаляя; - ❓ точка останова с условием — ставится из контекстного меню строки; останов произойдёт, только если выражение вернёт
Истина; - 🚨
Отладка → Остановка по ошибке— отладчик остановится на строке, где возникло исключение, даже без точки останова.
Условная точка экономит время в циклах. Допустим, ошибка возникает на 4 000-й строке табличной части. Ставить обычную точку и нажимать «Продолжить» тысячи раз бессмысленно. Условие ТекСтрока.НомерСтроки = 4000 остановит код ровно там, где нужно.
Остановку по ошибке удобно включать, когда пользователь присылает текст сообщения, а где оно возникает, непонятно. В настройке можно задать фильтр по тексту ошибки, чтобы отладчик не реагировал на исключения, которые штатно перехватываются в Попытка … Исключение.
Управление ходом выполнения
После остановки код можно вести вручную:
| Клавиша | Действие | Зачем |
|---|---|---|
F11 | Шагнуть в | Зайти внутрь вызываемой процедуры или функции |
F10 | Шагнуть через | Выполнить строку целиком, не заходя в вызовы |
Shift+F11 | Шагнуть из | Доработать текущую процедуру и вернуться в вызывающий код |
F5 | Продолжить | Работать до следующей точки останова |
Есть и команда «Идти до курсора» в меню Отладка: выполнение продолжится до строки, где стоит курсор. Это быстрый способ пропустить длинный цикл, не ставя лишнюю точку.
Пока сеанс стоит на точке останова, окно 1С:Предприятия не отвечает. Это нормально: пользовательский сеанс ждёт команду отладчика. Не закрывайте его через диспетчер задач — нажмите F5 или завершите отладку.
Как смотреть значения переменных во время отладки
Остановка без просмотра данных мало что даёт. В отладчике 1С три инструмента для этого.
Вычисление выражения
Shift+F9 открывает окно «Выражение». В нём вычисляют что угодно в контексте текущей строки: переменную, реквизит объекта, вызов функции, запрос.
Примеры выражений:
Объект.Контрагент.ИНН— значение реквизита ссылочного поля;Товары.Количество()— число строк в таблице значений;Товары.Итог("Сумма")— сумма по колонке;ТипЗнч(Результат)— тип значения, если не ясно, что вернула функция.
Коллекции (таблицы значений, массивы, структуры) раскрываются в дереве. Таблицу значений удобнее смотреть кнопкой просмотра в отдельном окне — видно все колонки сразу.
Табло
Табло (Отладка → Табло) — список выражений, которые пересчитываются на каждом шаге. Сюда добавляют переменные, за которыми следите постоянно: счётчик цикла, текущую сумму, ссылку на документ. Шагаете по коду и видите, на какой строке значение стало неправильным.
Локальные переменные
Окно Отладка → Локальные показывает все переменные текущей процедуры без ручного ввода. Полезно, когда процедура чужая и вы ещё не знаете, какие в ней переменные.
Вычисление выражения с вызовом функции действительно выполняет эту функцию. Если функция пишет в базу, отправляет письмо или меняет объект, вы сделаете это по-настоящему. На рабочей базе вычисляйте только чтение данных.
Стек вызовов и контекст выполнения
Стек вызовов (Отладка → Стек вызовов) показывает цепочку: какая процедура вызвала текущую, кто вызвал ту, и так до события формы или обработчика подписки.
Чем это полезно на практике:
- 🔍 видно, через какой общий модуль пришёл вызов, если процедура вызывается из десятка мест;
- 🔍 видно, на клиенте или на сервере идёт выполнение: переход
&НаКлиенте → &НаСервереотражается в стеке; - 🔍 двойной щелчок по строке стека переносит в этот модуль и переключает контекст — табло и окно выражения начинают показывать переменные того уровня.
Последний пункт часто упускают. Допустим, функция получила неверный параметр. Не надо ставить новую точку останова в вызывающем коде и повторять сценарий. Достаточно перейти на уровень выше в стеке и посмотреть, из чего параметр был собран.
Расширения и подписки на события
Код расширений отлаживается так же, как основная конфигурация: точку ставят в модуле расширения. В стеке вызовов при этом видно, отработал ли перехват метода и в каком порядке.
Если обработчик подписки на событие «не срабатывает», поставьте точку останова в его первой строке и запишите объект. Не остановился — проверьте состав источников подписки и то, что процедура объявлена в общем модуле с нужными флагами компиляции.
Отладка серверного кода и фоновых заданий
В клиент-серверной базе мало запустить отладку клавишей F5. Отладчик должен подключиться к
серверным предметам отладки — сеансам, которые выполняются в рабочих процессах.
Порядок действий:
- Убедитесь, что агент сервера запущен с ключом
-debug(раздел выше). - В Конфигураторе откройте
Отладка → Подключение. Окно показывает доступные предметы отладки: клиентские и серверные сеансы. - Нажмите «Автоматическое подключение» и отметьте типы предметов: клиент, сервер, фоновые задания, HTTP-сервисы, веб-сервисы — то, что нужно для задачи.
- Запустите отладку или воспроизведите сценарий — точки останова в серверном коде начнут срабатывать.
Фоновые задания и регламентные
Регламентное задание выполняется в отдельном сеансе без интерфейса. Чтобы его отладить, включите в автоматическом подключении фоновые задания, поставьте точку останова в процедуре задания и запустите его вручную (например, из консоли заданий или обработки в режиме 1С:Предприятия). Ждать расписания не нужно.
HTTP- и веб-сервисы
Код HTTP-сервиса вызывается извне, через веб-сервер. Его тоже отлаживают через автоматическое подключение: отметьте нужный тип предмета, отправьте запрос из Postman или curl — отладчик остановится на точке в модуле сервиса.
Серверная отладка на рабочей базе — риск. Пока серверный вызов стоит на точке останова, он держит блокировки данных, и другие пользователи могут получить ожидание на блокировке. Отлаживайте на копии базы; на рабочей — только по согласованию и в нерабочие часы.
Замер производительности: где тормозит код
Отладчик отвечает не только на вопрос «почему неправильно», но и на «почему медленно». Для этого есть Отладка → Замер производительности.
Как пользоваться:
- Включите замер в Конфигураторе во время сеанса отладки.
- Выполните медленную операцию: проведите документ, сформируйте отчёт.
- Выключите замер. Откроется результат: список строк кода с числом выполнений и временем.
Что смотреть в результате:
| Колонка | О чём говорит |
|---|---|
| Кол-во | Сколько раз выполнилась строка. Тысячи раз в цикле — повод задуматься |
| Время | Сколько ушло на строку вместе с вызовами внутри |
| Чистое время | Время самой строки без вложенных вызовов |
| % | Доля в общем времени замера |
Сортируйте по проценту и начинайте сверху. Частые находки:
- 🐢 запрос внутри цикла: 2 000 итераций по 5 мс дают 10 секунд, хотя один пакетный запрос отработал бы за доли секунды;
- 🐢 обращение через точку к реквизитам ссылки в цикле (
Строка.Номенклатура.Артикул) — каждое такое обращение может читать объект из базы; - 🐢 серверный вызов из клиентского кода внутри цикла — каждый вызов идёт по сети.
Когда замера мало
Замер показывает только код встроенного языка. Если по нему всё быстро, а операция всё равно долгая, причина глубже: ожидание на блокировках, план запроса в СУБД, нехватка ресурсов сервера. Тогда нужен технологический журнал с событиями TLOCK, TTIMEOUT, DBMSSQL или Центр управления производительностью из инструментов КИП. Начинайте всё равно с замера: часто проблема в двух строках кода.
Почему отладчик не останавливается на точке останова
Самая частая жалоба: точка стоит, сценарий выполняется, а остановки нет. Причины перебирайте по порядку.
Ещё две причины, которые сложно заметить:
- 🔒 модуль защищён или поставлен без исходного текста — по такому коду отладчик не останавливается;
- 🧩 процедура переопределена в расширении через
&Вместо— исходный код основной конфигурации не выполняется, точку нужно ставить в расширении.