Как отлаживать код в 1С 8.3: запуск отладчика, шаги и поиск причины ошибки

· 10 мин

Содержание

Отладка в Конфигураторе 1С запускается клавишей F5 или командой Отладка → Начать отладку: платформа открывает базу в режиме 1С:Предприятия, а Конфигуратор становится отладчиком. Ставите точку останова F9 на нужной строке, повторяете действие пользователя — и выполнение замирает. Дальше идёте по коду шагами F10/F11, смотрите значения переменных и стек вызовов, пока не найдёте ошибку.

Способов поиска ошибки несколько. Точка останова хороша, когда вы знаете, в каком модуле искать. «Остановка по ошибке» — когда знаете только текст исключения. Стек вызовов отвечает на вопрос «кто это вызвал». А замер производительности нужен, когда код не падает, а просто долго работает.

Как включить отладку в Конфигураторе: файловая и клиент-серверная база

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

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

Перед отладкой полезно проверить синтаксис модуля: Ctrl+F7 в открытом модуле. Синтаксическая ошибка не даст запустить отладку там, где вы её ждёте.

Клиент-серверная база

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

  1. Откройте на сервере редактор реестра или свойства службы агента сервера 1С:Предприятия.
  2. Найдите строку запуска ragent.exe (параметр ImagePath службы в ветке HKLM\SYSTEM\CurrentControlSet\Services).
  3. Добавьте в конец ключ -debug. Для отладки по протоколу HTTP — -debug -http.
  4. Перезапустите службу агента сервера.
"C:\Program Files\1cv8\8.3.24.1548\bin\ragent.exe" -debug -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"

Номер версии и пути в примере — условные, берите свою строку и только дописывайте -debug.

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

Протокол отладки: TCP или HTTP

Начиная с платформы 8.3.7 есть отладка по HTTP через отдельный сервер отладки (dbgs.exe, по умолчанию порт 1550). Именно её использует 1С:EDT, и она удобнее при работе через сеть и брандмауэр. Протокол выбирается в параметрах Конфигуратора (Сервис → Параметры, раздел про отладку). На сервере протоколу должен соответствовать ключ запуска агента: для HTTP — -debug -http.

Запуск клиента с разрешённой отладкой

Если клиент запущен не из Конфигуратора, к нему всё равно можно подключиться. Для этого сеанс должен разрешать отладку: клиент запускают с ключом /DEBUG в командной строке или ставят в параметрах Конфигуратора флажок, который устанавливает режим разрешения отладки при запуске 1С:Предприятия.

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

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

Вид точкиКак поставитьКогда нужна
ОбычнаяF9 на строкеЗнаете, где искать
С условиемКонтекстное меню строки → точка останова с условиемЦикл на 10 000 строк, а ошибка на одной
ОтключённаяЧерез список точек остановаВременно не мешает, но не потерялась
Остановка по ошибкеОтладка → Остановка по ошибкеЗнаете только текст исключения

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

Условие — обычное выражение встроенного языка, которое возвращает Истина или Ложь. Отладчик остановится, только когда оно истинно. Пример для цикла по товарам документа:

Для Каждого СтрокаТЧ Из Товары Цикл
	СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена; // точка останова здесь
КонецЦикла;

Условие СтрокаТЧ.НомерСтроки = 147 остановит выполнение ровно на 147-й строке. Условие СтрокаТЧ.Цена = 0 — на первой строке без цены. Без условия пришлось бы нажимать «Продолжить» сотню раз.

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

Это самый быстрый способ, когда пользователь прислал скриншот вида Деление на 0 или Поле объекта не обнаружено (Контрагент), а где именно падает — неизвестно.

  1. Откройте Отладка → Остановка по ошибке.
  2. Включите остановку. При желании задайте фрагмент текста ошибки, например Поле объекта не обнаружено, чтобы отладчик не вставал на каждое исключение.
  3. Повторите действие пользователя.

Отладчик встанет на строке, где возникло исключение, ещё до перехода в блок Исключение. Это важно: ошибки, которые код «глотает» через Попытка … Исключение, обычной отладкой не видны, а так их можно поймать.

Список точек останова

Отладка → Список точек останова (Alt+F9) показывает все точки во всех модулях. Отсюда их отключают, удаляют и редактируют условия. Перед сдачей работы загляните сюда: забытая точка в общем модуле будет останавливать каждый следующий сеанс отладки.

Пошаговое выполнение кода при отладке

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

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

Как ходить по коду без потерь времени

  • 🔹 На строке с вызовом типовой процедуры БСП жмите F10, а не F11. Иначе уйдёте на десятки уровней в служебный код.
  • 🔹 Зашли не туда — Shift+F11 вернёт к месту вызова.
  • 🔹 Хотите пропустить длинный цикл — поставьте курсор на строку после КонецЦикла и нажмите Shift+F10.
  • 🔹 Шаг на строке &НаСервере из клиентской процедуры переводит отладку на сервер. В клиент-серверной базе это сработает только при сервере в режиме отладки.

Табло и «Вычислить выражение»: смотрим значения переменных

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

Подсказка под курсором

Наведите мышь на переменную в коде — всплывёт её текущее значение. Для простых типов этого хватает.

Вычислить выражение

Shift+F9 открывает окно, куда можно вписать любое выражение: Объект.Товары.Итог("Сумма"), ТипЗнч(Значение), Запрос.Текст. Для коллекций, структур и таблиц значений окно показывает содержимое с раскрытием по уровням.

Удобный приём для запросов: остановитесь после Запрос.Выполнить() и вычислите РезультатЗапроса.Выгрузить(). Увидите итоговую таблицу целиком, со всеми колонками.

Выражение действительно выполняется. Если вписать вызов функции, которая пишет в базу или меняет объект, она это сделает. Вычисляйте только то, что читает данные.

Табло

Отладка → Табло (Ctrl+Alt+W) — список выражений, за которыми нужно следить постоянно. Добавили СтрокаТЧ.Сумма и ИтогоПоДокументу — и на каждом шаге видите, как они меняются. Табло сохраняется между остановками, поэтому его удобно держать открытым при пошаговом проходе цикла.

Стек вызовов: откуда пришёл вызов

Отладка → Стек вызовов (Ctrl+Alt+C) показывает цепочку процедур, которая привела к текущей строке. Сверху — текущая процедура, ниже — та, что её вызвала, и так до самого события: нажатия кнопки, записи документа, обработчика подписки.

Чем это полезно:

  • 📌 Ошибка в общем модуле, который вызывают из двадцати мест. Стек сразу скажет, из какого документа и обработчика пришли.
  • 📌 Подписка на событие срабатывает «сама». Стек покажет, что её запустила запись в обработчике ПередЗаписью.
  • 📌 Двойной щелчок по строке стека открывает модуль на месте вызова. Переменные в «Вычислить выражение» показываются для выбранного уровня — можно посмотреть параметры, с которыми процедуру вызвали.

Стек особенно выручает в типовых конфигурациях. Код проведения документа в БП 3.0 проходит через несколько общих модулей, и найти, где сформировалось неправильное значение, проще снизу вверх по стеку, чем чтением модулей.

Отладка сервера, фоновых заданий и внешних обработок

Не весь код выполняется в сеансе, который вы запустили по F5. Фоновые задания, регламентные задания, HTTP-сервисы и веб-сервисы работают в своих сеансах. Для них есть окно Отладка → Подключение.

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

В окне «Подключение» видны предметы отладки — клиентские и серверные сеансы, которые разрешили отладку. Выберите нужный и подключитесь. Так можно отладить сеанс, запущенный не из этого Конфигуратора, например на компьютере коллеги.

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

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

Внешние обработки и отчёты

Точки останова в файле .epf или .erf работают, если открыть в Конфигураторе тот же файл, который запускает пользователь (Файл → Открыть). Ставите точку в модуле обработки, а в 1С:Предприятии открываете этот же файл. Если пользователь запускает копию из другой папки или обработка загружена в справочник дополнительных обработок, сопоставление может не сработать. Тогда выгрузите обработку в файл и отлаживайте её отдельно.

Расширения конфигурации

Код расширений отлаживается так же, как основной. Точки останова ставятся в модулях расширения, перед запуском расширение должно быть обновлено в базе. Если перехват метода работает не так, как ожидалось, пройдите шагами F11 от вызова: увидите, сработала ли аннотация &Перед, &После или &Вместо.

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

Самая частая жалоба при отладке — «поставил точку, а он проскакивает». Причин немного, и проверяются они быстро.

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

Как быстрее находить ошибку в коде 1С

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

Сначала воспроизведите на копии

Отлаживайте на копии рабочей базы, а не на ней самой. Шаги по коду проведения документа реально проводят документ, а прерванная отладка может оставить данные в промежуточном состоянии. Копию проще всего сделать выгрузкой в .dt через Администрирование → Выгрузить информационную базу в Конфигураторе.

Двигайтесь от ошибки назад

  1. Включите «Остановку по ошибке» с фрагментом текста исключения.
  2. Повторите действие — отладчик встанет на месте падения.
  3. Откройте стек вызовов и найдите уровень, где появилось неверное значение.
  4. Поставьте точку останова с условием на этом уровне и запустите заново.

Так вы не читаете тысячи строк кода, а сразу оказываетесь рядом с причиной.

Медленный код — к замеру производительности

Если ошибки нет, но документ проводится минуту, точки останова не помогут. Включите Отладка → Замер производительности, выполните действие и остановите замер. Получите список строк с числом вызовов и долей времени. Строка, которая заняла 70% времени и вызвана 5 000 раз, почти всегда оказывается запросом внутри цикла.

Когда отладчик подключить нельзя

На рабочем сервере, где перезапуск службы недопустим, отладчик часто не вариант. Тогда помогают:

  • 📝 запись в журнал регистрации из кода: ЗаписьЖурналаРегистрации("Отладка.Проведение", УровеньЖурналаРегистрации.Информация, , , Строка(Сумма));
  • 📝 временный вывод Сообщить() в клиентском контексте — только на копии, в рабочую конфигурацию такое не оставляют;
  • 📝 технологический журнал платформы — для поиска исключений и долгих запросов на сервере.
Перед тем как сдать исправление
Выполнено: 0 / 5

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

Можно ли отлаживать без Конфигуратора?
Да. 1С:EDT имеет свой отладчик и работает по HTTP-отладке. Для этого на сервере нужен режим -debug -http, а в файловом варианте — запуск клиента с параметрами отладки из EDT.
Можно ли изменить код и продолжить отладку без перезапуска?
Нет. После правки модуля нужно обновить конфигурацию базы данных и запустить сеанс отладки заново. Изменения не применяются к уже выполняющемуся коду.
Почему в стеке вызовов нет некоторых процедур?
Если модуль конфигурации поставляется без исходного текста, отладчик не покажет его код. Такое бывает у защищённых модулей тиражных решений.
Видно ли пользователям, что их сеанс отлаживают?
При остановке на точке у пользователя «замирает» программа: окно не реагирует, пока разработчик не продолжит выполнение. Поэтому подключаться к чужим рабочим сеансам без предупреждения нельзя.
Сколько точек останова можно поставить?
Жёсткого ограничения на практике нет. Но каждая лишняя точка в общем модуле замедляет отладку, поэтому держите только нужные и чистите список через Alt+F9.