Как поймать ошибку в расширении конфигурации отладчиком
Содержание
Отладить расширение конфигурации
в 1С 8.3 можно тем же отладчиком конфигуратора, что и основную конфигурацию: откройте расширение через Конфигурация → Расширения конфигурации, поставьте точку останова (F9) в его модуле и запустите Отладка → Начать отладку (F5). Если код выполняется на сервере в клиент-серверной базе, дополнительно нужен агент сервера, запущенный с ключом -debug.
Чаще всего проблема не в самом отладчике, а в том, что точка останова «молчит»: расширение не применено, серверный предмет отладки не подключён или в базе другая версия модуля.
Подготовка к отладке расширения: среда и запуск
Работать удобнее на копии базы. Отладчик сам ничего не меняет, но в процессе вы будете править код расширения и обновлять его в базе.
Что проверить до старта:
- ✅ Расширение есть в списке
Конфигурация → Расширения конфигурациии открывается двойным щелчком (откроется отдельное дерево с объектами расширения). - ✅ Флаг «Активно» включён. Неактивное расширение к сеансу не подключается, и его код не выполняется.
- ✅ Изменения сохранены в базу: в окне расширения
Конфигурация → Обновить конфигурацию базы данных(F7). Иначе пользователи и отладчик работают со старой версией модуля. - ✅ Платформа на рабочем месте разработчика той же версии, что и сервер, — иначе подключиться к серверу отладки не получится.
Если расширение загружали из файла .cfe прямо в пользовательском режиме (Все функции → Стандартные → Управление расширениями конфигурации), оно всё равно хранится в базе. Конфигуратор покажет его в общем списке, и отлаживать его можно точно так же.
Режим отладки: HTTP или TCP/IP
Начиная с платформы 8.3.7 есть два протокола. Режим выбирается в Сервис → Параметры → Запуск 1С:Предприятия, параметр «Отладка в режиме».
| Режим | Как работает | Когда выбирать |
|---|---|---|
| HTTP | Через отдельный сервер отладки dbgs.exe (по умолчанию порт 1550) | Основной вариант для современных релизов, нужен для EDT и удалённой отладки |
| TCP/IP | Прямое соединение отладчика с процессами | Старые привычки, совместимость со сценариями под ранние релизы |
В файловой базе ничего, кроме выбора режима, не нужно: серверный код выполняется в процессе клиента, и конфигуратор при F5 сам поднимает сервер отладки.
Запуск
- Откройте основную конфигурацию в конфигураторе (расширение откроется рядом, в своём окне).
- Нажмите
F5— запустится сеанс 1С:Предприятия, уже подключённый к отладчику. - Если конфигуратор спросит про обновление конфигурации базы данных, согласитесь: иначе в сеанс попадёт старая версия расширения.
Для подключения к уже работающему сеансу клиента его запускают с параметрами командной строки:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /IBName "Тестовая база" /DEBUG -http -attach /DEBUGGERURL http://localhost:1550
После этого сеанс появляется в окне Отладка → Подключение, откуда его можно подключить вручную.
Точки останова в модулях расширения
Точка останова ставится в модуле самого расширения, а не в заимствованном модуле основной конфигурации. Если процедура перехвачена аннотацией &Вместо, точка в исходной процедуре основной конфигурации может вообще не сработать: управление туда попадёт только через ПродолжитьВызов().
Где ставить точку в зависимости от аннотации:
| Аннотация | Куда ставить | Что увидите |
|---|---|---|
&Перед | В процедуру расширения | Остановка до кода типовой процедуры |
&После | В процедуру расширения | Остановка после типовой процедуры, данные уже изменены ею |
&Вместо | В процедуру расширения и, при необходимости, на строку с ПродолжитьВызов() | Типовой код выполнится, только если вызов продолжен |
&ИзменениеИКонтроль | В изменённый фрагмент внутри процедуры расширения | Выполняется копия типовой процедуры с вашими вставками |
Основные приёмы
- 🔴
F9— поставить или снять точку на текущей строке. - 📋
Отладка → Список точек останова(Alt+F9) — все точки по всем модулям, включая модули расширения. Отсюда же их можно временно выключить, не удаляя. - 🎯 Точка с условием — ставится через контекстное меню строки. Условие пишется на встроенном языке, например
Номенклатура.Код = "00-00000123". Незаменимо, когда процедура вызывается в цикле на тысячах строк, а падает на одной. - 🧯 Остановка по ошибке —
Отладка → Остановка по ошибке. Отладчик встанет на строке, где возникло исключение, даже если оно перехвачено вПопытка … Исключение. Можно задать фрагмент текста ошибки, чтобы не останавливаться на «чужих» исключениях типовой конфигурации.
Точку останова нельзя поставить на пустую строку, комментарий или строку с объявлением переменной — отладчик сдвинет её или проигнорирует. Ставьте на исполняемый оператор.
Значения переменных и контекст выполнения
Когда выполнение остановилось, жёлтая стрелка показывает текущую строку. Дальше работают три инструмента.
Окно «Локальные» (Отладка → Локальные). Показывает все переменные текущей процедуры, включая параметры. Для аннотации &После здесь удобно сравнить, что вернула типовая процедура и что вы с этим делаете.
Табло (Отладка → Табло). Сюда добавляют выражения, которые нужно видеть на каждом шаге: ЭтотОбъект.Товары.Количество(), Отказ, ТекущаяДата(). Значения обновляются при каждой остановке.
Вычислить выражение (Shift+F9). Позволяет выполнить произвольное выражение в контексте остановки. Пример: проверить, что вернёт запрос, не дописывая код.
// В окне «Вычислить выражение»:
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 10 Ссылка, Наименование ИЗ Справочник.Номенклатура");
Запрос.Выполнить().Выгрузить()
Результат типа ТаблицаЗначений открывается в отдельном окне со строками и колонками.
Выражения в «Вычислить выражение» выполняются по-настоящему. Вызов Записать() или Удалить() в этом окне изменит данные базы. На рабочей базе так проверять нельзя.
Пошаговое выполнение
| Клавиша | Команда | Зачем |
|---|---|---|
F11 | Шагнуть в | Зайти внутрь вызываемой процедуры, в том числе типовой |
F10 | Шагнуть через | Выполнить строку целиком, не заходя в вызовы |
Shift+F11 | Шагнуть из | Досчитать текущую процедуру и вернуться к вызывающей |
Ctrl+F10 | Идти до курсора | Выполнить код до строки, где стоит курсор |
F5 | Продолжить | Выполнять до следующей точки останова |
Стек вызовов: откуда пришла ошибка
Стек открывается через Отладка → Стек вызовов (Ctrl+Alt+C). Верхняя строка — текущая процедура, ниже — те, что её вызвали.
Для расширений стек особенно полезен: в нём видно, где управление переходит из основной конфигурации в расширение и обратно. Строки модулей расширения отмечены его именем, поэтому легко отличить свой код от типового.
Как искать источник ошибки:
- Включите остановку по ошибке и воспроизведите проблему.
- Откройте стек и пройдите снизу вверх: найдите первую строку из вашего расширения.
- Двойной щелчок по строке стека переносит в этот модуль, а окно «Локальные» показывает переменные именно того уровня.
- Проверьте параметры на границе «типовой код → расширение». Чаще всего ошибка там: расширение ожидает заполненный реквизит, а типовая процедура в этом сценарии его не заполнила.
Если в стеке нет ни одной строки расширения, а ошибка появилась только после его установки, ищите не процедуры, а изменённые объекты: новые реквизиты, переопределённые формы, изменённые свойства заимствованных объектов. Такие проблемы отладчик по шагам не покажет.
Отладка на сервере и клиент-серверные вызовы
В клиент-серверной базе код с директивами &НаСервере, &НаСервереБезКонтекста, модули объектов, проведение и обработчики подписок выполняются в рабочем процессе rphost. Чтобы отладчик туда попал, нужны два условия.
1. Агент сервера запущен в режиме отладки
В свойствах службы агента сервера 1С в строку запуска добавляют ключ -debug (для HTTP-отладки — -debug -http). Строка хранится в реестре, параметр ImagePath службы в разделе HKLM\SYSTEM\CurrentControlSet\Services:
"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"
После изменения службу нужно перезапустить.
Перезапуск агента обрывает все сеансы пользователей на этом сервере. Делайте это вне рабочего времени или на тестовом сервере. На рабочем сервере держать отладку постоянно включённой не стоит: это лишняя нагрузка и доступ к коду для любого, у кого есть конфигуратор и сетевой доступ.
2. Серверный предмет отладки подключён
Откройте Отладка → Подключение, кнопка «Автоматическое подключение». Отметьте типы предметов отладки, которые нужно подключать сразу: клиент, сервер, фоновые задания, внешнее соединение. Если нужен код регламентного задания или длительной операции в фоне, без отметки фоновых заданий отладчик в них не зайдёт.
Переходы между клиентом и сервером
- 🔁 Шаг
F11на вызове серверной процедуры из&НаКлиентепереводит отладку на сервер, если серверный предмет подключён. Иначе вызов выполняется целиком без остановки. - 📦 В
&НаСервереБезКонтекстанет данных формы: в «Локальных» видны только параметры. Если в расширении туда передаютОбъект, это ошибка — данные формы надо передавать явно. - 🧭 Каждый серверный вызов — отдельный проход по сети. Если в форме расширения при отладке видно, что сервер вызывается в цикле по строкам, это и есть причина медленной работы. Здесь поможет
Отладка → Замер производительности: он покажет время и количество выполнений по строкам, в том числе в модулях расширения.
Журнал регистрации и технологический журнал
Отладчик неудобен, когда ошибка воспроизводится только у пользователя, на рабочей базе или раз в день. Тогда расширение должно само оставлять следы.
Записи в журнал регистрации из расширения
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ЗаписьЖурналаРегистрации("Расш1.ПередЗаписью",
УровеньЖурналаРегистрации.Информация,
ЭтотОбъект.Метаданные(),
Ссылка,
СтрШаблон("Режим записи: %1, отказ: %2", РежимЗаписи, Отказ));
КонецПроцедуры
Для перехвата исключений в &Вместо:
&Вместо("ЗаполнитьТабличнуюЧасть")
Процедура Расш1_ЗаполнитьТабличнуюЧасть(Параметры)
Попытка
ПродолжитьВызов(Параметры);
Исключение
ЗаписьЖурналаРегистрации("Расш1.Ошибка",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
ВызватьИсключение без параметров передаёт исходную ошибку дальше: пользователь увидит то же сообщение, что и без расширения, а в журнале останется подробный текст со стеком.
Смотрят записи в пользовательском режиме (Администрирование → Обслуживание → Журнал регистрации в типовых на БСП) или в конфигураторе через Администрирование → Журнал регистрации. Фильтруйте по имени события: префикс с именем расширения (Расш1.) сразу отделяет ваши записи от типовых.
Технологический журнал
Если ошибка возникает на сервере и до вашего кода дело не доходит, включают технологический журнал. Он настраивается файлом logcfg.xml в каталоге conf платформы на сервере. Для поиска исключений хватает события EXCP:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\techlog" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
Платформа подхватывает файл без перезапуска службы, через минуту-другую. Не оставляйте журнал включённым надолго: на нагруженном сервере он быстро занимает гигабайты. Собрали лог — удалите файл или настройку.
Почему отладка расширения не срабатывает
Самый частый вопрос: точка стоит, а отладчик проходит мимо. Разберите симптом по списку.
Расширение с включённым безопасным режимом отлаживается так же, как обычное. Но вызовы, запрещённые в безопасном режиме (работа с файлами, COM, внешние компоненты), упадут с ошибкой уже при выполнении — отладчик покажет её на строке вызова.