К статье
Практический материал

Разработка и Конфигурация · 11 мин

Почему не работают точки останова в 1С и как это исправить

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

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

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

Ниже разобраны основные причины, по которым точки останова не срабатывают, и конкретные действия для каждого случая — от проверки флага отладки на сервере до нюансов с оптимизацией компиляции модулей.

Как устроена отладка в 1С и где она ломается

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

Важно понимать разделение сторон исполнения. Код с директивами &НаКлиенте выполняется в клиентском приложении, код &НаСервере и серверные общие модули — в рабочем процессе сервера 1С. Это разные процессы, и каждый должен быть отдельно доступен отладчику. Точка в серверной процедуре не сработает, если отлаживается только тонкий клиент.

Ещё один нюанс: один и тот же модуль может компилироваться в нескольких контекстах. Если у общего модуля включены флаги «Клиент» и «Сервер», платформа создаёт два экземпляра кода, и отладчик должен быть подключён к нужному.

Не включена отладка на сервере 1С

Самая частая причина в клиент-серверном варианте: сервер приложений запущен без ключа отладки, поэтому серверный код выполняется, но недоступен отладчику. Точки в серверных процедурах и функциях при этом молча игнорируются, а клиентские точки могут работать нормально, что маскирует проблему.

Чтобы включить отладку, в строку запуска агента сервера 1С нужно добавить параметр -debug. В Windows это делается через реестр в параметре ImagePath службы агента сервера, в Linux — в скрипте запуска. После изменения параметра службу необходимо перезапустить, иначе ключ не подействует.

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

text
"C:\Program Files\1cv8\<версия>\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -debug -d "C:\srvinfo"

Отлаживается не тот клиент или не тот предмет отладки

Если база открыта в нескольких сеансах или вы запустили приложение не из конфигуратора, а отдельно, отладчик может быть подключён не к тому процессу. Типичный сценарий: разработчик запускает отладку клавишей F5, но параллельно у него открыт ещё один сеанс той же базы, и действия выполняются именно в нём — точки, естественно, не срабатывают.

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

Для автоматического подключения удобно включить в настройках конфигуратора («Сервис — Параметры», раздел отладки) автоматическое подключение нужных типов предметов отладки: клиентских приложений, фоновых заданий, внешних соединений. Это избавляет от ручной отметки при каждом запуске.

Порядок действий
  1. 1
    Откройте в конфигураторе «Отладка — Подключение» и посмотрите список предметов отладки
  2. 2
    Убедитесь, что нужный клиент или рабочий процесс присутствует в списке и отмечен флагом
  3. 3
    Если процесса нет — перезапустите приложение через «Начать отладку» (F5) из конфигуратора
  4. 4
    Повторите действие в отлаживаемом сеансе и проверьте срабатывание точки

Точка стоит в коде, который выполняется на другой стороне

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

Аналогичная ситуация возникает с фоновыми заданиями. Код, запущенный через ФоновыеЗадания.Выполнить, исполняется в отдельном сеансе на сервере. Такой сеанс появляется в списке предметов отладки только на время выполнения задания, и его нужно успеть подключить или включить автоподключение фоновых заданий в настройках.

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

Маршрут решения

Как выбрать действие

Точка в серверной процедуре не срабатывает, клиентские работаютПроверьте ключ -debug на сервере и перезапустите службу агента
Точка в фоновом задании игнорируетсяВключите автоподключение фоновых заданий в параметрах отладки конфигуратора
Не останавливается код HTTP-сервиса или веб-сервисаПроверьте публикацию с отладкой и отметьте внешние соединения в предметах отладки
Точки не работают вообще нигде, даже на клиентеПроверьте, что приложение запущено через F5 из конфигуратора, а не отдельно

Особенности отладки веб-клиента и мобильного клиента

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

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

Точка установлена там, где она не может сработать

Не каждая строка модуля является исполняемой. Точки останова, поставленные на строки с объявлениями переменных вне процедур, комментарии, строки препроцессора или заголовки процедур, могут вести себя неочевидно: платформа иногда «сдвигает» такую точку на ближайшую исполняемую строку, а иногда игнорирует.

Ещё одна причина — код, который вообще не выполняется в вашем сценарии. Например, точка стоит в ветке Если ... Тогда, условие которой всегда ложно, или в обработчике события, которое не наступает при ваших действиях. Перед выводами о неисправности отладчика убедитесь, что код реально достигается: поставьте точку на первую строку процедуры или временно добавьте вывод сообщения.

Отдельно стоит упомянуть модифицированную конфигурацию: если конфигурация базы данных отличается от конфигурации, открытой в конфигураторе (изменения не обновлены в базу), отладчик работает со старой версией кода, и точки могут «уезжать» или не срабатывать. Признак — предупреждение о различии конфигураций при запуске отладки. Решение — обновить конфигурацию базы данных (F7) и повторить запуск.

Типичные ошибки
01
Ставить точку в серверном коде, не проверив ключ -debug на сервере — точка молча игнорируется
02
Выполнять действия в другом сеансе, не подключённом к отладчику, — код выполняется мимо отладки
03
Забыть обновить конфигурацию базы данных после изменений — отладчик работает со старой версией модуля
04
Ставить точку в ветку условия, которое не выполняется, и считать отладчик сломанным
05
Не включить автоподключение фоновых заданий и внешних соединений — их код остаётся невидимым

Проверка результата и ограничения отладки

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

Полезные контрольные признаки: в списке предметов отладки видны все нужные процессы, при прохождении точки доступны табло, стек вызовов и значения переменных. Если точка сработала, но значения переменных выглядят странно — возможно, вы смотрите не тот контекст выполнения (клиент вместо сервера в стеке вызовов).

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

Контрольные точки

Как проверить результат

Список предметов отладки
Норма

Нужный клиент и рабочий процесс видны и отмечены флагами

Тревожный признак

Процесс отсутствует или флаг снят

Срабатывание контрольной точки
Норма

Выполнение останавливается, открывается текущая строка

Тревожный признак

Точка игнорируется даже в простом клиентском обработчике

Соответствие конфигураций
Норма

Конфигуратор не выдаёт предупреждение о различии конфигураций

Тревожный признак

Есть предупреждение — обновите конфигурацию базы данных

Стек вызовов при остановке
Норма

Видны ожидаемые процедуры и контекст (клиент/сервер)

Тревожный признак

Стек пуст или контекст не соответствует ожиданию

FAQ

Почему точка останова отображается с восклицательным знаком или иначе, чем обычно?

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

Работает ли отладка в файловой базе без дополнительных настроек?

Да, в файловом варианте серверный и клиентский код выполняются в одном процессе клиентского приложения, поэтому достаточно запустить базу через F5 из конфигуратора. Ключ -debug там не требуется — он нужен только для сервера 1С в клиент-серверном варианте.

Можно ли отладить код регламентного задания?

Да. Включите в параметрах отладки конфигуратора автоматическое подключение фоновых заданий, дождитесь запуска регламентного задания (или инициируйте его принудительно) — сеанс появится в списке предметов отладки. Учтите, что на сервере также должен быть включён режим отладки.

Почему отладка работала, а после обновления платформы перестала?

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

Точка стоит в цикле, но останавливается только один раз — это нормально?

Нет, исправная точка в цикле срабатывает на каждой итерации. Если остановка происходит один раз, проверьте, не установлено ли у точки условие или счётчик проходов (это настраивается в свойствах точки останова), а также убедитесь, что цикл действительно выполняет несколько итераций.

Можно ли отлаживать код без конфигуратора?

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

Итог

Что важно запомнить

Точки останова в 1С почти всегда не работают по одной из четырёх причин: на сервере нет ключа -debug, отлаживается не тот процесс, код выполняется на другой стороне (клиент/сервер/фоновое задание) или конфигурация базы данных не обновлена. Проверку начинайте со списка предметов отладки и контрольной точки в простом клиентском обработчике.