Как отлаживать код в 1С 8.3: запуск отладчика, шаги и поиск причины ошибки
Содержание
Отладка в Конфигураторе 1С запускается клавишей F5 или командой Отладка → Начать отладку: платформа открывает базу в режиме 1С:Предприятия, а Конфигуратор становится отладчиком. Ставите точку останова F9 на нужной строке, повторяете действие пользователя — и выполнение замирает. Дальше идёте по коду шагами F10/F11, смотрите значения переменных и стек вызовов, пока не найдёте ошибку.
Способов поиска ошибки несколько. Точка останова хороша, когда вы знаете, в каком модуле искать. «Остановка по ошибке» — когда знаете только текст исключения. Стек вызовов отвечает на вопрос «кто это вызвал». А замер производительности нужен, когда код не падает, а просто долго работает.
Как включить отладку в Конфигураторе: файловая и клиент-серверная база
Для файловой базы ничего настраивать не нужно. Откройте Конфигуратор, нажмите F5 — запустится клиент с подключённым отладчиком. Клиентский и серверный код в файловом варианте отлаживаются сразу.
Перед запуском платформа сравнивает основную конфигурацию с конфигурацией базы. Если вы правили модули и не обновили базу, появится вопрос об обновлении. Отказаться можно, но тогда отлаживаться будет старый код, а точки останова в изменённых местах не сработают.
Перед отладкой полезно проверить синтаксис модуля: Ctrl+F7 в открытом модуле. Синтаксическая ошибка не даст запустить отладку там, где вы её ждёте.
Клиент-серверная база
В клиент-серверном варианте серверный код выполняется в рабочих процессах кластера. Чтобы отладчик мог к ним подключиться, сервер 1С должен быть запущен в режиме отладки.
- Откройте на сервере редактор реестра или свойства службы агента сервера 1С:Предприятия.
- Найдите строку запуска
ragent.exe(параметрImagePathслужбы в веткеHKLM\SYSTEM\CurrentControlSet\Services). - Добавьте в конец ключ
-debug. Для отладки по протоколу HTTP —-debug -http. - Перезапустите службу агента сервера.
"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 или Поле объекта не обнаружено (Контрагент), а где именно падает — неизвестно.
- Откройте
Отладка → Остановка по ошибке. - Включите остановку. При желании задайте фрагмент текста ошибки, например
Поле объекта не обнаружено, чтобы отладчик не вставал на каждое исключение. - Повторите действие пользователя.
Отладчик встанет на строке, где возникло исключение, ещё до перехода в блок Исключение. Это важно: ошибки, которые код «глотает» через Попытка … Исключение, обычной отладкой не видны, а так их можно поймать.
Список точек останова
Отладка → Список точек останова (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 через Администрирование → Выгрузить информационную базу в Конфигураторе.
Двигайтесь от ошибки назад
- Включите «Остановку по ошибке» с фрагментом текста исключения.
- Повторите действие — отладчик встанет на месте падения.
- Откройте стек вызовов и найдите уровень, где появилось неверное значение.
- Поставьте точку останова с условием на этом уровне и запустите заново.
Так вы не читаете тысячи строк кода, а сразу оказываетесь рядом с причиной.
Медленный код — к замеру производительности
Если ошибки нет, но документ проводится минуту, точки останова не помогут. Включите Отладка → Замер производительности, выполните действие и остановите замер. Получите список строк с числом вызовов и долей времени. Строка, которая заняла 70% времени и вызвана 5 000 раз, почти всегда оказывается запросом внутри цикла.
Когда отладчик подключить нельзя
На рабочем сервере, где перезапуск службы недопустим, отладчик часто не вариант. Тогда помогают:
- 📝 запись в журнал регистрации из кода:
ЗаписьЖурналаРегистрации("Отладка.Проведение", УровеньЖурналаРегистрации.Информация, , , Строка(Сумма)); - 📝 временный вывод
Сообщить()в клиентском контексте — только на копии, в рабочую конфигурацию такое не оставляют; - 📝 технологический журнал платформы — для поиска исключений и долгих запросов на сервере.
Частые вопросы
Можно ли отлаживать без Конфигуратора?
-debug -http, а в файловом варианте — запуск клиента с параметрами отладки из EDT.Можно ли изменить код и продолжить отладку без перезапуска?
Почему в стеке вызовов нет некоторых процедур?
Видно ли пользователям, что их сеанс отлаживают?
Сколько точек останова можно поставить?
Alt+F9.