Отладка кода в 1С:Предприятии 8.3 — от первой точки останова до серверных вызовов
Содержание
Отладчик в 1С запускается из Конфигуратора клавишей F5 (меню Отладка → Начать отладку): платформа открывает 1С:Предприятие, подключённое к отладке, и останавливает выполнение кода на точках останова, которые вы поставили клавишей F9. Дальше вы идёте по строкам (F10, F11), смотрите значения переменных и стек вызовов — и видите, где именно код делает не то, что задумано.
Работает это так: среда разработки (Конфигуратор или 1С:EDT) и выполняемый код общаются через сервер отладки. В файловой базе он не требует настройки. В клиент-серверной базе серверный код можно отлаживать только после того, как отладку включили на сервере 1С. Именно на этом шаге чаще всего и застревают.
Как устроен отладчик 1С и что он умеет
Отладчик — часть Конфигуратора, отдельной программы ставить не нужно. Он подключается к предметам отладки — процессам, где реально выполняется код:
- 🖥 толстый и тонкий клиент;
- 🌐 веб-клиент;
- ⚙️ сервер (серверные процедуры, модули объектов, общие модули с флагом «Сервер»);
- ⏱ фоновые и регламентные задания;
- 🔌 HTTP- и веб-сервисы, внешнее соединение.
С платформы 8.3.7 появилась отладка по протоколу HTTP: среда разработки и предметы отладки подключаются к серверу отладки dbgs. Старый протокол TCP тоже остаётся, но для работы через интернет
, с веб-клиентом и с 1С:EDT нужен HTTP.
Что можно делать в отладке:
| Задача | Инструмент |
|---|---|
| Остановиться на строке | Точка останова (F9) |
| Остановиться при условии | Точка останова с условием |
| Пройти код по шагам | F10, F11, Shift+F11 |
| Узнать значение | Подсказка над переменной, Shift+F9, Табло |
| Понять, кто вызвал процедуру | Окно «Стек вызовов» |
| Поймать исключение в месте возникновения | Отладка → Остановка по ошибке |
| Найти медленные строки | Отладка → Замер производительности |
Запуск отладки: файловая и клиент-серверная база
Файловая база
- Откройте базу в Конфигураторе.
- Если конфигурация изменена, сохраните её и обновите конфигурацию базы данных (
F7). Иначе в отладке будет работать старый код, а точки останова не сработают. - Нажмите
F5или выберитеОтладка → Начать отладку → 1С:Предприятие. - Откроется клиент с подключённой отладкой. Выполните в нём действие, код которого хотите проверить.
Ctrl+F5 запускает 1С:Предприятие без отладки — удобно, чтобы быстро проверить интерфейс, но точки останова в этом режиме не срабатывают.
В файловом варианте серверный код выполняется в процессе клиента, поэтому точки останова в процедурах &НаСервере срабатывают сразу, без дополнительных настроек.
Клиент-серверная база
Клиентский код отлаживается так же. Серверный — только если служба сервера 1С запущена с ключом отладки.
- Откройте свойства службы агента сервера 1С (
ragent.exe) и посмотрите строку запуска. - Добавьте ключ
-debug. Для отладки по HTTP —-debug -http. - Перезапустите службу.
Перезапуск службы сервера 1С обрывает все сеансы пользователей во всех базах кластера. Делайте это вне рабочего времени и предупредите людей заранее. На рабочем сервере отладку лучше не включать вообще — отлаживайте на копии базы.
Пример строки запуска агента с отладкой по HTTP (пути и порты у вас будут свои):
"C:\Program Files\1cv8\8.3.24.1548\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug -http
Протокол в Конфигураторе должен совпадать с протоколом на сервере. Он выбирается в Сервис → Параметры, на вкладке отладки.
Подключение к уже запущенному клиенту
Отладку можно включить и в клиенте, который запустили не из Конфигуратора. Для этого клиенту передают параметр командной строки /DEBUG, а для HTTP — ещё и адрес сервера отладки, например:
1cv8c.exe /IBName "Бухгалтерия копия" /DEBUG -http /DEBUGGERURL "http://localhost:1550"
Порт 1550 — порт сервера отладки по умолчанию. Затем в Конфигураторе откройте Отладка → Подключение: в списке появится этот предмет отладки, подключите его.
Точки останова: обычные, с условием и остановка по ошибке
Точка останова — красный кружок слева от строки. Выполнение замирает перед выполнением этой строки.
Как поставить и снять
- 🔴 Установите курсор на строку и нажмите
F9— точка появится. ПовторноеF9её уберёт. - 🖱 Можно дважды щёлкнуть по серому полю слева от текста модуля.
- 📋 Список всех точек в конфигурации —
Отладка → Список точек останова(Alt+F9). Отсюда их удобно отключать, не удаляя, и переходить к нужной строке.
Ставьте точку на строку с кодом. На пустой строке, комментарии или строке Процедура ... остановки не будет — платформа перенесёт точку или проигнорирует её.
Точка с условием
Нужна, когда процедура вызывается сотни раз, а интересует один случай. Например, цикл по 5000 строкам табличной части, а ошибка — только на номенклатуре с кодом 00-00000123.
- Поставьте обычную точку останова.
- Откройте список точек останова и задайте для неё условие. Условие — выражение на встроенном языке, например
Строка.Номенклатура.Код = "00-00000123"илиНомерСтроки > 4990. - Отладчик остановится только тогда, когда выражение истинно.
💡 Условие вычисляется на каждой итерации, поэтому сложный запрос в условии заметно замедлит цикл. Держите условие простым.
Остановка по ошибке
Если ошибка возникает «где-то в глубине», ставить точки наугад долго. Включите Отладка → Остановка по ошибке: отладчик остановится в той строке, где возникло исключение, даже если оно перехвачено блоком Попытка ... Исключение. В настройке можно указать текст ошибки, чтобы останавливаться только на нужной.
Пошаговое выполнение: F10, F11 и другие клавиши
Когда код остановился, текущая строка подсвечивается стрелкой. Дальше управляете вы.
| Клавиша | Команда | Что происходит |
|---|---|---|
F11 | Шагнуть в | Выполняет строку; если в ней вызов процедуры, заходит внутрь неё |
F10 | Шагнуть через | Выполняет строку целиком, вызов процедуры — как одно действие |
Shift+F11 | Шагнуть из | Дорабатывает текущую процедуру и останавливается в месте вызова |
Shift+F10 | Идти до курсора | Выполняет код до строки, где стоит курсор |
F5 | Продолжить | Работает до следующей точки останова |
Как выбирать между F10 и F11:
- ➡️
F10— когда вызываемая процедура проверенная (типовая, библиотечная) и нужен только её результат. - ⬇️
F11— когда подозреваете, что ошибка внутри вызова. Зайдя в типовой общий модуль, быстро выходитеShift+F11, чтобы не утонуть в БСП.
Пример. В обработке проведения документа есть строка:
СуммаСкидки = РассчитатьСкидку(Строка.Сумма, ПроцентСкидки);
Нажмёте F10 — увидите готовое значение СуммаСкидки. Нажмёте F11 — окажетесь в первой строке функции РассчитатьСкидку и сможете посмотреть, как считается каждая промежуточная величина.
Shift+F10 экономит время в длинных циклах: поставьте курсор на первую строку после КонецЦикла и нажмите — цикл отработает без остановок.
Значения переменных: подсказка, «Вычислить выражение», Табло
Быстрый взгляд
Наведите курсор на переменную в остановленном модуле — во всплывающей подсказке появится её значение. Для простых типов (число, строка, дата, булево) этого хватает.
Окно «Вычислить выражение» (Shift+F9)
Выделите переменную или выражение и нажмите Shift+F9. В окне видно:
- значение и тип;
- для объектов, структур и коллекций — раскрывающееся дерево свойств;
- для таблицы значений — можно открыть её содержимое и посмотреть строки и колонки.
В поле выражения можно написать что угодно на встроенном языке: ТабличнаяЧасть.Итог("Сумма"), Запрос.Текст, СтрДлина(Комментарий). Это быстрый способ проверить гипотезу, не меняя код.
Выражение действительно выполняется. Если вычислить функцию, которая пишет в базу (например, вызвать Записать() у объекта), запись произойдёт. В «Вычислить выражение» используйте только функции, которые ничего не меняют.
Табло
Табло (Отладка → Табло) — окно, куда кладут выражения для постоянного наблюдения. Значения пересчитываются после каждого шага. Удобно следить сразу за 3–5 величинами: счётчиком цикла, текущей строкой, накопленной суммой.
💡 При отладке запроса добавьте в Табло Запрос.Текст и Запрос.Параметры — так видно, с какими параметрами он реально уходит в СУБД. Результат запроса удобно смотреть, вычислив РезультатЗапроса.Выгрузить().
Стек вызовов и разбор исключений
Стек вызовов
Окно Отладка → Стек вызовов показывает цепочку процедур, которая привела к текущей строке. Сверху — текущая процедура, ниже — та, что её вызвала, и так до самого начала: обработчика кнопки, события формы, обработки проведения.
Двойной щелчок по строке стека открывает модуль на месте вызова. Значения переменных при этом показываются для выбранного уровня — можно посмотреть, с какими параметрами вызвали процедуру уровнем выше.
Стек отвечает на вопросы, которые иначе ищутся часами:
- 🔍 откуда вызывается общая процедура, которая падает только «иногда»;
- 🔍 какая подписка на событие или расширение вмешивается в типовую запись объекта;
- 🔍 на какой стороне (клиент или сервер) сейчас выполняется код.
Обработка исключений
Код в блоке Попытка ... Исключение глотает ошибку, и пользователь видит только общий текст. Чтобы найти исходное место:
- Включите
Отладка → Остановка по ошибке— остановка будет до передачи управления в блокИсключение. - В самом блоке поставьте точку и вычислите
ОписаниеОшибки()илиПодробноеПредставлениеОшибки(ИнформацияОбОшибке())— второй вариант выводит стек и номер строки модуля. - Если ошибка приходит из серверного кода, а остановки нет — проверьте, что отладка сервера включена (см. раздел о запуске).
Пример обработчика, который не скрывает подробности при отладке:
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Инфо = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Проведение документа",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(Инфо));
ВызватьИсключение;
КонецПопытки;
Здесь ошибка пишется в журнал регистрации с полным стеком и пробрасывается дальше командой ВызватьИсключение без параметров — исходное исключение не теряется.
Отладка серверного кода, фоновых заданий и сервисов
Код формы постоянно переходит между клиентом и сервером: процедура &НаКлиенте вызывает &НаСервере, та — общий модуль, тот — модуль менеджера. Отладчик ведёт вас через эту границу, но только при двух условиях:
- Сервер — предмет отладки (в клиент-серверной базе включён ключ
-debug). - Серверный предмет подключён к Конфигуратору.
Автоматическое подключение
Открыть Отладка → Подключение и включить автоматическое подключение для нужных типов предметов: сервер, фоновое задание, HTTP-сервис, веб-сервис, внешнее соединение. Без этого точки останова в таком коде просто проигнорируются.
Типичные сценарии:
- ⏱ Регламентное задание. Включите автоподключение фоновых заданий, поставьте точку в процедуре метода задания и запустите задание вручную из списка регламентных заданий в клиенте.
- 🔌 HTTP-сервис. Включите автоподключение HTTP-сервисов, поставьте точку в обработчике метода и пошлите запрос (например, через
curlили Postman). Отладчик остановится, когда запрос дойдёт до базы. - 🧩 Внешняя обработка. Откройте её файл в Конфигураторе через
Файл → Открыть, поставьте точки и запустите обработку в клиенте, подключённом к отладке, — из того же файла.
Что учесть с клиент-серверными вызовами
- Значения переменных клиента на сервер не попадают — сервер видит только переданные параметры и данные формы. Если на сервере переменная «пустая», проверьте, передали ли вы её.
- Каждый серверный вызов — сетевой обмен. Если при пошаговом проходе видно, что в цикле на клиенте вызывается
&НаСервере, это кандидат на оптимизацию: собирайте данные одним вызовом. - Пока код стоит на точке останова, транзакция и управляемые блокировки удерживаются. Другие пользователи на этих данных будут ждать или получат ошибку блокировки.
Частые ошибки при отладке
Ещё несколько ловушек, которые не видны сразу:
- ⛔ Отладка на рабочей базе. Остановленный серверный вызов держит блокировки, а пользователи видят «зависшую» программу. Отлаживайте на копии, выгруженной в
.dtили скопированной средствами СУБД. - ⛔ Забытые точки останова. Конфигуратор хранит их между сеансами. Перед сдачей задачи откройте список точек (
Alt+F9) и удалите лишние. - ⛔ Долгая остановка на точке. При длительной паузе клиент может разорвать соединение с сервером по таймауту. Изучили значения — продолжайте выполнение, не держите код на паузе десятки минут.
- ⛔ Побочные эффекты в «Вычислить выражение». Вызов функции с записью в окне вычисления меняет данные. Один неудачный клик — и в базе появляется лишний документ.