Отладка кода в 1С:Предприятии 8.3 — от первой точки останова до серверных вызовов

· 10 мин

Содержание

Отладчик в 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, Табло
Понять, кто вызвал процедуруОкно «Стек вызовов»
Поймать исключение в месте возникновенияОтладка → Остановка по ошибке
Найти медленные строкиОтладка → Замер производительности

Запуск отладки: файловая и клиент-серверная база

Файловая база

  1. Откройте базу в Конфигураторе.
  2. Если конфигурация изменена, сохраните её и обновите конфигурацию базы данных (F7). Иначе в отладке будет работать старый код, а точки останова не сработают.
  3. Нажмите F5 или выберите Отладка → Начать отладку → 1С:Предприятие.
  4. Откроется клиент с подключённой отладкой. Выполните в нём действие, код которого хотите проверить.

Ctrl+F5 запускает 1С:Предприятие без отладки — удобно, чтобы быстро проверить интерфейс, но точки останова в этом режиме не срабатывают.

В файловом варианте серверный код выполняется в процессе клиента, поэтому точки останова в процедурах &НаСервере срабатывают сразу, без дополнительных настроек.

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

Клиентский код отлаживается так же. Серверный — только если служба сервера 1С запущена с ключом отладки.

  1. Откройте свойства службы агента сервера 1С (ragent.exe) и посмотрите строку запуска.
  2. Добавьте ключ -debug. Для отладки по HTTP — -debug -http.
  3. Перезапустите службу.

Перезапуск службы сервера 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.

  1. Поставьте обычную точку останова.
  2. Откройте список точек останова и задайте для неё условие. Условие — выражение на встроенном языке, например Строка.Номенклатура.Код = "00-00000123" или НомерСтроки > 4990.
  3. Отладчик остановится только тогда, когда выражение истинно.

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

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

Если ошибка возникает «где-то в глубине», ставить точки наугад долго. Включите Отладка → Остановка по ошибке: отладчик остановится в той строке, где возникло исключение, даже если оно перехвачено блоком Попытка ... Исключение. В настройке можно указать текст ошибки, чтобы останавливаться только на нужной.

Пошаговое выполнение: 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 величинами: счётчиком цикла, текущей строкой, накопленной суммой.

💡 При отладке запроса добавьте в Табло Запрос.Текст и Запрос.Параметры — так видно, с какими параметрами он реально уходит в СУБД. Результат запроса удобно смотреть, вычислив РезультатЗапроса.Выгрузить().

Стек вызовов и разбор исключений

Стек вызовов

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

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

Стек отвечает на вопросы, которые иначе ищутся часами:

  • 🔍 откуда вызывается общая процедура, которая падает только «иногда»;
  • 🔍 какая подписка на событие или расширение вмешивается в типовую запись объекта;
  • 🔍 на какой стороне (клиент или сервер) сейчас выполняется код.

Обработка исключений

Код в блоке Попытка ... Исключение глотает ошибку, и пользователь видит только общий текст. Чтобы найти исходное место:

  1. Включите Отладка → Остановка по ошибке — остановка будет до передачи управления в блок Исключение.
  2. В самом блоке поставьте точку и вычислите ОписаниеОшибки() или ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) — второй вариант выводит стек и номер строки модуля.
  3. Если ошибка приходит из серверного кода, а остановки нет — проверьте, что отладка сервера включена (см. раздел о запуске).

Пример обработчика, который не скрывает подробности при отладке:

Попытка
	ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
	Инфо = ИнформацияОбОшибке();
	ЗаписьЖурналаРегистрации("Проведение документа",
		УровеньЖурналаРегистрации.Ошибка, , ,
		ПодробноеПредставлениеОшибки(Инфо));
	ВызватьИсключение;
КонецПопытки;

Здесь ошибка пишется в журнал регистрации с полным стеком и пробрасывается дальше командой ВызватьИсключение без параметров — исходное исключение не теряется.

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

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

  1. Сервер — предмет отладки (в клиент-серверной базе включён ключ -debug).
  2. Серверный предмет подключён к Конфигуратору.

Автоматическое подключение

Открыть Отладка → Подключение и включить автоматическое подключение для нужных типов предметов: сервер, фоновое задание, HTTP-сервис, веб-сервис, внешнее соединение. Без этого точки останова в таком коде просто проигнорируются.

Типичные сценарии:

  • ⏱ Регламентное задание. Включите автоподключение фоновых заданий, поставьте точку в процедуре метода задания и запустите задание вручную из списка регламентных заданий в клиенте.
  • 🔌 HTTP-сервис. Включите автоподключение HTTP-сервисов, поставьте точку в обработчике метода и пошлите запрос (например, через curl или Postman). Отладчик остановится, когда запрос дойдёт до базы.
  • 🧩 Внешняя обработка. Откройте её файл в Конфигураторе через Файл → Открыть, поставьте точки и запустите обработку в клиенте, подключённом к отладке, — из того же файла.

Что учесть с клиент-серверными вызовами

  • Значения переменных клиента на сервер не попадают — сервер видит только переданные параметры и данные формы. Если на сервере переменная «пустая», проверьте, передали ли вы её.
  • Каждый серверный вызов — сетевой обмен. Если при пошаговом проходе видно, что в цикле на клиенте вызывается &НаСервере, это кандидат на оптимизацию: собирайте данные одним вызовом.
  • Пока код стоит на точке останова, транзакция и управляемые блокировки удерживаются. Другие пользователи на этих данных будут ждать или получат ошибку блокировки.

Частые ошибки при отладке

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

Ещё несколько ловушек, которые не видны сразу:

  • ⛔ Отладка на рабочей базе. Остановленный серверный вызов держит блокировки, а пользователи видят «зависшую» программу. Отлаживайте на копии, выгруженной в .dt или скопированной средствами СУБД.
  • ⛔ Забытые точки останова. Конфигуратор хранит их между сеансами. Перед сдачей задачи откройте список точек (Alt+F9) и удалите лишние.
  • ⛔ Долгая остановка на точке. При длительной паузе клиент может разорвать соединение с сервером по таймауту. Изучили значения — продолжайте выполнение, не держите код на паузе десятки минут.
  • ⛔ Побочные эффекты в «Вычислить выражение». Вызов функции с записью в окне вычисления меняет данные. Один неудачный клик — и в базе появляется лишний документ.

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

Можно ли отлаживать код в 1С:EDT вместо Конфигуратора?
Да. В 1С:EDT отладка идёт по протоколу HTTP через тот же сервер отладки. Точки останова, пошаговое выполнение, просмотр переменных и стека там тоже есть, интерфейс — в стиле Eclipse.
Можно ли поменять код, пока выполнение стоит на точке останова?
Код в модуле можно править, но новые изменения начнут работать только после сохранения конфигурации и обновления базы данных. Обычно для этого отладку перезапускают.
Как отладить код в веб-клиенте?
Используйте отладку по протоколу HTTP. Запустите веб-клиент из Конфигуратора через меню отладки или передайте в адресе параметры подключения к серверу отладки, затем подключите предмет отладки в окне «Подключение».
Чем замер производительности отличается от отладки?
Отладка показывает логику выполнения и значения. Замер производительности запускается из меню «Отладка», считает, сколько раз выполнялась каждая строка и сколько времени она заняла. Он нужен, когда код работает правильно, но медленно.
Отладчик замедляет работу базы?
Включённая отладка на сервере немного увеличивает нагрузку, а остановленный на точке вызов держит блокировки. Поэтому на рабочем сервере отладку держат выключенной и включают только на тестовом.