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

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

Отладка в 1С: как находить ошибки в коде пошагово

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

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

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

Как включить режим отладки

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

Если сеанс уже запущен пользователем, подключитесь к нему вручную: «Отладка → Подключение». В окне появится список доступных предметов отладки — сеансов, запущенных с разрешением отладки. Выберите нужный и нажмите «Подключить». Чтобы сеанс попал в этот список, он должен быть запущен с параметром командной строки /debug или с включённой настройкой отладки в диалоге запуска.

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

Точки останова: как остановить код в нужном месте

Точка останова ставится кликом в левой части редактора модуля, на серой полосе у номеров строк, или клавишей F9. Строка помечается красным маркером. Когда выполнение дойдёт до этой строки, программа остановится, и управление перейдёт в конфигуратор. Учтите: точка ставится только на исполняемые строки — на комментарии и пустые строки она не встанет.

Точку останова можно сделать условной: правый клик по точке → «Точка останова с условием». Например, условие «Контрагент.ИНН = "7707083893"» остановит цикл только на нужной итерации, и вам не придётся десятки раз нажимать «Продолжить» внутри обхода большой таблицы. Это главный приём при отладке циклов по сотням записей.

Ещё один полезный вариант — остановка по ошибке: «Отладка → Остановка по ошибке». Тогда выполнение прервётся в момент возникновения исключения, и вы увидите стек вызовов и значения переменных ровно в той точке, где всё сломалось. Это незаменимо, когда ошибка возникает «где-то внутри» и текст сообщения не указывает точное место.

Порядок действий при первой отладке
  1. 1
    Откройте конфигуратор и запустите отладку клавишей F5
  2. 2
    В модуле с нужным кодом поставьте точку останова клавишей F9
  3. 3
    В клиентском приложении выполните действие, вызывающее код
  4. 4
    Дождитесь остановки и изучите значения переменных через табло
  5. 5
    Пройдите код шагами (F11) и найдите место расхождения с ожиданием
  6. 6
    Исправьте код, снимите точку останова и повторите проверку

Пошаговое выполнение и навигация по коду

После остановки доступны четыре основных движения. «Шагнуть через» (F10) выполняет текущую строку целиком, не заходя внутрь вызываемых процедур. «Шагнуть в» (F11) заходит внутрь вызываемой функции. «Шагнуть из» (Shift+F11) довыполняет текущую процедуру и останавливается в вызвавшем её коде. «Продолжить» (F5) запускает выполнение до следующей точки останова.

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

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

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

Самый быстрый способ — навести курсор на переменную в редакторе: всплывающая подсказка покажет текущее значение. Для постоянного наблюдения используйте табло («Отладка → Табло»): перетащите туда переменные или выражения, и их значения будут обновляться на каждом шаге. В табло можно писать произвольные выражения, например «ТаблицаТоваров.Количество()» или «Строка.Сумма * 1.2».

Для сложных объектов — таблиц значений, структур, ссылок — используйте «Вычислить выражение» (Shift+F9). В открывшемся окне результат можно развернуть: посмотреть все колонки таблицы значений, свойства структуры, реквизиты объекта по ссылке. Это основной инструмент, когда нужно проверить, что запрос вернул именно те данные, которые вы ожидали.

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

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

Значения переменных в табло
Норма

Соответствуют ожидаемым на каждом шаге

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

Значение «ломается» после конкретной строки — она и есть источник ошибки

Содержимое таблицы значений через «Вычислить выражение»
Норма

Нужные строки и колонки присутствуют, типы данных верные

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

Пустая таблица, NULL в полях или неожиданные типы — проверяйте запрос

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

Цепочка вызовов соответствует задуманной логике

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

Процедура вызвана из неожиданного места или лишний раз

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

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

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

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

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

Как выбрать способ отладки

Ошибка в коде формы или клиентской процедуреЗапустите отладку через F5 и ставьте точку прямо в модуле формы
Ошибка в серверной процедуре на клиент-серверной базеПроверьте ключ -debug у службы сервера и подключитесь к серверному сеансу
Ошибка возникает периодически, в фоновом или регламентном заданииВключите автоподключение к фоновым заданиям и поставьте точку до запуска
Есть текст ошибки, но непонятно, где она возникаетВключите «Остановка по ошибке» и воспроизведите ситуацию
Ошибка только у конкретного пользователяПодключитесь к его сеансу через «Отладка → Подключение» с его согласия

Типичные ошибки и ограничения отладчика

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

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

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

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

Альтернативы и дополнение к отладчику

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

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

Итог

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

Запускайте отладку через F5, ставьте точки останова (F9) и условные точки для циклов, смотрите значения через табло и «Вычислить выражение» (Shift+F9). Для серверного кода в клиент-серверном режиме нужен ключ -debug, для фоновых заданий — автоподключение. Всегда обновляйте конфигурацию БД перед отладкой и не оставляйте точки останова на рабочей базе.

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

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

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

Можно ли отлаживать код у пользователя на рабочей базе?

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

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

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

Чем отличаются клавиши F10 и F11 при пошаговой отладке?

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

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

Выделите переменную и нажмите Shift+F9 («Вычислить выражение»). В окне результата разверните объект: для таблицы значений будут видны колонки и строки, для выборки из запроса — текущая запись. Можно также добавить в табло выражение вида «ТЗ.Количество()», чтобы следить за размером таблицы на каждом шаге.

Можно ли изменить значение переменной прямо во время отладки?

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