Отладка в 1С: точки останова и отладка на сервере
Отладчик в Конфигураторе позволяет остановить выполнение на нужной строке, посмотреть значения переменных и пройти код по шагам. С клиентским кодом всё просто, а вот серверный код в клиент-серверной базе, фоновые задания и HTTP-сервисы требуют дополнительной настройки. В статье — рабочие приёмы отладки, включение отладки на сервере 1С и разбор случаев, когда точка останова «не срабатывает».
Базовые приёмы отладки в Конфигураторе
Отладку запускает команда «Отладка → Начать отладку» (клавиша F5). Конфигуратор открывает клиент в режиме отладки, а выполнение останавливается там, где вы поставили точку останова клавишей F9. После остановки доступны шаги:
- Шаг с обходом (
F10) — выполнить строку целиком, не заходя в вызываемые процедуры. - Шаг с заходом (
F11) — войти внутрь вызываемой процедуры или функции. - Шаг с выходом (
Shift+F11) — выполнить текущую процедуру до конца и вернуться в вызывающий код. - Продолжить (
F5) — снять остановку и выполнять код дальше до следующей точки.
Значения видны прямо в отладчике: наведите курсор на переменную и увидите её значение, а для структур, таблиц значений и ссылок — раскрывающееся содержимое. Для постоянного наблюдения служит «Отладка → Табло»: добавьте в него выражения вроде Объект.Номер, Выборка.Количество() или ТаблицаТовары.Количество(), и они будут пересчитываться после каждого шага. Одноразовое вычисление выполняет «Отладка → Вычислить выражение»; в этом окне допустимы вызовы функций, а значит, можно проверить, что вернёт функция, не дописывая код. Есть и «стек вызовов»: он показывает цепочку процедур, приведшую к текущей строке, и позволяет переключиться на вызывающий контекст.
Точка останова с условием и остановка по ошибке
Если нужная строка выполняется тысячи раз, останавливаться на каждой итерации бессмысленно. Откройте свойства точки останова и задайте условие — выражение на встроенном языке. Например, для цикла по строкам документа:
// Условие точки останова внутри цикла Для Каждого Строка Из Объект.Товары Строка.Номенклатура.Артикул = "A-1042" // или остановка только на сотой итерации Строка.НомерСтроки = 100
Рядом с условием в свойствах обычно есть и счётчик проходов: отладчик пропустит заданное число срабатываний. Условие вычисляется при каждом проходе, поэтому на «тяжёлом» цикле оно немного замедляет выполнение; убирайте такие точки, когда они больше не нужны. Отдельно полезна остановка по ошибке — режим в меню «Отладка», при котором отладчик останавливается на строке, где возникло исключение, ещё до его обработки. Он незаменим, когда ошибка «теряется» внутри блока Попытка и пользователь видит только общее сообщение.
Замер производительности
Для поиска медленных мест не нужно угадывать: в Конфигураторе есть режим замера производительности («Отладка → Замер производительности», в разных версиях он может называться чуть иначе). После включения выполните сценарий в клиенте, затем остановите замер и откройте результат: по каждой строке модуля будет видно количество вызовов и время. Сортируя по времени, быстро находите строки с запросами и циклами, которые дороже остальных. Для точечной проверки в коде используйте разность моментов времени:
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
ПровестиДокументыПакетом();
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
ЗаписьЖурналаРегистрации("Замер.Проведение", УровеньЖурналаРегистрации.Информация, , ,
"Время, мс: " + Длительность);
Замер на рабочей базе включайте ненадолго: он добавляет накладные расходы.
Отладка на сервере 1С
В файловой базе серверный код выполняется в процессе самого клиента, поэтому точки останова в процедурах с &НаСервере работают без дополнительной настройки. В клиент-серверной базе серверный код исполняют рабочие процессы rphost, и отладчик подключается к ним через агент сервера. Для этого агент нужно запустить в режиме отладки, добавив ключ -debug.
Служба Windows
Агент работает как служба «Агент сервера 1С:Предприятия 8.3». Её команда запуска хранится в реестре, в разделе службы под ключом ImagePath: к строке запуска ragent.exe добавьте -debug и перезапустите службу. Остальные ключи (порты, каталог кластера) оставьте как были.
"C:\Program Files\1cv8\8.3.24.1548\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "D:\srvinfo" -debug
Ключ -debug включает протокол TCP/IP, а в связке с ключом -http агент работает в режиме HTTP-отладки; в этом случае нужно запустить сервер отладки dbgs.exe и указать его адрес и порт в настройках отладки. Точный набор ключей для HTTP-варианта зависит от релиза, проверяйте его по документации платформы. Для обычного локального сервера и сети без особых ограничений хватает режима TCP/IP.
Настройка в Конфигураторе
Параметры запуска и отладки находятся в окне настроек («Сервис → Параметры → Запуск 1С:Предприятия» — вкладка с протоколом отладки). Убедитесь, что выбранный протокол соответствует режиму агента. Затем откройте «Отладка → Подключение»: в окне перечислены предметы отладки — клиентское приложение, сервер 1С:Предприятия, фоновые задания и другие. Отметьте нужные и убедитесь, что они присоединены. Если сервер недоступен, проверьте брандмауэр: отладчик общается с агентом по его порту, а клиенты — с рабочими процессами в диапазоне портов кластера.
На рабочем сервере отладку лучше не держать включённой постоянно: пока подключён отладчик, остановка на точке блокирует поток выполнения для всех, кто попал в этот код. Делайте отладку на тестовой копии базы или на отдельном кластере.
Отладка фоновых заданий, HTTP-сервисов и расширений
- Фоновые задания и регламентные задания. Включите предмет отладки «Фоновое задание» в окне «Подключение». Отладчик присоединится в момент старта задания; точка останова должна стоять в процедуре, которую оно вызывает. Для регламентных заданий действует то же правило: на сервере должна быть включена отладка.
- HTTP-сервисы и веб-сервисы. Отладчик останавливается в обработчике сервиса, когда внешняя система делает запрос. Для клиент-серверной базы подключите предмет отладки «Сервер». Для файловой базы код сервиса исполняется в процессе веб-сервера, к которому нужно присоединиться; удобнее отлаживать сервис на сервере приложений. Как выглядит сам вызов, показано в статье про HTTP-запросы к REST API.
- Расширения. Точки останова ставятся в модулях расширения так же, как в основной конфигурации, но модуль расширения в отладчике открывается отдельно. Об установке расширений — в статье про расширения конфигурации.
- Внешние обработки. Откройте обработку в Конфигураторе и запустите её из той же отлаживаемой сессии: отладчик сопоставляет код по тексту модуля.
Почему не срабатывает точка останова
- Конфигурация базы не обновлена. Вы правили модуль, но не нажали «Обновить конфигурацию базы данных» (
F7), и в базе работает старый код. - Не включена отладка на сервере или не подключён предмет отладки «Сервер»: клиентские точки работают, серверные — нет.
- Точка стоит на строке, которая не исполняется: комментарий, объявление или строка внутри недостижимой ветки.
- Код выполняется в другом месте. Процедура вызывается в расширении, переопределена перехватом, или реальный вызов идёт в другой модуль.
- Версии отличаются: Конфигуратор и клиент разных релизов платформы либо база подключена к другому серверу.
- Мешает сеть: порт отладки закрыт брандмауэром, а режим TCP/IP не доходит до сервера.
- Клиент запущен вручную, а не командой «Начать отладку», и отладчик к нему не присоединён.
Типичные ошибки
- Оставлять включённой остановку по ошибке и забывать про неё: отладчик останавливается на ожидаемых исключениях.
- Отлаживать на рабочем кластере в рабочее время: остановка по точке задерживает других пользователей.
- Править код в расширении, а точку ставить в основном модуле, или наоборот.
- Забывать убрать условные точки и замер после работы.
- Подключать отладчик без проверки версии платформы клиента и сервера.
| Задача | Что использовать |
|---|---|
| Посмотреть значение переменной | Наведение курсора, табло, «Вычислить выражение» |
| Остановиться на нужной итерации | Точка останова с условием |
| Найти место выброса исключения | Остановка по ошибке |
| Найти медленные строки | Замер производительности |
| Отладить серверный код | Ключ -debug у ragent и предмет отладки «Сервер» |
Актуальность для новых версий
Принципы отладки одинаковы для всех релизов 8.3. Отладка по протоколу TCP/IP через агент сервера работает давно и остаётся режимом по умолчанию. Режим отладки по HTTP через отдельный сервер отладки (dbgs) появился в линейке 8.3 и пригодится там, где прямое TCP-соединение с сервером недоступно; точные параметры запуска сверяйте со справкой по вашему релизу. Расположение пунктов меню в Конфигураторе от релиза к релизу меняется незначительно.
Частые вопросы
Как включить отладку на сервере 1С?
Запустите агент сервера (ragent) с ключом -debug: для службы Windows добавьте его в параметры запуска службы и перезапустите её. Затем в Конфигураторе подключитесь к серверу через «Отладка → Подключение» и отметьте нужные предметы отладки.
Почему не срабатывает точка останова в серверном коде?
Типичные причины: сервер запущен без -debug, предмет отладки «Сервер» не подключён, конфигурация базы не обновлена после правки модуля, код выполняется в другом контексте или в расширении, а не в основном модуле.
Как поставить точку останова с условием?
Установите точку останова клавишей F9, откройте её свойства из меню «Отладка» и задайте выражение на встроенном языке в поле условия. Отладчик остановится только тогда, когда выражение равно Истина.
Можно ли отлаживать фоновое задание?
Да, если отладка на сервере включена, а в окне подключения отмечены фоновые задания как предмет отладки. Отладчик присоединится к заданию в момент его запуска и остановится на точке останова.