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

· 10 мин

Содержание

Режим отладки 1С запускают из Конфигуратора клавишей F5 (Отладка → Начать отладку): платформа открывает базу в режиме 1С:Предприятия и сразу подключает её к отладчику. Для уже работающего сеанса есть Отладка → Подключение, для запуска из командной строки — ключ /Debug, а чтобы останавливаться в серверном коде на сервере 1С, агент кластера должен работать с ключом -debug.

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

Зачем нужен режим отладки 1С и что умеет отладчик

Отладчик встроен в Конфигуратор. Он связывает текст модулей конфигурации с реально идущим сеансом 1С:Предприятия и позволяет остановить выполнение на нужной строке.

Что можно делать в режиме отладки:

  • 🛑 останавливать код на точке останова, по условию или при любой ошибке;
  • 👣 идти по шагам: заходить в процедуру, перешагивать через неё, выходить наверх;
  • 🔍 смотреть значения: переменные, реквизиты объекта, строки таблицы значений, результат запроса;
  • 🧮 вычислять выражения на лету в контексте текущей строки;
  • 📚 видеть стек вызовов — цепочку, которая привела к текущей строке;
  • ⏱ мерить производительность: Отладка → Замер производительности показывает, сколько раз выполнилась каждая строка и сколько времени она заняла.

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

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

Способы запустить 1С в режиме отладки

Выбор способа зависит от того, откуда вы стартуете и запущен ли уже нужный сеанс.

СпособКогда подходитЧто учесть
F5 в КонфигуратореСвоя тестовая база, разработкаСамый простой вариант, отладка подключается сама
Ключ /Debug в строке запускаНужно стартовать клиент с отладкой из ярлыка или скриптаКонфигуратор этой базы должен быть открыт
Отладка → ПодключениеСеанс уже работает, ошибку нужно поймать «на месте»Пользователь сеанса увидит остановку
Автоматическое подключениеОтладка фоновых заданий и серверных вызововНастраивается в окне подключения

Запуск из Конфигуратора

  1. Откройте базу в режиме Конфигуратора.
  2. Сохраните изменения конфигурации, если правили модули (F7 — обновить конфигурацию базы данных).
  3. Нажмите F5. Запустится клиент, в заголовке Конфигуратора появится признак отладки.
  4. Чтобы запустить без отладки, используйте Ctrl+F5.

Какой клиент поднимется по F5 (тонкий, толстый, веб), задаётся в параметрах Конфигуратора: Сервис → Параметры, раздел про запуск 1С:Предприятия.

Ключ /Debug в командной строке

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

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /F "D:\Bases\Test" /N "Администратор" /Debug

Тот же ключ можно вписать в карточку базы в окне запуска: кнопка Изменить, на последней странице мастера — поле «Дополнительные параметры запуска». При отладке по протоколу HTTP добавляют адрес сервера отладки:

1cv8.exe ENTERPRISE /F "D:\Bases\Test" /Debug -http /DebuggerURL "http://localhost:1550"

Подключение к уже открытому сеансу

В Конфигураторе откройте Отладка → Подключение. В окне «Предметы отладки» выберите нужный сеанс и подключите его. Если списка нет, сеанс не запущен с поддержкой отладки, либо отладка на сервере выключена (см. следующий раздел).

Как включить отладку на сервере 1С

В клиент-серверной базе код с директивами &НаСервере, модули менеджеров, проведение документов и фоновые задания выполняются в рабочих процессах rphost. Чтобы отладчик мог в них останавливаться, агент сервера ragent должен быть запущен с ключом -debug.

Протоколы TCP и HTTP

В 8.3 есть два механизма отладки:

  • TCP — исторический вариант, Конфигуратор подключается к процессам напрямую;
  • HTTP — отладчик и отлаживаемые процессы общаются через сервер отладки dbgs, по умолчанию на порту 1550. Этот вариант нужен для отладки через NAT, мобильных приложений и для работы из 1С:EDT.

Для HTTP агент запускают с ключами -debug -http. Протокол на стороне Конфигуратора выбирается в Сервис → Параметры (настройка отладки). Протоколы на сервере и в Конфигураторе должны совпадать.

Добавляем ключ в службу Windows

  1. Предупредите пользователей: перезапуск службы агента оборвёт все сеансы на этом сервере. Делайте это вне рабочих часов.
  2. Откройте regedit и найдите ветку службы агента в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\. Имя ветки обычно начинается с 1C:Enterprise 8.3 Server Agent.
  3. В параметре ImagePath добавьте -debug после пути к ragent.exe:
"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"
  1. Перезапустите службу в services.msc.

Номер версии и путь к srvinfo в примере условные — оставьте свои, меняйте только ключ. На Linux тот же ключ -debug добавляется в параметры запуска службы ragent.

Ключ -debug включает отладку для всех баз кластера. На рабочем сервере держите его выключенным, а для разбора ошибок поднимайте копию базы на тестовом сервере.

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

Когда выполнение останавливается, строка подсвечивается в модуле, а в меню Отладка становятся доступны команды движения по коду.

ДействиеКлавишаЧто делает
ПродолжитьF5Выполнять до следующей точки останова
Шагнуть вF11Зайти внутрь вызываемой процедуры
Шагнуть черезF10Выполнить вызов целиком и встать на следующую строку
Шагнуть изShift+F11Дойти до конца текущей процедуры и вернуться в вызывающую
Идти до курсораShift+F10Выполнить код до строки, где стоит курсор
Вычислить выражениеShift+F9Открыть окно вычисления для выделенного выражения
Стек вызововCtrl+Alt+CПоказать цепочку вызовов

Основные окна:

  • 📋 Табло — список выражений, которые пересчитываются на каждом шаге. Удобно держать там Объект.СуммаДокумента или Выборка.Количество().
  • 📦 Локальные — все переменные текущей процедуры без ручного ввода.
  • 📚 Стек вызовов — двойной щелчок по строке стека переносит в соответствующий модуль, и в «Локальных» видно переменные того уровня.

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

Точки останова: обычные, с условием и остановка по ошибке

Обычная точка

Поставьте курсор на строку и нажмите F9 или дважды щёлкните по левому полю модуля. Появится красный маркер. Повторное F9 снимает точку, Ctrl+Shift+F9 временно отключает её без удаления. Все точки собраны в списке Отладка → Список точек останова (Alt+F9), там же их удобно массово отключать.

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

Нужна, когда процедура вызывается сотни раз, а интересна одна итерация. В меню Отладка выберите команду точки останова с условием и впишите выражение на встроенном языке, например:

Выборка.Номенклатура.Код = "00-00001234"

или

Сч > 950

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

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

Отладка → Остановка по ошибке заставляет отладчик вставать на строке, где возникло исключение, даже если оно перехвачено в Попытка ... Исключение. Можно указать фрагмент текста ошибки, чтобы не останавливаться на каждой мелочи. Это лучший способ найти источник сообщения вида Значение не является значением объектного типа, когда непонятно, какой модуль его выдаёт.

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

Просмотр и изменение переменных в отладке

Окно «Вычислить выражение» (Shift+F9) — главный инструмент разбора. В нём можно:

  1. Ввести любое выражение: Объект.Товары.Итог("Сумма"), ТипЗнч(Значение), СтрДлина(Строка).
  2. Раскрыть объект и посмотреть его реквизиты и табличные части.
  3. Для коллекций (таблица значений, массив, структура) открыть значение в отдельном окне и увидеть все строки сразу.

Приёмы, которые экономят время:

  • 📊 Результат запроса. Выражение Запрос.Выполнить().Выгрузить() показывает данные таблицей. Учтите: запрос выполнится ещё раз, на тяжёлом отчёте это секунды или минуты.
  • 🧾 Временные таблицы. Если запрос использует МенеджерВременныхТаблиц, содержимое временной таблицы можно получить отдельным запросом к ней в окне вычисления, пока менеджер жив.
  • 🔢 Ссылки. Для ссылки полезно вычислить Ссылка.Пустая() и Ссылка.ПолучитьОбъект() — второе покажет, существует ли объект в базе («битая ссылка» вернёт Неопределено).
  • 🧪 Проверка гипотез. В окне можно вызвать функцию общего модуля с нужными параметрами и сразу увидеть, что она вернёт.

Вычисление выполняет код по-настоящему. Выражение вроде Объект.Записать() или вызов процедуры, которая пишет в базу, изменит данные. В рабочей базе вычисляйте только то, что читает.

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

Где выполняется код

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

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

Модули с повторным использованием

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

Остановка внутри транзакции

Это главный риск отладки серверного кода. Если точка стоит внутри транзакции — например, в ОбработкаПроведения или между НачатьТранзакцию() и ЗафиксироватьТранзакцию() — то, пока вы рассматриваете переменные, транзакция открыта и все взятые ею блокировки удерживаются.

Что видят остальные:

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

Поэтому в транзакции не задерживайтесь: посмотрели значения, нажали F5 или прервали отладку.

Безопасность режима отладки в рабочей базе

Отладчик даёт полный доступ к данным сеанса: через окно вычисления видно всё, что видит код, включая данные, скрытые от пользователя правами. Кто может подключиться к процессам сервера, тот может читать и менять данные.

Правила, которые стоит закрепить в регламенте:

  1. Отлаживайте копию. Выгрузите базу (Администрирование → Выгрузить информационную базу) или скопируйте её средствами СУБД и разбирайте ошибку на тестовом сервере. Для большинства ошибок этого хватает.
  2. Не держите -debug на боевом сервере постоянно. Включили на время разбора — после выключили. Каждое переключение — это перезапуск службы с обрывом сеансов.
  3. Закройте порты. Сервер отладки HTTP (порт 1550) и диапазон рабочих процессов не должны быть доступны из интернета. Ограничьте доступ брандмауэром до машин разработчиков.
  4. Права на Конфигуратор. Подключиться к отладке может тот, у кого есть право открыть базу в Конфигураторе. Держите это право у узкого круга.
  5. Без записи в окне вычисления. На рабочей базе — только чтение. Изменения данных делайте штатными документами или обработками, после согласования.
  6. Снимайте точки. Перед закрытием Конфигуратора откройте Alt+F9 и удалите лишнее, чтобы при следующем подключении отладчик неожиданно не остановил чужой сеанс.
Перед отладкой в рабочей базе
Выполнено: 0 / 6

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

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