Как найти ошибку в коде 1С: от точки останова до технологического журнала

· 9 мин

Содержание

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

Многие так и диагностируют ошибки: натыкают по коду Сообщить(ПеременнаяХ), перезапускают, смотрят в окно сообщений. Способ рабочий, но слепой — вы видите только то, что заранее догадались вывести. Отладчик показывает всё состояние сразу: переменные, стек вызовов, можно пройти код построчно и поменять значение на лету.

Ниже — как настроить отладку в файловой и клиент-серверной базе, разобрать медленный запрос, поймать ошибку в фоновом задании и в обмене данными. Всё про платформу 8.3 с интерфейсом «Такси».

Включение отладки и первая точка останова

Отладку нужно сначала разрешить — по умолчанию в рабочей базе она часто выключена.

Файловая база. Разрешение обычно уже есть. Если точки останова не срабатывают, откройте в Конфигураторе Сервис → Параметры → Запуск 1С:Предприятия → Отладка и включите протокол отладки (по умолчанию — по HTTP).

Клиент-серверная база . Здесь отладку надо включить в двух местах:

  1. В свойствах информационной базы (окно запуска, кнопка Изменить) отметить Разрешить отладку.
  2. На сервере разрешить отладку рабочих процессов — в настройках агента сервера (служба ragent) или через консоль администрирования кластера.

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

Протокол отладки по умолчанию — по HTTP: он работает и в файловом, и в клиент-серверном режиме и пробивается через типовые сетевые ограничения проще старого протокола по TCP/IP. Если отладчик не видит предмет отладки на другом компьютере, в первую очередь проверяют, совпадает ли протокол в Конфигураторе и в параметрах запуска, и не блокирует ли соединение брандмауэр.

Дальше — сама точка останова:

  1. Откройте нужный модуль (модуль формы, общий модуль, модуль объекта).
  2. Встаньте на строку кода и нажмите F9 — слева появится красный кружок.
  3. Запустите 1С:Предприятие под отладкой клавишей F5.
  4. Выполните в программе действие, которое проходит через этот код.

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

Если строк, где может быть ошибка, много, поставьте условную точку останова: правой кнопкой по кружку → Условие останова → впишите выражение вроде Контрагент.Код = "000012". Остановка сработает только когда условие истинно — не придётся жать «продолжить» сотню раз.

Пошаговое выполнение и просмотр значений

Когда программа остановилась, вами управляют несколько клавиш:

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

Чтобы посмотреть значение переменной, наведите на неё курсор — всплывёт подсказка. Для сложных объектов (ссылка, структура, таблица значений) этого мало.

Табло (Отладка → Табло) — окно, куда перетаскиваете выражения и переменные, чтобы следить за ними постоянно. Таблицу значений или структуру можно раскрыть по строкам и колонкам, как дерево.

Вычислить выражение (Shift+F9) — отдельное окно, где прямо во время остановки пишете любое выражение на встроенном языке и получаете результат. Удобно проверить, что вернёт запрос или метод с текущими данными: впишите Товары.Итог("Сумма") и увидите число, не меняя код.

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

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

Отладка без точек останова

Иногда остановиться негде: ошибка плавает, воспроизводится у одного пользователя раз в день, или код выполняется там, куда отладчиком не подключиться. Тогда работают пассивные методы.

Запись в журнал регистрации. Метод ЗаписьЖурналаРегистрации() оставляет след в журнале базы — он виден в режиме предприятия (Все функции → Журнал регистрации) и в Конфигураторе. В отличие от Сообщить(), запись сохраняется и доступна администратору постфактум:

ЗаписьЖурналаРегистрации("ОбменДанными.Диагностика",
    УровеньЖурналаРегистрации.Информация,,,
    "ID документа: " + Строка(Документ) + ", статус: " + Статус);

Технологический журнал. Это низкоуровневый лог платформы: он пишет вызовы СУБД, исключения, обращения к серверу. Включается файлом logcfg.xml в каталоге conf платформы. Тяжёлый инструмент — его держат выключенным и включают на время воспроизведения проблемы, иначе он быстро забьёт диск.

Замер производительности (Отладка → Замер производительности) — включаете замер, повторяете медленное действие, выключаете. Платформа покажет таблицу: какая строка кода сколько раз выполнялась и сколько заняла. Узкое место видно сразу — обычно это одна-две строки с запросом внутри цикла.

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

Отладка медленных запросов и поиск узких мест

Чаще всего «1С тормозит» — это не платформа, а конкретный запрос. Разбирают его так:

  1. Замером находите строку с медленным запросом (см. выше).
  2. Консолью запросов (внешняя обработка) выполняете этот запрос отдельно, подставляя реальные параметры, и смотрите время и число строк.
  3. Конструктором запроса раскладываете его на части: временные таблицы, соединения, условия.

Типичные причины медленного запроса:

  • 🐌 запрос внутри цикла — вместо одного запроса на всё их выполняется сотни;
  • 🐌 соединение с подзапросом или виртуальной таблицей без отбора — читается вся таблица;
  • 🐌 отбор не по индексируемым полям — СУБД перебирает записи подряд;
  • 🐌 получение реквизита через точку в цикле (Выборка.Номенклатура.Артикул) — скрытый запрос на каждой итерации.

Чтобы увидеть, что реально делает СУБД, включают в технологическом журнале события обращения к базе данных и смотрят текст SQL и план его выполнения. Для клиент-серверной базы на MS SQL или PostgreSQL план запроса анализируют уже средствами самой СУБД.

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

Диагностика: выберите симптом

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

Фоновое задание выполняется не в вашем сеансе, поэтому обычная точка останова его не ловит — нужно явно сказать отладчику, что вы хотите за ним следить.

Откройте Отладка → Подключение (предметы отладки). В списке отметьте флажок Фоновые задания и, для клиент-серверной базы, серверные предметы отладки. После этого:

  1. Поставьте точку останова в коде, который выполняет задание (обычно это общий модуль с процедурой-обработчиком).
  2. Убедитесь, что в окне подключения фоновые задания отмечены.
  3. Запустите задание — вручную через Администрирование или дождитесь планового запуска.

Когда задание стартует и дойдёт до точки, отладчик остановит его так же, как обычный код.

Нюансы по режимам:

  • Клиент-серверная база. Регламентные задания выполняются на сервере. Нужна разрешённая серверная отладка, иначе остановки не будет.
  • Файловая база. Регламентные задания по умолчанию не запускаются сами по расписанию — их выполняет механизм, который работает только пока открыт сеанс. Для отладки задание обычно запускают принудительно из кода или обработки.

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

Отладка обменов, 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), откройте Отладка → Подключение и отметьте нужные предметы — сервер, фоновые задания, сервисы.
Можно ли отлаживать прямо в рабочей базе?
Технически да, если отладка разрешена в свойствах ИБ и на сервере. Но остановка на точке подвешивает сеанс, а на сервере отладка чуть тормозит всех. Для разбора лучше развернуть копию базы.
Чем отладка отличается от замера производительности?
Отладка отвечает на вопрос «почему неправильно» — показывает значения и ход выполнения. Замер отвечает «почему медленно» — показывает, какая строка и сколько раз выполнялась и сколько заняла. Это разные задачи.
Как поймать ошибку, которая возникает только у одного пользователя?
Воспроизвести у себя обычно не выходит. Добавьте запись в журнал регистрации в подозрительные места и попросите повторить действие, затем разберите журнал. Либо подключитесь отладчиком к его сеансу, если база клиент-серверная и отладка разрешена.
Нужно ли удалять `Сообщить()` и логи из кода после отладки?
Отладочные Сообщить() — да, они мешают пользователю и выдают внутренние данные. Записи в журнал регистрации на ключевых операциях обмена и заданий часто оставляют намеренно — они помогают при разборе инцидентов.