Отладчик 1С 8.3 на практике: от точки останова до технологического журнала

· 10 мин

Содержание

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

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

СимптомИнструментГде включается
Ошибка с текстом и номером строкиОстановка по ошибке, стек вызововМеню Отладка в Конфигураторе
Неверный результат расчётаТочки останова, «Вычислить выражение»F9, Shift+F9
Долгое проведение, медленный отчётЗамер производительностиОтладка → Замер производительности
Ошибка только у пользователей, нерегулярноЖурнал регистрации, технологический журналРежим 1С:Предприятие, файл logcfg.xml
Ожидание на блокировке, взаимоблокировкиТехнологический журнал (события TLOCK, TTIMEOUT, TDEADLOCK)Файл logcfg.xml на сервере

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

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

В файловом варианте отладка работает сразу. Откройте Конфигуратор, при необходимости откройте конфигурацию (Конфигурация → Открыть конфигурацию) и нажмите F5. Запустится клиент 1С:Предприятия, уже подключённый к отладчику. Серверный код в файловой базе выполняется в том же процессе, поэтому точки останова в модулях объектов и общих модулях срабатывают без дополнительных настроек.

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

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

Порядок такой:

  1. Откройте редактор реестра и найдите службу агента сервера: ветка HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services, раздел службы 1С:Предприятия 8.3.
  2. В параметре ImagePath после пути к ragent.exe и его параметров допишите -debug -http.
  3. Перезапустите службу агента сервера.
  4. В Конфигураторе откройте Сервис → Параметры, вкладку отладки, и проверьте, что выбран протокол HTTP.

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

Пример строки запуска службы после правки:

"C:\Program Files\1cv8\8.3.24.1586\bin\ragent.exe" -debug -http -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"

Номер версии и пути возьмите из своей исходной строки, меняйте только ключи отладки.

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

Подключение к уже запущенному сеансу

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

Чтобы сеанс сразу попадал в отладчик, его запускают с ключом командной строки:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S "srv1c\buh" /DEBUG -http /DEBUGGERURL "http://localhost:1550"

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

Точки останова и пошаговое выполнение кода

Точку останова ставят на строке модуля клавишей F9 или двойным щелчком по левому полю. Повторное нажатие снимает её. Все точки базы собраны в списке Отладка → Список точек останова: там их можно временно отключить, не удаляя.

Клавиши, без которых отладка в 1С 8.3 не обходится:

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

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

Если ошибка возникает на 4 317-й строке табличной части, жать F5 четыре тысячи раз никто не будет. Поставьте точку останова с условием: в меню Отладка выберите точку останова с условием и впишите выражение, например:

Стр.Номенклатура.Код = "00-00001234" ИЛИ Стр.Сумма < 0

Отладчик остановится только на той итерации, где условие истинно. Этот приём экономит больше всего времени при разборе циклов по документам и регистрам.

Условие вычисляется на каждом проходе. В цикле на сотни тысяч строк выполнение заметно замедлится. Сначала сузьте выборку, потом ставьте условие.

Отладка внешней обработки и расширения

Внешнюю обработку (.epf) отлаживают так: откройте файл в Конфигураторе через Файл → Открыть, поставьте точки останова в модуле формы или объекта и откройте тот же файл в запущенном под отладкой сеансе. Точки сработают, если путь к файлу совпадает.

Код расширения конфигурации отлаживается так же, как основная конфигурация. Откройте расширение в Конфигураторе, поставьте точки и запускайте отладку.

Как смотреть значения переменных и выражений

В точке останова есть три способа увидеть данные.

  • 🔍 Подсказка при наведении. Наведите курсор на переменную в модуле, и Конфигуратор покажет значение. Удобно для чисел и строк.
  • 🧮 «Вычислить выражение» (Shift+F9). Можно ввести любое выражение: Объект.Товары.Количество(), Выборка.Сумма * 1.2, ЗначениеЗаполнено(Контрагент). Таблицы значений и коллекции разворачиваются деревом.
  • 📌 Табло. Выражения, которые нужно видеть на каждом шаге, добавьте в табло (окно открывается из меню Отладка). Значения пересчитываются после каждого шага.

Что проверять в первую очередь

  1. Тип значения. Частая причина ошибки: ожидали ссылку, а пришла строка или Неопределено. В окне вычисления выражения видна колонка с типом.
  2. Пустые ссылки. Выражение Ссылка.Пустая() сразу показывает, заполнен ли реквизит.
  3. Результат запроса. Чтобы увидеть, что вернул запрос, вычислите Запрос.Выполнить().Выгрузить(). Таблица откроется целиком, с колонками.
  4. Параметры запроса. Вычислите Запрос.Параметры и проверьте даты. Дата 01.01.0001 вместо периода — частая причина пустого отчёта.

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

Значения простых переменных в окне вычисления можно изменить и продолжить выполнение. Так проверяют гипотезу «если бы здесь было 0, всё бы сработало» без правки кода.

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

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

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

Что даёт стек вызовов на практике:

  • 📍 видно, клиентский это вызов или серверный: граница &НаКлиенте → &НаСервере в стеке видна явно;
  • 🔁 видно рекурсию: одна и та же процедура повторяется много раз подряд;
  • 🧩 видно, что вызов пришёл из подписки на событие или из расширения, а не из модуля объекта, где вы искали.

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

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

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

Поиск медленного кода и блокировок

Замер производительности

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

Как читать результат:

  • ⏱ сортируйте по проценту времени, смотрите первые 5–10 строк;
  • 🔁 большое число выполнений у строки с запросом значит, что запрос стоит внутри цикла; его выносят из цикла и получают данные одним запросом;
  • 🗂 строка с обращением через точку (Стр.Номенклатура.ЕдиницаИзмерения.Наименование) в цикле — неявный запрос к базе на каждой итерации.

Двойной щелчок по строке замера открывает её в модуле. Результат можно сохранить и потом сравнить с замером после исправления.

Блокировки и взаимоблокировки

Ошибка с текстом Конфликт блокировок при выполнении транзакции или долгое ожидание при проведении в отладчике не воспроизводятся: у вас одного всё работает. Здесь нужен технологический журнал. Его включают файлом logcfg.xml в каталоге conf платформы на сервере 1С. Пример настройки для разбора блокировок:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="D:\techlog" history="24">
    <event><eq property="name" value="TLOCK"/></event>
    <event><eq property="name" value="TTIMEOUT"/></event>
    <event><eq property="name" value="TDEADLOCK"/></event>
    <event><eq property="name" value="EXCP"/></event>
    <property name="all"/>
  </log>
</config>

События значат следующее:

СобытиеЧто фиксируетНа что смотреть
TLOCKУстановку управляемой блокировкиКакое пространство блокируется, сколько длилось ожидание
TTIMEOUTПревышение времени ожидания блокировкиСеанс-жертва и сеанс, который держал блокировку
TDEADLOCKВзаимоблокировкуДва сеанса и ресурсы, которые они захватили крест-накрест
EXCPИсключенияТекст ошибки и контекст выполнения

Событие TLOCK на нагруженной базе пишет гигабайты за час. Включайте журнал на время воспроизведения проблемы, следите за свободным местом на диске и потом удалите или переименуйте logcfg.xml. Параметр history задаёт, сколько часов хранить файлы.

Типичный вывод после разбора: транзакция длинная, потому что в ней выполняется что-то долгое, например запрос к внешнему сервису или пересчёт итогов. Блокировку ставят как можно позже и держат как можно меньше.

Исключения в коде и журнал регистрации

Перехват ошибки в коде

Ошибку, которая возможна по сценарию (нет связи с сервисом, занят файл), перехватывают конструкцией Попытка … Исключение. Главное правило: не глушить ошибку молча, а записать её в журнал.

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

ПодробноеПредставлениеОшибки() возвращает текст со стеком: модуль, строку и цепочку вызовов. КраткоеПредставлениеОшибки() даёт только текст для пользователя. Пустой блок Исключение … КонецПопытки — главная причина ошибок, которые «ничего не пишут»: код упал, а следов нет.

Журнал регистрации

Журнал регистрации открывают в режиме 1С:Предприятие (в БП 3.0: Администрирование → Обслуживание → Журнал регистрации) или в Конфигураторе через меню Администрирование. Для поиска ошибки:

  1. Установите отбор по уровню «Ошибка».
  2. Сузьте период до времени, когда пользователь получил сообщение.
  3. Добавьте отбор по пользователю или по имени события, если вы задали его в ЗаписьЖурналаРегистрации.
  4. Откройте запись: в комментарии будет текст исключения с модулем и номером строки.

Номер строки из журнала — готовое место для точки останова. Откройте модуль в Конфигураторе, перейдите на строку (Ctrl+G) и воспроизведите ошибку на копии базы.

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

Частые вопросы об отладке в 1С 8.3

Можно ли отлаживать базу, если конфигурация на поддержке и не снята с замка?
Да. Точки останова ставятся и в объектах на замке: отладка не меняет конфигурацию. Снимать с поддержки нужно только для правки кода.
Почему в отладчике значения переменных «недоступны»?
Чаще всего вы смотрите переменную другого контекста: клиентскую переменную в серверной процедуре или наоборот. Переключитесь на нужный уровень в стеке вызовов.
Как отладить регламентное задание?
Включите фоновые задания в автоматическом подключении отладчика (Отладка → Подключение), поставьте точку в процедуре задания и запустите его вручную из списка регламентных заданий.
Нужна ли отдельная лицензия для отладки?
Нет. Отладчик входит в Конфигуратор. Сеанс, запущенный под отладкой, занимает клиентскую лицензию как обычный.
Чем отладка в EDT отличается от Конфигуратора?
Принципы те же: точки останова, шаги, переменные, стек. Отличается интерфейс и то, что отладка в EDT работает только по протоколу HTTP.