Как найти ошибку в коде 1С: от точки останова до технологического журнала
Содержание
Отладчик в 1С живёт в Конфигураторе: меню Отладка, точка останова ставится клавишей F9 на строке кода, а запуск под отладкой — F5. Когда выполнение дойдёт до строки с точкой останова, программа остановится, и вы увидите значения всех переменных в этот момент. Это главный инструмент, а не вставка Сообщить() в код.
Многие так и диагностируют ошибки: натыкают по коду Сообщить(ПеременнаяХ), перезапускают, смотрят в окно сообщений. Способ рабочий, но слепой — вы видите только то, что заранее догадались вывести. Отладчик показывает всё состояние сразу: переменные, стек вызовов, можно пройти код построчно и поменять значение на лету.
Ниже — как настроить отладку в файловой и клиент-серверной базе, разобрать медленный запрос, поймать ошибку в фоновом задании и в обмене данными. Всё про платформу 8.3 с интерфейсом «Такси».
Включение отладки и первая точка останова
Отладку нужно сначала разрешить — по умолчанию в рабочей базе она часто выключена.
Файловая база. Разрешение обычно уже есть. Если точки останова не срабатывают, откройте в Конфигураторе Сервис → Параметры → Запуск 1С:Предприятия → Отладка и включите протокол отладки (по умолчанию — по HTTP).
Клиент-серверная база . Здесь отладку надо включить в двух местах:
- В свойствах информационной базы (окно запуска, кнопка
Изменить) отметитьРазрешить отладку. - На сервере разрешить отладку рабочих процессов — в настройках агента сервера (служба
ragent) или через консоль администрирования кластера.
Отладку в рабочей базе включают осознанно. Разрешённая отладка на сервере чуть замедляет работу и открывает подключение к рабочим процессам — на боевом сервере её держат выключенной, а включают на время разбора проблемы.
Протокол отладки по умолчанию — по HTTP: он работает и в файловом, и в клиент-серверном режиме и пробивается через типовые сетевые ограничения проще старого протокола по TCP/IP. Если отладчик не видит предмет отладки на другом компьютере, в первую очередь проверяют, совпадает ли протокол в Конфигураторе и в параметрах запуска, и не блокирует ли соединение брандмауэр.
Дальше — сама точка останова:
- Откройте нужный модуль (модуль формы, общий модуль, модуль объекта).
- Встаньте на строку кода и нажмите
F9— слева появится красный кружок. - Запустите 1С:Предприятие под отладкой клавишей
F5. - Выполните в программе действие, которое проходит через этот код.
Как только управление дойдёт до строки, Конфигуратор выйдет на передний план и подсветит её жёлтой стрелкой. Выполнение приостановлено — можно смотреть значения.
Если строк, где может быть ошибка, много, поставьте условную точку останова: правой кнопкой по кружку → Условие останова → впишите выражение вроде Контрагент.Код = "000012". Остановка сработает только когда условие истинно — не придётся жать «продолжить» сотню раз.
Пошаговое выполнение и просмотр значений
Когда программа остановилась, вами управляют несколько клавиш:
| Клавиша | Действие |
|---|---|
F5 | Продолжить до следующей точки останова |
F10 | Шаг — выполнить строку, не заходя в вызванные процедуры |
F11 | Шаг со входом — зайти внутрь вызываемой процедуры |
Shift+F11 | Выйти из текущей процедуры наружу |
Shift+F5 | Остановить отладку |
Чтобы посмотреть значение переменной, наведите на неё курсор — всплывёт подсказка. Для сложных объектов (ссылка, структура, таблица значений) этого мало.
Табло (Отладка → Табло) — окно, куда перетаскиваете выражения и переменные, чтобы следить за ними постоянно. Таблицу значений или структуру можно раскрыть по строкам и колонкам, как дерево.
Вычислить выражение (Shift+F9) — отдельное окно, где прямо во время остановки пишете любое выражение на встроенном языке и получаете результат. Удобно проверить, что вернёт запрос или метод с текущими данными: впишите Товары.Итог("Сумма") и увидите число, не меняя код.
Стек вызовов (Отладка → Стек вызовов) показывает, откуда программа пришла в эту точку: какая процедура вызвала какую. По стеку кликаете на любой уровень и смотрите переменные уже того контекста — так находят, где именно подменились данные.
Значение переменной в окне Вычислить выражение можно не только посмотреть, но и присвоить заново. Это помогает проверить гипотезу «а если бы здесь был не ноль» без правки и перезапуска.
Отладка без точек останова
Иногда остановиться негде: ошибка плавает, воспроизводится у одного пользователя раз в день, или код выполняется там, куда отладчиком не подключиться. Тогда работают пассивные методы.
Запись в журнал регистрации. Метод ЗаписьЖурналаРегистрации() оставляет след в журнале базы — он виден в режиме предприятия (Все функции → Журнал регистрации) и в Конфигураторе. В отличие от Сообщить(), запись сохраняется и доступна администратору постфактум:
ЗаписьЖурналаРегистрации("ОбменДанными.Диагностика",
УровеньЖурналаРегистрации.Информация,,,
"ID документа: " + Строка(Документ) + ", статус: " + Статус);
Технологический журнал. Это низкоуровневый лог платформы: он пишет вызовы СУБД, исключения, обращения к серверу. Включается файлом logcfg.xml в каталоге conf платформы. Тяжёлый инструмент — его держат выключенным и включают на время воспроизведения проблемы, иначе он быстро забьёт диск.
Замер производительности (Отладка → Замер производительности) — включаете замер, повторяете медленное действие, выключаете. Платформа покажет таблицу: какая строка кода сколько раз выполнялась и сколько заняла. Узкое место видно сразу — обычно это одна-две строки с запросом внутри цикла.
Технологический журнал и замер производительности нагружают систему. На рабочем сервере включайте их адресно и выключайте сразу после сбора данных.
Отладка медленных запросов и поиск узких мест
Чаще всего «1С тормозит» — это не платформа, а конкретный запрос. Разбирают его так:
- Замером находите строку с медленным запросом (см. выше).
- Консолью запросов (внешняя обработка) выполняете этот запрос отдельно, подставляя реальные параметры, и смотрите время и число строк.
- Конструктором запроса раскладываете его на части: временные таблицы, соединения, условия.
Типичные причины медленного запроса:
- 🐌 запрос внутри цикла — вместо одного запроса на всё их выполняется сотни;
- 🐌 соединение с подзапросом или виртуальной таблицей без отбора — читается вся таблица;
- 🐌 отбор не по индексируемым полям — СУБД перебирает записи подряд;
- 🐌 получение реквизита через точку в цикле (
Выборка.Номенклатура.Артикул) — скрытый запрос на каждой итерации.
Чтобы увидеть, что реально делает СУБД, включают в технологическом журнале события обращения к базе данных и смотрят текст SQL и план его выполнения. Для клиент-серверной базы на MS SQL или PostgreSQL план запроса анализируют уже средствами самой СУБД.
Отдельная ловушка — запрос, который быстр на тестовой базе и медленный на рабочей. Причина почти всегда в объёме: на пустой базе СУБД читает всё целиком быстрее любого индекса, а на миллионах строк тот же запрос без подходящего индекса начинает перебирать таблицу. Поэтому медленные места ищут на копии рабочей базы с реальными данными, а не на демо.
Отладка → Подключение и отметьте нужный предмет отладки (сервер, фоновые задания).Разрешить отладку, либо отладка выключена на сервере. Включите в обоих местах и перезапустите сеанс.F10.Отладка фоновых и регламентных заданий
Фоновое задание выполняется не в вашем сеансе, поэтому обычная точка останова его не ловит — нужно явно сказать отладчику, что вы хотите за ним следить.
Откройте Отладка → Подключение (предметы отладки). В списке отметьте флажок Фоновые задания и, для клиент-серверной базы, серверные предметы отладки. После этого:
- Поставьте точку останова в коде, который выполняет задание (обычно это общий модуль с процедурой-обработчиком).
- Убедитесь, что в окне подключения фоновые задания отмечены.
- Запустите задание — вручную через
Администрированиеили дождитесь планового запуска.
Когда задание стартует и дойдёт до точки, отладчик остановит его так же, как обычный код.
Нюансы по режимам:
- Клиент-серверная база. Регламентные задания выполняются на сервере. Нужна разрешённая серверная отладка, иначе остановки не будет.
- Файловая база. Регламентные задания по умолчанию не запускаются сами по расписанию — их выполняет механизм, который работает только пока открыт сеанс. Для отладки задание обычно запускают принудительно из кода или обработки.
Если задание падает молча, добавьте в его код запись в журнал регистрации на входе и на выходе. По журналу сразу видно, стартовало ли оно вообще и на каком шаге оборвалось.
Отладка обменов, HTTP- и web-сервисов
Обмен данными и внешние вызовы отлаживают по тому же принципу: выбрать правильный предмет отладки и уметь посмотреть, что реально пришло и ушло.
Правила обмена (конвертация данных). В «Конвертации данных» 2.x есть собственный режим отладки: при генерации правил включается выгрузка во внешний модуль, и его отлаживают в отдельной базе-конфигураторе. Для «Конвертации данных» 3.x отладку правил ведут через подключаемое расширение к базе-источнику или приёмнику.
HTTP- и web-сервисы. Чтобы остановиться в коде сервиса, в окне Отладка → Подключение отметьте соответствующие предметы отладки (WS-соединения, HTTP-сервисы, внешние соединения). Точка останова в модуле сервиса сработает, когда придёт внешний запрос.
Что проверяют при разборе обмена:
- 📦 что именно пришло — тело запроса, заголовки, кодировку. Залогируйте входящий пакет в журнал регистрации до разбора.
- 📦 что ушло в ответ — тело и код ответа (
200,400,500). - 📦 на каком элементе данных сломалась выгрузка или загрузка — по journal или по счётчику обработанных объектов.
Для внешних сервисов полезно сначала повторить запрос вне 1С — браузером или утилитой вроде Postman — и убедиться, что проблема в данных, а не в коде 1С.
Автоматизация отладки и внешние инструменты
Когда правок много, каждую проверять руками дорого. Ошибки ловят заранее.
Проверка модулей. В Конфигураторе Конфигурация → Проверка модулей находит синтаксические ошибки и часть логических (необъявленные переменные, недостижимый код) без запуска.
Синтаксический контроль конкретного модуля — кнопка на панели редактора кода или Ctrl+F7 — проверяет один модуль на лету.
Автотесты. Поведение кода закрепляют тестами: сценарии прогоняются автоматически и сразу показывают, что сломалось после правки. В экосистеме 1С для этого используют инструменты сообщества (сценарное тестирование, модульные тесты на встроенном языке). Это не часть типовой платформы, но широко применяется в командной разработке.
EDT. Среда 1C:Enterprise Development Tools (на базе Eclipse) имеет собственный отладчик и статический анализатор кода, который подсвечивает проблемные места прямо при наборе — глубже, чем проверка в Конфигураторе.
Технологический журнал как постоянный монитор. На проде его не держат включённым, но настраивают так, чтобы он писал только исключения (EXCP) и долгие операции. Тогда после сбоя есть готовый след для разбора.
Самое дешёвое средство против ошибок — не отладка, а защита в коде: проверяйте входные данные, обрабатывайте исключения через Попытка … Исключение … КонецПопытки и пишите внятные сообщения. Половина вызовов отладчика отпадает, если код сам сообщает, что пошло не так.
Частые вопросы
Почему точка останова серая и не срабатывает?
F7), откройте Отладка → Подключение и отметьте нужные предметы — сервер, фоновые задания, сервисы.Можно ли отлаживать прямо в рабочей базе?
Чем отладка отличается от замера производительности?
Как поймать ошибку, которая возникает только у одного пользователя?
Нужно ли удалять `Сообщить()` и логи из кода после отладки?
Сообщить() — да, они мешают пользователю и выдают внутренние данные. Записи в журнал регистрации на ключевых операциях обмена и заданий часто оставляют намеренно — они помогают при разборе инцидентов.