Отладчик 1С 8.3: точки останова, шаги и замер кода

· 10 мин

Содержание

В файловой базе отладку включать не нужно: откройте конфигуратор и нажмите F5 (Отладка → Начать отладку), и клиент 1С:Предприятия запустится уже подключённым к отладчику. В клиент-серверной базе сначала разрешите отладку на сервере: агент ragent должен работать с ключом -debug, иначе серверный код отладчик не увидит.

Дальше всё одинаково для обоих вариантов. Ставите точку останова на строке (F9), выполняете действие в клиенте, код останавливается, и вы идёте по нему шагами, смотрите значения переменных и вычисляете выражения. Всё описанное ниже относится к платформе 8.3 и работает в любой конфигурации: БП, ЗУП, УТ или собственной разработке.

Подготовка: что проверить перед запуском отладки в конфигураторе

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

Перед первым запуском:

  1. ✅ Сохраните изменения и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Если забудете, при F5 конфигуратор сам предложит обновить базу .
  2. ✅ Работайте в копии базы, а не в рабочей. Отладчик останавливает выполнение кода, а пользователь в остановленном сеансе видит «зависшую» программу.
  3. ✅ Проверьте, какой клиент будет запускаться. Это задаётся в Сервис → Параметры → Запуск 1С:Предприятия: тонкий, толстый или веб-клиент. Обычные формы отлаживают в толстом клиенте, управляемые — в тонком.
  4. ✅ У пользователя, под которым запускаете отладку, должны быть права на нужные объекты. Для отладки удобнее роль с полными правами.

Не подключайте отладчик к рабочей базе в рабочее время. Сработавшая точка останова на сервере держит сеанс пользователя, а с ним и транзакцию с блокировками. Остальные пользователи начнут ждать.

Два протокола отладки

С платформы 8.3.7 отладчик умеет работать по двум протоколам. Протокол выбирают в параметрах конфигуратора (Сервис → Параметры, группа настроек отладки).

ПротоколКак устроенКогда выбирать
TCP/IPКонфигуратор напрямую соединяется с предметами отладкиСтарые платформы, простая файловая база на своём компьютере
HTTPВсе предметы отладки подключаются к серверу отладки dbgs.exe, конфигуратор — к нему жеОтладка через сеть, мобильная платформа, расширения, работа в EDT

Для повседневной работы в файловой базе разницы почти нет. HTTP удобнее, когда клиент, сервер 1С и конфигуратор стоят на разных машинах: открыть нужно один порт сервера отладки, по умолчанию 1550.

Как включить режим отладки на сервере 1С

В клиент-серверном варианте серверные процедуры (&НаСервере, общие модули с флагом «Сервер», обработчики проведения) выполняются рабочими процессами кластера. Пока кластер запущен без отладки, точки останова в этом коде просто игнорируются.

Порядок включения на Windows:

  1. Откройте редактор реестра и найдите службу агента сервера 1С: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\, раздел со службой вида 1C:Enterprise 8.3 Server Agent.
  2. В параметре ImagePath после пути к ragent.exe и ключа -srvc допишите -debug. Для HTTP-отладки — -debug -http.
  3. Перезапустите службу агента сервера.

Пример строки ImagePath после правки:

"C:\Program Files\1cv8\8.3.24.1342\bin\ragent.exe" -debug -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"

Номер версии и порты в вашей строке будут свои: меняйте только ключ отладки, остальное оставьте как было.

Перезапуск службы агента обрывает сеансы всех пользователей всех баз этого кластера. Делайте это вечером или в согласованное окно.

На Linux ключ -debug добавляют в параметры запуска ragent в unit-файле службы или в скрипте запуска, затем перечитывают конфигурацию systemd и перезапускают службу.

💡 Держать -debug на рабочем сервере постоянно не стоит. Это лишняя нагрузка и риск, что кто-то подключится отладчиком к рабочей базе. Правильнее иметь отдельный тестовый кластер с включённой отладкой.

Запуск клиента с ключами отладки

Если клиент нужно запустить вне конфигуратора, например с ярлыка у тестировщика, используйте параметры командной строки 1cv8.exe:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"srv1c\buh_test" /N"Админ" /Debug /DebuggerURL "tcp://pc-developer"

Ключ /Debug переводит клиент в режим отладки, /DebuggerURL указывает, к какому отладчику подключаться. Для HTTP-отладки адрес начинается с http:// и указывает на сервер отладки с его портом.

Подключение предметов отладки

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

В этом окне два режима работы:

  • 🔌 Ручное подключение. Выбираете предмет из списка (например, сеанс конкретного пользователя на тестовой базе) и нажимаете «Подключить».
  • ⚙️ Автоматическое подключение. Кнопка «Автоматическое подключение» открывает список типов: клиент, сервер, фоновое задание, веб-сервис, HTTP-сервис и другие. Отмеченные типы подключаются сами, как только появляются.

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

Точки останова: обычные, с условием и отключённые

Точка останова ставится на строку модуля клавишей F9 или двойным щелчком по полю слева от текста. Строка подсвечивается, слева появляется красный кружок. Повторное F9 убирает точку.

Ставить её можно только на исполняемую строку. На комментарий, пустую строку или объявление Перем она не встанет либо не сработает.

Точка останова с условием

Когда процедура вызывается в цикле тысячу раз, а интересует одна итерация, обычная точка останова бесполезна. Нужна точка с условием: щёлкните строку правой кнопкой и выберите «Точка останова с условием». Условие пишется на встроенном языке, например:

Строка.Номенклатура.Код = "00-00000154" И Строка.Количество > 100

Отладчик остановится только тогда, когда выражение вернёт Истина. Условие вычисляется в контексте этой строки, поэтому доступны все её локальные переменные.

Управление списком точек

  • 📋 Отладка → Список точек останова показывает все точки во всех модулях. Отсюда к любой можно перейти, отключить её или удалить.
  • ⏸️ Отключённая точка остаётся на месте, но не срабатывает. Удобно, когда точку нужно временно «выключить», не теряя место.
  • 🧹 Из того же списка удаляют все точки разом, когда отладка закончена.

Остановка по ошибке

Бывает, что непонятно, где именно падает код: пользователь видит ошибку, а модулей десятки. Включите Отладка → Остановка по ошибке. Отладчик остановится на той строке, где возникло исключение, ещё до того, как ошибку увидит пользователь.

В окне настроек можно задать фрагмент текста ошибки, тогда остановка будет только по нужному исключению. И можно решить, останавливаться ли на ошибках внутри Попытка … Исключение: в типовых конфигурациях таких перехваченных ошибок много, и без фильтра отладчик будет останавливаться слишком часто.

Пошаговое выполнение кода и навигация

Когда выполнение остановилось, текущая строка отмечается стрелкой. Дальше управляете клавишами:

ДействиеКлавишаЧто происходит
Шагнуть вF11Выполняет строку; если в ней вызов процедуры, заходит внутрь
Шагнуть черезF10Выполняет строку целиком, не заходя в вызываемые процедуры
Шагнуть изShift+F11Дорабатывает текущую процедуру и останавливается в месте вызова
Идти до курсораCtrl+F10Выполняет код до строки, где стоит курсор
ПродолжитьF5Работает до следующей точки останова
Завершить отладкуShift+F5Закрывает отлаживаемый клиент

Практический приём: на первом проходе идите через F10, чтобы увидеть, на какой строке результат становится неправильным. Затем поставьте точку на эту строку и на втором проходе зайдите внутрь через F11.

Стек вызовов

Окно Отладка → Стек вызовов показывает цепочку: какая процедура вызвала текущую, кто вызвал ту, и так до обработчика формы или события. Двойной щелчок по строке стека переносит в соответствующий модуль, и там можно посмотреть локальные переменные вызывающей процедуры.

Это самый быстрый способ разобраться в типовой конфигурации: остановились в общем модуле и по стеку видите, из какой формы и какой команды пришёл вызов.

Анализ переменных и выражений

Когда код стоит на точке останова, значения можно смотреть тремя способами.

Подсказка при наведении. Задержите курсор над переменной в тексте модуля, и рядом появится её значение. Для простых типов этого хватает.

Окно «Локальные». Отладка → Локальные показывает все переменные текущей процедуры. Коллекции и объекты раскрываются по «плюсу»: можно увидеть строки таблицы значений, реквизиты документа, свойства структуры.

Вычисление выражения. Shift+F9 открывает окно, куда пишется любое выражение встроенного языка:

Выборка.Количество()
ТаблицаТоваров.Итог("Сумма")
ЗначениеЗаполнено(Объект.Контрагент)

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

Табло

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

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

Вычисление выражения выполняет код по-настоящему. Если вычислить ДокументОбъект.Записать() или вызвать процедуру, которая пишет в базу, запись произойдёт. В отладке на копии базы это не страшно, на рабочей — недопустимо.

Отладка серверного кода и замер производительности

Серверный код в клиент-серверной базе отлаживается так же, как клиентский, при двух условиях: кластер запущен с -debug и в автоматическом подключении отмечен сервер. Точки останова в процедурах с &НаСервере и в модулях объектов срабатывают в обычном режиме.

Особенности серверной отладки:

  • 🔒 Пока код стоит на точке останова внутри транзакции (например, при проведении документа), блокировки держатся. Не оставляйте отладчик на паузе надолго.
  • 📦 Код регламентных и фоновых заданий отлаживается только при подключённом предмете «фоновое задание». Чтобы не ждать расписания, запускайте процедуру задания вручную из консоли заданий или из обработки.
  • 🌐 HTTP- и веб-сервисы отлаживаются через публикацию на веб-сервере: подключение типа «HTTP-сервис» или «Веб-сервис» отмечают в автоматическом подключении.
  • 🧩 Код расширений отлаживается так же, точки ставят прямо в модулях расширения.

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

Если код работает правильно, но медленно, точки останова не помогут. Включите Отладка → Замер производительности, выполните медленную операцию в клиенте и снова выключите замер.

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

  • 🐢 запрос внутри цикла: строка выполнилась 5 000 раз и заняла 80% времени;
  • 🐢 обращение к реквизиту ссылки через точку в цикле, которое неявно читает объект из базы;
  • 🐢 вызов сервера из клиентского цикла: каждый вызов — отдельный обмен с сервером.

Двойной щелчок по строке результата открывает её в модуле. Результаты замера можно сохранить в файл и сравнить с замером после оптимизации.

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

Почему отладка не срабатывает: ошибки и решения

Большинство проблем с отладчиком сводится к тому, что код выполняется не там, где вы ждёте, или не в той версии конфигурации.

Диагностика: выберите симптом

Ещё одна частая ловушка — точка внутри ветки #Если Сервер Тогда или #Если Клиент Тогда. Код в такой ветке существует только в одном контексте, и если процедура вызвана в другом, строки просто нет.

Частые вопросы

Можно ли отлаживать рабочую базу?
Технически да, если сервер запущен с -debug. Но точка останова держит сеанс и блокировки, поэтому отлаживать стоит копию базы, а на рабочей — только в нерабочее время.
Чем отладка в конфигураторе отличается от отладки в EDT?
Механизм отладки у платформы один. EDT работает только по HTTP-протоколу через сервер отладки, а конфигуратор поддерживает и TCP/IP, и HTTP.
Как отладить чужой сеанс пользователя?
Откройте «Отладка → Подключение», найдите в списке предметов отладки нужный сеанс этой базы и подключитесь вручную. На сервере должна быть включена отладка.
Можно ли менять код во время отладки?
Править текст модуля можно, но выполняться будет старая версия. Чтобы изменения заработали, сохраните конфигурацию, обновите базу и перезапустите отлаживаемый клиент.
Почему отладка тормозит работу сервера?
Ключ -debug заставляет рабочие процессы собирать отладочную информацию. На тестовом сервере это незаметно, на нагруженном рабочем даёт лишнюю нагрузку, поэтому постоянно его не держат.