Разработка и Конфигурация · 11 мин
Почему не работают точки останова в 1С и как это исправить
Разбираем, почему точки останова не срабатывают в конфигураторе 1С: отладка не включена, не тот клиент, серверный код, оптимизация. Пошаговые решения.
Точка останова в конфигураторе 1С стоит, код точно выполняется, но отладчик молчит — знакомая ситуация почти для каждого разработчика. Причина практически всегда кроется не в «глюке» платформы, а в одном из вполне объяснимых условий: отладка не разрешена на сервере, исполняется не тот экземпляр кода, клиент подключён не в том режиме или точка стоит в строке, которая физически не может остановить выполнение.
Проблема усложняется тем, что платформа никак не сигнализирует о причине: точка останова просто игнорируется. В файловой базе на локальном компьютере отладка обычно работает «из коробки», а вот в клиент-серверном варианте, при отладке веб-клиента, фоновых заданий или внешних соединений требуются дополнительные настройки, о которых легко забыть.
Ниже разобраны основные причины, по которым точки останова не срабатывают, и конкретные действия для каждого случая — от проверки флага отладки на сервере до нюансов с оптимизацией компиляции модулей.
Как устроена отладка в 1С и где она ломается
Отладчик конфигуратора подключается к исполняемому коду через отладочный протокол: клиентское приложение или сервер должны быть запущены в режиме отладки и «зарегистрироваться» в конфигураторе как предмет отладки. Если хотя бы одно звено этой цепочки отсутствует, точка останова визуально стоит, но выполнение её игнорирует.
Важно понимать разделение сторон исполнения. Код с директивами &НаКлиенте выполняется в клиентском приложении, код &НаСервере и серверные общие модули — в рабочем процессе сервера 1С. Это разные процессы, и каждый должен быть отдельно доступен отладчику. Точка в серверной процедуре не сработает, если отлаживается только тонкий клиент.
Ещё один нюанс: один и тот же модуль может компилироваться в нескольких контекстах. Если у общего модуля включены флаги «Клиент» и «Сервер», платформа создаёт два экземпляра кода, и отладчик должен быть подключён к нужному.
Не включена отладка на сервере 1С
Самая частая причина в клиент-серверном варианте: сервер приложений запущен без ключа отладки, поэтому серверный код выполняется, но недоступен отладчику. Точки в серверных процедурах и функциях при этом молча игнорируются, а клиентские точки могут работать нормально, что маскирует проблему.
Чтобы включить отладку, в строку запуска агента сервера 1С нужно добавить параметр -debug. В Windows это делается через реестр в параметре ImagePath службы агента сервера, в Linux — в скрипте запуска. После изменения параметра службу необходимо перезапустить, иначе ключ не подействует.
Учтите, что перезапуск службы сервера разорвёт сеансы пользователей. В рабочей базе это нужно согласовывать и выполнять в нерабочее время. Для регулярной разработки безопаснее поднять отдельную тестовую базу на том же или отдельном сервере с постоянно включённой отладкой.
"C:\Program Files\1cv8\<версия>\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -debug -d "C:\srvinfo"Отлаживается не тот клиент или не тот предмет отладки
Если база открыта в нескольких сеансах или вы запустили приложение не из конфигуратора, а отдельно, отладчик может быть подключён не к тому процессу. Типичный сценарий: разработчик запускает отладку клавишей F5, но параллельно у него открыт ещё один сеанс той же базы, и действия выполняются именно в нём — точки, естественно, не срабатывают.
Проверьте список предметов отладки: меню «Отладка — Подключение». Там должны быть видны подключённые процессы, и напротив нужных должны стоять флаги. Если нужного клиента в списке нет, он запущен без отладки. Если процесс есть, но флаг снят — отметьте его вручную.
Для автоматического подключения удобно включить в настройках конфигуратора («Сервис — Параметры», раздел отладки) автоматическое подключение нужных типов предметов отладки: клиентских приложений, фоновых заданий, внешних соединений. Это избавляет от ручной отметки при каждом запуске.
- 1Откройте в конфигураторе «Отладка — Подключение» и посмотрите список предметов отладки
- 2Убедитесь, что нужный клиент или рабочий процесс присутствует в списке и отмечен флагом
- 3Если процесса нет — перезапустите приложение через «Начать отладку» (F5) из конфигуратора
- 4Повторите действие в отлаживаемом сеансе и проверьте срабатывание точки
Точка стоит в коде, который выполняется на другой стороне
Классическая ошибка: точка установлена в процедуре с директивой &НаСервере, а отладчик подключён только к клиенту, или наоборот. При вызове серверной процедуры из клиентской выполнение «перепрыгивает» на сервер, и если сервер не отлаживается, точка внутри неё не сработает.
Аналогичная ситуация возникает с фоновыми заданиями. Код, запущенный через ФоновыеЗадания.Выполнить, исполняется в отдельном сеансе на сервере. Такой сеанс появляется в списке предметов отладки только на время выполнения задания, и его нужно успеть подключить или включить автоподключение фоновых заданий в настройках.
Отдельный случай — код, выполняемый через внешние соединения: COM, веб-сервисы, HTTP-сервисы, регламентные задания. Для них в списке предметов отладки появляются отдельные строки, и каждый тип нужно явно отметить. При отладке HTTP-сервисов также проверьте, что публикация на веб-сервере выполнена с включённым режимом отладки.
Как выбрать действие
Особенности отладки веб-клиента и мобильного клиента
При работе через веб-клиент отладка возможна, но требует, чтобы публикация информационной базы на веб-сервере была выполнена с разрешением отладки, а в параметрах запуска браузерного клиента была указана отладочная строка. Без этого код на клиенте в браузере выполняется без связи с конфигуратором.
Для веб-клиента точки срабатывают только в клиентском коде, скомпилированном для веб-клиента. Если общий модуль не имеет флага компиляции для веб-клиента, его код в браузере просто не существует, и точка в нём бессмысленна. Проверяйте свойства модуля: флаги «Клиент (обычное приложение)», «Клиент (управляемое приложение)» и «Веб-клиент» — это независимые настройки.
Точка установлена там, где она не может сработать
Не каждая строка модуля является исполняемой. Точки останова, поставленные на строки с объявлениями переменных вне процедур, комментарии, строки препроцессора или заголовки процедур, могут вести себя неочевидно: платформа иногда «сдвигает» такую точку на ближайшую исполняемую строку, а иногда игнорирует.
Ещё одна причина — код, который вообще не выполняется в вашем сценарии. Например, точка стоит в ветке Если ... Тогда, условие которой всегда ложно, или в обработчике события, которое не наступает при ваших действиях. Перед выводами о неисправности отладчика убедитесь, что код реально достигается: поставьте точку на первую строку процедуры или временно добавьте вывод сообщения.
Отдельно стоит упомянуть модифицированную конфигурацию: если конфигурация базы данных отличается от конфигурации, открытой в конфигураторе (изменения не обновлены в базу), отладчик работает со старой версией кода, и точки могут «уезжать» или не срабатывать. Признак — предупреждение о различии конфигураций при запуске отладки. Решение — обновить конфигурацию базы данных (F7) и повторить запуск.
Проверка результата и ограничения отладки
После исправления настроек проверьте работу отладки на простом контрольном примере: поставьте точку в обработчике нажатия кнопки формы и выполните действие. Если выполнение остановилось и в конфигураторе открылась текущая строка с подсветкой — цепочка отладки работает, дальше можно переносить точки в целевой код.
Полезные контрольные признаки: в списке предметов отладки видны все нужные процессы, при прохождении точки доступны табло, стек вызовов и значения переменных. Если точка сработала, но значения переменных выглядят странно — возможно, вы смотрите не тот контекст выполнения (клиент вместо сервера в стеке вызовов).
Помните об ограничениях: остановленный на точке серверный сеанс держит соединение и может блокировать транзакции других пользователей в рабочей базе. Длительная остановка внутри транзакции способна привести к тайм-аутам и конфликтам блокировок. Поэтому отладку бизнес-логики с проведением документов лучше выполнять на копии базы.
Как проверить результат
Нужный клиент и рабочий процесс видны и отмечены флагами
Процесс отсутствует или флаг снят
Выполнение останавливается, открывается текущая строка
Точка игнорируется даже в простом клиентском обработчике
Конфигуратор не выдаёт предупреждение о различии конфигураций
Есть предупреждение — обновите конфигурацию базы данных
Видны ожидаемые процедуры и контекст (клиент/сервер)
Стек пуст или контекст не соответствует ожиданию
FAQ
Почему точка останова отображается с восклицательным знаком или иначе, чем обычно?
Необычный вид значка точки обычно означает, что отладчик не смог связать её с исполняемым кодом: модуль не скомпилирован для текущего контекста, конфигурация базы данных отличается от редактируемой или строка не является исполняемой. Обновите конфигурацию базы данных и проверьте флаги компиляции модуля.
Работает ли отладка в файловой базе без дополнительных настроек?
Да, в файловом варианте серверный и клиентский код выполняются в одном процессе клиентского приложения, поэтому достаточно запустить базу через F5 из конфигуратора. Ключ -debug там не требуется — он нужен только для сервера 1С в клиент-серверном варианте.
Можно ли отладить код регламентного задания?
Да. Включите в параметрах отладки конфигуратора автоматическое подключение фоновых заданий, дождитесь запуска регламентного задания (или инициируйте его принудительно) — сеанс появится в списке предметов отладки. Учтите, что на сервере также должен быть включён режим отладки.
Почему отладка работала, а после обновления платформы перестала?
После обновления платформы служба сервера может быть перерегистрирована, и параметр -debug в строке запуска пропадает. Проверьте параметры запуска службы агента сервера и при необходимости снова добавьте ключ, затем перезапустите службу.
Точка стоит в цикле, но останавливается только один раз — это нормально?
Нет, исправная точка в цикле срабатывает на каждой итерации. Если остановка происходит один раз, проверьте, не установлено ли у точки условие или счётчик проходов (это настраивается в свойствах точки останова), а также убедитесь, что цикл действительно выполняет несколько итераций.
Можно ли отлаживать код без конфигуратора?
Штатный отладчик встроен в конфигуратор и в среду разработки EDT — без них полноценная пошаговая отладка встроенного языка невозможна. В качестве временной альтернативы используют вывод сообщений, запись в журнал регистрации или внешние логи, но это заметно менее удобно.
Что важно запомнить
Точки останова в 1С почти всегда не работают по одной из четырёх причин: на сервере нет ключа -debug, отлаживается не тот процесс, код выполняется на другой стороне (клиент/сервер/фоновое задание) или конфигурация базы данных не обновлена. Проверку начинайте со списка предметов отладки и контрольной точки в простом клиентском обработчике.