Как поймать точку останова и найти зацикливание при зависании обработки в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При выполнении длительной обработки разработчики нередко сталкиваются с ситуацией, когда сеанс «1С:Предприятия» перестает отвечать, сетевой обмен идет, но видимого прогресса нет. Классическая установка точек останова наугад часто не дает результата, так как сложно предугадать, в каком именно цикле или методе застрял поток выполнения. Разберем по шагам, как выявить место зацикливания, правильно подключить отладчик и остановить выполнение зависшего алгоритма.

Использование замера производительности

Самый быстрый и наглядный способ понять, где именно крутится зацикленный алгоритм, — это применение встроенного замера производительности Конфигуратора. Если код не заблокирован ожиданием на уровне СУБД, а бесконечно выполняет итерации цикла, счетчик вызовов определенных строк кода будет стремительно расти.

Выполним следующие действия для локализации проблемного участка:

  1. В меню Конфигуратора выберем пункт Отладка — Замер производительности перед запуском зависающего действия или прямо во время его выполнения (если клиентское приложение сохраняет минимальный отклик).
  2. Подождем 10–20 секунд, пока зацикленный фрагмент кода наберет статистику вызовов.
  3. Повторно нажмем Отладка — Замер производительности для завершения сбора данных.
  4. В открывшейся таблице результатов выполним сортировку по колонке Количество или Время. Строки модуля, набравшие десятки или сотни тысяч выполнений за несколько секунд, сразу укажут на тело бесконечного цикла Для или Пока.

Принудительная остановка отладчика

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

Однако данный способ имеет ряд важных ограничений, которые необходимо учитывать:

  1. Команда остановки не сработает в бесфайловых внешних обработках, запущенных из информационной базы через справочник дополнительных отчетов и обработок.
  2. Остановка не перехватит выполнение динамического кода, скомпилированного через конструкцию Выполнить() или Вычислить().
  3. Платформа не сможет остановиться, если сеанс находится не в активном исполнении инструкций встроенного языка, а ожидает ответа от внешнего сервиса или блокировки СУБД.

Запуск сеанса в режиме отладки без фоновых заданий

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

Чтобы упростить отладку и заставить код выполняться синхронно прямо в контексте текущего сеанса, запустим клиентское приложение с параметром РежимОтладки. Выполним настройку запуска в Конфигураторе:

  1. Откроем меню Сервис — Параметры.
  2. Перейдем на вкладку Запуск 1С:Предприятия и выберем подраздел Основные.
  3. В поле Параметр запуска введем строку: РежимОтладки.
  4. Запустим сеанс в режиме отладки (клавиша F5).

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

Настройка автоматического подключения к фоновым заданиям

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

  1. В главном меню Конфигуратора откроем Отладка — Подключение...
  2. Нажмем кнопку Настройка автоматического подключения...
  3. В открывшемся окне обязательно установим флажок Фоновые задания (а также серверные контексты, если они не выбраны).
  4. Нажмем ОК. Теперь при инициализации любого нового фонового задания Конфигуратор автоматически присоединит к нему отладчик, и расставленные точки останова сработают.

Важное условие: служба кластера серверов 1С (ragent) должна быть предварительно запущена с ключом отладки (параметр -debug или настроенная отладка по протоколу HTTP), иначе перехват серверных модулей и фоновых заданий будет невозможен.

Особенности отладки внешних обработок

Если проблемный алгоритм находится во внешней обработке, частой ошибкой является попытка отладить файл, открытый в сеансе из справочника Дополнительные отчеты и обработки. В этот момент конфигурация помещает двоичные данные файла во временное хранилище или кэш. Идентификатор исполняемого модуля перестает совпадать с файлом обработки, открытым в Конфигураторе, и точки останова игнорируются.

Чтобы точка останова сработала:

  1. Откроем внешнюю обработку как отдельный файл через меню Файл — Открыть непосредственно в окне Конфигуратора.
  2. Расставим точки останова в нужных процедурах модуля объекта или формы.
  3. В сеансе «1С:Предприятия» откроем этот же файл с диска через меню Файл — Открыть, не используя механизмы БСП.

Диагностика через журнал регистрации и точечное логирование

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


Индекс = 0;
Для Каждого СтрокаТаблицы Из ТаблицаДанных Цикл
    Индекс = Индекс + 1;
    Если Индекс % 100 = 0 Тогда
        ЗаписьЖурналаРегистрации("ОтладкаЗацикливания",
            УровеньЖурналаРегистрации.Информация,,,
            "Обработано строк: " + Строка(Индекс));
    КонецЕсли;
КонецЦикла;

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

Анализ состояния сеанса в консоли кластера

Если отладка и замер производительности показывают, что код не выполняет полезных инструкций, выясним, не завис ли сеанс на уровне СУБД. В утилите администрирования кластера серверов 1С перейдем в ветку Сеансы, найдем сеанс пользователя и проанализируем параметры:

  1. Время вызова (текущее): если показатель непрерывно увеличивается, сеанс выполняет одну непрерывную серверную операцию.
  2. Захвачено СУБД: если значение времени захвата СУБД не растет, выполняется непрерывный цикл на встроенном языке 1С. Если же значение растет пропорционально времени вызова, платформа ожидает снятия взаимоблокировки таблиц в базе данных или медленного ответа от внешнего источника.
← На главную