Отладчик 1С 8.3: от первой точки останова до замера производительности

· 9 мин

Содержание

Отладка в 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. Отладчик должен подключиться к серверным предметам отладки — сеансам, которые выполняются в рабочих процессах.

Порядок действий:

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

Фоновые задания и регламентные

Регламентное задание выполняется в отдельном сеансе без интерфейса. Чтобы его отладить, включите в автоматическом подключении фоновые задания, поставьте точку останова в процедуре задания и запустите его вручную (например, из консоли заданий или обработки в режиме 1С:Предприятия). Ждать расписания не нужно.

HTTP- и веб-сервисы

Код HTTP-сервиса вызывается извне, через веб-сервер. Его тоже отлаживают через автоматическое подключение: отметьте нужный тип предмета, отправьте запрос из Postman или curl — отладчик остановится на точке в модуле сервиса.

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

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

Отладчик отвечает не только на вопрос «почему неправильно», но и на «почему медленно». Для этого есть Отладка → Замер производительности.

Как пользоваться:

  1. Включите замер в Конфигураторе во время сеанса отладки.
  2. Выполните медленную операцию: проведите документ, сформируйте отчёт.
  3. Выключите замер. Откроется результат: список строк кода с числом выполнений и временем.

Что смотреть в результате:

КолонкаО чём говорит
Кол-воСколько раз выполнилась строка. Тысячи раз в цикле — повод задуматься
ВремяСколько ушло на строку вместе с вызовами внутри
Чистое времяВремя самой строки без вложенных вызовов
%Доля в общем времени замера

Сортируйте по проценту и начинайте сверху. Частые находки:

  • 🐢 запрос внутри цикла: 2 000 итераций по 5 мс дают 10 секунд, хотя один пакетный запрос отработал бы за доли секунды;
  • 🐢 обращение через точку к реквизитам ссылки в цикле (Строка.Номенклатура.Артикул) — каждое такое обращение может читать объект из базы;
  • 🐢 серверный вызов из клиентского кода внутри цикла — каждый вызов идёт по сети.

Когда замера мало

Замер показывает только код встроенного языка. Если по нему всё быстро, а операция всё равно долгая, причина глубже: ожидание на блокировках, план запроса в СУБД, нехватка ресурсов сервера. Тогда нужен технологический журнал с событиями TLOCK, TTIMEOUT, DBMSSQL или Центр управления производительностью из инструментов КИП. Начинайте всё равно с замера: часто проблема в двух строках кода.

Почему отладчик не останавливается на точке останова

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

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

Ещё две причины, которые сложно заметить:

  • 🔒 модуль защищён или поставлен без исходного текста — по такому коду отладчик не останавливается;
  • 🧩 процедура переопределена в расширении через &Вместо — исходный код основной конфигурации не выполняется, точку нужно ставить в расширении.

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

Можно ли отлаживать без Конфигуратора?
Да, в 1С:EDT есть свой отладчик. Он работает только по протоколу HTTP через сервер отладки, поэтому протокол в базе должен быть HTTP.
Замедляет ли ключ -debug работу сервера?
Да, сервер с включённой отладкой работает медленнее, особенно при подключённых предметах отладки. На рабочих серверах ключ держат выключенным и включают на время разбора проблемы.
Можно ли отладить базу на чужом компьютере?
Можно через HTTP-отладку: удалённый клиент запускают с адресом вашего сервера отладки в ключе /DEBUGGERURL. Порт сервера отладки должен быть открыт в сети.
Почему в окне выражения пишет «Переменная не определена»?
Переменная вне текущего контекста: она объявлена в другой процедуре или на другой стороне (клиент/сервер). Перейдите на нужный уровень в стеке вызовов.
Как отладить код в модуле приложения при запуске?
Поставьте точку останова в обработчике «ПередНачаломРаботыСистемы» или «ПриНачалеРаботыСистемы» и запустите отладку через F5 — отладчик подключается до выполнения этих обработчиков.