Отладка кода в 1С 8.3: обычные, условные и серверные точки останова
Содержание
Чтобы установить точку останова в 1С, откройте модуль в Конфигураторе, поставьте курсор на строку с кодом и нажмите F9 (или дважды щёлкните по серому полю слева от строки). Появится красный кружок. Затем запустите отладку клавишей F5: когда выполнение дойдёт до этой строки, 1С:Предприятие замрёт, а Конфигуратор покажет текущую строку и значения переменных.
Типичная ситуация: документ проводится, а сумма в движениях не та. Вместо того чтобы гадать, ставите точку останова в обработке проведения, проводите документ и смотрите, что лежит в переменных на каждом шаге. Механизм общий для платформы 8.3 и не зависит от конфигурации: в БП, ЗУП и УТ точки ставятся одинаково.
Как устроен отладчик 1С и что подготовить
Отладчик встроен в Конфигуратор. Отдельно его ставить не нужно. Работает схема из двух окон: в Конфигураторе вы ставите точки и смотрите переменные, а в запущенном 1С:Предприятии выполняете действие, которое вызывает код.
Что понадобится:
- 🔑 Права администратора в базе: без них Конфигуратор не откроется.
- 💾 Сохранённая и обновлённая конфигурация. Отладчик сверяет строки модулей, которые выполняются в базе, с тем, что открыто в Конфигураторе. Если вы правили код и не обновили конфигурацию базы данных (
F7), номера строк разъедутся. - 🧪 Копия базы для экспериментов. В рабочей базе остановка на точке «подвешивает» сеанс пользователя, который выполняет этот код.
Конфигурация должна быть открыта: Конфигурация → Открыть конфигурацию. Без этого модули не видны и ставить точки некуда.
Режимы запуска отладки
Команда Отладка → Начать отладку предлагает несколько клиентов. Выбирайте тот, в котором работают пользователи:
| Клиент | Когда выбирать |
|---|---|
| Тонкий клиент | Типовые конфигурации на управляемых формах (БП 3.0, ЗУП 3.1, УТ 11) |
| Толстый клиент | Старые конфигурации на обычных формах, обычное приложение |
| Веб-клиент | Проверка кода, который ведёт себя иначе в браузере |
Клавиша F5 запускает клиент, выбранный по умолчанию в параметрах Конфигуратора (Сервис → Параметры, вкладка «Запуск 1С:Предприятия»).
Ставим точку останова в модуле: пошагово
Порядок одинаковый для модуля объекта, модуля менеджера, общего модуля и модуля формы.
- Откройте нужный модуль. Быстрее всего — через поиск по дереву метаданных: встаньте в дерево и начните печатать имя объекта.
- Найдите процедуру. В модуле удобно искать список процедур через
Ctrl+Fпо имени или через выпадающий список процедур на панели модуля. - Поставьте курсор на исполняемую строку: присваивание, вызов, условие
Если. На пустой строке, комментарии или объявленииПеремточка не сработает. - Нажмите
F9. Слева появится красный кружок. ПовторноеF9убирает точку. - Запустите отладку (
F5) и выполните в 1С:Предприятии действие, которое вызывает этот код: откройте форму, нажмите кнопку, проведите документ. - Когда выполнение остановится, Конфигуратор выйдет на передний план, а текущая строка подсветится стрелкой.
Наведите курсор на переменную — во всплывающей подсказке будет её значение. Для коллекций и объектов удобнее окно «Вычислить выражение» (Shift+F9): там можно раскрыть структуру, таблицу значений или реквизиты ссылки.
Как двигаться по коду после остановки
| Клавиша | Действие |
|---|---|
F10 | Шагнуть через: выполнить строку, не заходя в вызываемые процедуры |
F11 | Шагнуть в: зайти внутрь вызываемой процедуры или функции |
Shift+F11 | Шагнуть из: доработать текущую процедуру и вернуться к вызывающему коду |
Shift+F10 | Идти до курсора: выполнить код до строки, где стоит курсор |
F5 | Продолжить до следующей точки останова |
Все установленные точки видны в окне Отладка → Список точек останова (Alt+F9). Оттуда же их удобно включать, отключать без удаления и переходить к нужной строке двойным щелчком. Отключённая точка остаётся в модуле, но выполнение на ней не останавливается — удобно, когда точка ещё понадобится.
Точки останова во внешних обработках и отчётах
Внешние файлы .epf и .erf не входят в конфигурацию, поэтому порядок другой.
- В Конфигураторе откройте файл обработки:
Файл → Открыть. - Откройте её модуль объекта или модуль формы и поставьте точки через
F9. - Запустите отладку (
F5). - В 1С:Предприятии откройте тот же самый файл через главное меню:
Файл → Открыть. - Выполните действие в форме обработки — отладчик остановится.
Ключевое условие — путь к файлу должен совпадать. Если вы открыли в Конфигураторе D:\Обработки\Загрузка.epf, а в 1С:Предприятии — копию с рабочего стола, точка не сработает.
Обработка подключена через «Дополнительные отчёты и обработки»
Это самый частый случай: обработка зарегистрирована в справочнике дополнительных обработок БСП, и пользователи запускают её оттуда. Платформа при запуске выгружает её во временный файл, путь которого вы заранее не знаете. Точки из открытого в Конфигураторе файла поэтому не срабатывают.
Рабочий приём: на время отладки откройте исходный .epf напрямую через Файл → Открыть в 1С:Предприятии, а не из списка дополнительных обработок. При открытии внешнего файла платформа может показать предупреждение защиты от опасных действий — для своего файла его можно подтвердить. После отладки загрузите исправленную версию в справочник заново.
Код, который в справочнике выполняется в безопасном режиме, при прямом открытии может вести себя иначе: например, обращаться к файлам без ограничений. Финальную проверку делайте именно через справочник.
Точка останова с условием
Обычная точка в цикле по 3 000 строк остановит вас 3 000 раз. Условие решает это: отладчик остановится, только когда выражение вернёт Истина.
Как поставить:
- Встаньте на строку внутри цикла.
- Выберите
Отладка → Точка останова с условием(или правый щелчок по строке). - Введите выражение на встроенном языке и подтвердите. Значок такой точки отличается от обычного, так их легко различить.
Примеры условий:
// Остановиться на конкретной номенклатуре
СтрокаТЧ.Номенклатура.Код = "00-00000123"
// Остановиться, когда сумма ушла в минус
СтрокаТЧ.Сумма < 0
// Остановиться на 500-й итерации счётчика
Сч = 500
// Остановиться, только если строка содержит слово
СтрНайти(НРег(СтрокаТЧ.Содержание), "аренда") > 0
Условие вычисляется в контексте этой строки: в нём доступны локальные переменные процедуры, параметры и переменные модуля.
Следите, чтобы условие не падало с ошибкой. Если СтрокаТЧ.Номенклатура пустая, обращение к .Код вернёт ошибку, и точка поведёт себя не так, как вы ждёте. Добавляйте проверку: ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) И СтрокаТЧ.Номенклатура.Код = "00-00000123".
Отладка управляемых форм: клиент и сервер
В управляемой форме код разделён директивами компиляции. Это определяет, где выполняется процедура и как её отлаживать.
- 🖥️
&НаКлиенте— выполняется в клиентском приложении пользователя. Точки срабатывают всегда, если клиент подключён к отладке. - 🗄️
&НаСервере,&НаСервереБезКонтекста— выполняются на сервере. В файловой базе «сервер» работает внутри того же процесса, и точки срабатывают без настроек. В клиент-серверной базе нужна серверная отладка (о ней ниже). - 🔁
&НаКлиентеНаСервереБезКонтекста— функция может выполниться и там, и там; точка сработает в обоих случаях.
Куда ставить точку, чтобы поймать нужный момент:
| Что нужно поймать | Где ставить точку |
|---|---|
| Открытие формы, начальное заполнение | ПриСозданииНаСервере |
| Действие после открытия на клиенте | ПриОткрытии |
| Нажатие кнопки | Процедура команды, указанная в свойстве «Действие» команды формы |
| Изменение поля | Обработчик ПриИзменении элемента |
| Запись документа из формы | ПередЗаписью в форме или ПередЗаписью в модуле объекта |
| Проведение | ОбработкаПроведения в модуле объекта документа |
Не знаете, какая процедура вызывается при нажатии кнопки? Откройте форму в редакторе, выделите кнопку, в свойствах посмотрите имя команды, затем у команды — свойство «Действие». Это имя процедуры в модуле формы.
Частая путаница: ставят точку в форме, а логика проведения живёт в модуле объекта или в модуле менеджера. Если форма вызывает серверную функцию, а та — общий модуль, проще поставить точку в первой строке серверной процедуры и пройти дальше клавишей F11.
Отладка на сервере, в фоновых заданиях и через подключение
Это то, чего не хватает большинству инструкций, — а именно здесь отладчик чаще всего «не работает ».
Серверная отладка в клиент-серверной базе
Чтобы отладчик останавливался в серверном коде, сервер 1С:Предприятия должен быть запущен с разрешённой отладкой. Для этого службе агента сервера (ragent) добавляют ключ -debug. В современных версиях 8.3 отладка идёт по протоколу HTTP, тогда к нему добавляют -http.
Ключи прописываются в параметрах запуска службы «Агент сервера 1С:Предприятия» (строка пути к ragent.exe в свойствах службы Windows).
Изменение ключей требует перезапуска службы агента сервера. При перезапуске оборвутся все сеансы пользователей этого сервера — делайте это вне рабочего времени и на тестовом сервере, а не на продуктивном.
Протокол отладки, который использует сам Конфигуратор, задаётся в Сервис → Параметры, на вкладке «Отладка». Он должен совпадать с тем, как запущен сервер.
Подключение к уже запущенному сеансу
Если 1С:Предприятие запущено не из Конфигуратора, его можно подключить к отладке позже:
- Запустите клиент с параметром командной строки
/Debug(или пропишите его в дополнительных параметрах запуска базы в окне выбора баз). - В Конфигураторе откройте
Отладка → Подключение. - В списке доступных предметов отладки выберите нужный сеанс и подключите его.
Фоновые и регламентные задания
Код регламентного задания выполняется не в вашем клиенте, поэтому точка в его процедуре просто так не сработает. В окне Отладка → Подключение есть кнопка автоматического подключения: в её настройках отметьте тип предмета отладки «Фоновое задание». После этого каждое запущенное фоновое задание будет подключаться к отладчику и останавливаться на ваших точках.
💡 Быстрый обходной путь: вызвать ту же процедуру из обработки или из окна «Вычислить выражение» в своём сеансе. Тогда код выполнится в контексте, который уже подключён к отладке.
Продвинутые приёмы отладки
Когда точка уже сработала, полезны ещё несколько инструментов меню Отладка.
- 📚 Стек вызовов. Показывает цепочку процедур, которая привела к текущей строке. Двойной щелчок по строке стека переносит в вызывающий код. Незаменимо, когда процедура вызывается из десяти мест.
- 📋 Табло. Окно, куда добавляют выражения для постоянного наблюдения. При каждом шаге значения обновляются сами — удобно следить за остатком или счётчиком цикла.
- 🧮 Вычислить выражение (
Shift+F9). Можно не только посмотреть значение, но и выполнить выражение: проверить результат запроса, вызвать функцию, посмотретьЗапрос.Выполнить().Выгрузить()в виде таблицы. - 🛑 Остановка по ошибке. Команда
Отладка → Остановка по ошибкезаставляет отладчик останавливаться в месте, где возникло исключение. В настройках команды можно включить остановку и внутри блоковПопытка … Исключение, а также задать фрагмент текста ошибки, чтобы ловить только нужную. - ⏱️ Замер производительности.
Отладка → Замер производительностипоказывает, сколько раз выполнялась каждая строка и сколько времени заняла. Точки останова тут не нужны: включаете замер, выполняете действие, выключаете и смотрите самые тяжёлые строки.
Как поймать ошибку, если непонятно, где она возникает
- Включите остановку по ошибке и укажите часть текста сообщения, например
Деление на 0. - Повторите действие пользователя в отладочном сеансе.
- Отладчик остановится на строке, где возникло исключение.
- Откройте стек вызовов и поднимитесь по нему до кода, который передал неправильные данные.
Это быстрее, чем расставлять точки наугад по всем модулям.
Почему точка останова не срабатывает
F5) или подключите сеанс через Отладка → Подключение, предварительно запустив клиент с параметром /Debug.F7), иначе строки модуля в отладчике не будут соответствовать выполняемому коду.-debug; протокол отладки в параметрах Конфигуратора должен совпадать с протоколом сервера..epf, что и в Конфигураторе, через Файл → Открыть.Отладка → Подключение или вызовите процедуру вручную из своего сеанса.Отдельно о расширениях. Если доработка сделана в расширении конфигурации, точку ставят в модуле расширения: откройте его через Конфигурация → Расширения конфигурации. Если расширение перехватывает метод с аннотацией &Вместо, исходная процедура типовой конфигурации может вообще не выполниться — и точка в ней не сработает.
Частые вопросы
Сохраняются ли точки останова после закрытия Конфигуратора?
Можно ли изменить значение переменной во время отладки?
Мешают ли точки останова пользователям, если я отлаживаю рабочую базу?
Можно ли отлаживать без Конфигуратора, например в 1С:EDT?
Почему в веб-клиенте точка срабатывает, а в тонком — нет (или наоборот)?
Отладка → Подключение, какие предметы отладки сейчас подключены.