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

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

Как работает точка останова в 1С

Как работает точка останова в 1С: виды точек, условия срабатывания, пошаговая отладка в конфигураторе, типичные ошибки и способы проверки результата.

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

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

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

Что происходит внутри платформы при срабатывании точки останова

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

Важно понимать, что остановка происходит до выполнения помеченной строки. Если точка стоит на строке с присваиванием, переменная ещё хранит старое значение — это видно в табло и в окне «Локальные переменные». Чтобы увидеть результат строки, нужно шагнуть дальше (F10 или F11) и только потом смотреть значение.

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

Виды точек останова и где их ставить

Платформа поддерживает несколько разновидностей точек, и выбор зависит от задачи. Обычная точка ставится на конкретной строке модуля и срабатывает всегда. Условная срабатывает, только если заданное выражение истинно — например, Номенклатура.Код = "00-000123", что избавляет от сотен ручных проходов цикла. Точка со счётчиком попаданий останавливает выполнение после N-го прохода, а точка с условием и счётчиком комбинирует оба ограничения.

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

Сравнение вариантов

Обычная точка (F9)

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

Условная точка

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

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

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

Точка со счётчиком

Подходит, когда проблема проявляется на определённой итерации, например на сотой строке табличной части.

Как поставить точку останова и запустить отладку

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

Порядок действий
  1. 1
    Откройте нужный модуль в конфигураторе (модуль объекта, формы, общий модуль).
  2. 2
    Поставьте курсор на исполняемую строку и нажмите F9 — слева появится красный маркер.
  3. 3
    При необходимости откройте свойства точки (Alt+F9) и задайте условие или счётчик.
  4. 4
    Запустите отладку клавишей F5 или через меню «Отладка — Начать отладку».
  5. 5
    Воспроизведите в клиентском окне действие, которое вызывает код.
  6. 6
    Дождитесь остановки: конфигуратор подсветит текущую строку жёлтым.
  7. 7
    Проверьте значения переменных через табло (Shift+F9) или окно локальных переменных.
  8. 8
    Продолжите выполнение: F5 — до следующей точки, F10 — шаг через, F11 — шаг внутрь.

Клавиши пошагового выполнения стоит запомнить, потому что именно они определяют скорость отладки. F10 выполняет текущую строку и переходит к следующей, не заходя в вызываемые процедуры. F11 заходит внутрь вызова. Shift+F11 доводит текущую процедуру до конца и выходит на уровень выше — удобно, когда случайно зашли глубже, чем нужно.

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

Отладка серверного кода, толстого и тонкого клиента

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

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

text
"C:\Program Files\1cv8\<версия>\bin\ragent.exe" -debug

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

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

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

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

Аналогично отлаживаются вызовы веб-сервисов и HTTP-сервисов: сеанс появляется в списке предметов отладки в момент обращения. Важно, чтобы в свойствах публикации сервиса была разрешена отладка, иначе сеанс в списке не появится.

Типичные ошибки
01
Отладка серверного кода без параметра -debug у агента сервера — точки игнорируются без каких-либо сообщений.
02
Попытка подключиться к фоновому заданию после его завершения — сеанс исчезает из списка, нужен запуск с паузой в коде.
03
Точка на неисполняемой строке (комментарий, объявление) — маркер переносится или не ставится, остановки не происходит.
04
Изменение кода во время остановки и ожидание, что он выполнится — исполняется скомпилированная версия, изменения требуют перезапуска отладки.
05
Долгая остановка внутри транзакции на рабочей базе — блокировки мешают пользователям, отладку нужно вести на копии.

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

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

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

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

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

Конфигуратор подсвечивает строку жёлтым, табло показывает актуальные значения

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

Точка отображается с вопросительным знаком или не срабатывает — код не выполняется или отладка не подключена

Значения переменных
Норма

В табло и окне локальных переменных видны ожидаемые типы и значения

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

Значение Неопределено там, где ожидался объект — присваивание не произошло или ветка кода пропущена

Стек вызовов
Норма

Цепочка вызовов соответствует ожидаемому сценарию

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

Процедура вызвана из неожиданного места — например, из подписки на событие, о которой забыли

После исправления
Норма

Код проходит точку с корректными значениями, сценарий завершается без исключений

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

Ошибка ушла в другую строку — исправлен симптом, а не причина

Хорошая практика — после нахождения причины убрать все временные точки (Ctrl+Shift+F9) и прогнать сценарий ещё раз без остановок. Это подтверждает, что исправление работает в нормальном режиме, а не только под отладчиком, где тайминги и порядок выполнения могут отличаться.

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

FAQ: частые вопросы о точках останова в 1С

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

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

Сохраняются ли точки останова между сеансами конфигуратора?

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

Можно ли отладить код, который выполняется у пользователя на другом компьютере?

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

Чем отличается «Шаг через» (F10) от «Шаг внутрь» (F11)?

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

Почему изменения кода не подхватываются во время остановки на точке?

Выполняется скомпилированная при запуске версия модуля. Правки, внесённые после старта отладки, в текущем сеансе не исполняются. Остановите отладку (Shift+F5), сохраните изменения и запустите заново — только тогда новый код попадёт в исполнение.

Как отладить обработчик, который срабатывает только при записи документа?

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

Итог

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

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