При выполнении длительной обработки разработчики нередко сталкиваются с ситуацией, когда сеанс «1С:Предприятия» перестает отвечать, сетевой обмен идет, но видимого прогресса нет. Классическая установка точек останова наугад часто не дает результата, так как сложно предугадать, в каком именно цикле или методе застрял поток выполнения. Разберем по шагам, как выявить место зацикливания, правильно подключить отладчик и остановить выполнение зависшего алгоритма.
Самый быстрый и наглядный способ понять, где именно крутится зацикленный алгоритм, — это применение встроенного замера производительности Конфигуратора. Если код не заблокирован ожиданием на уровне СУБД, а бесконечно выполняет итерации цикла, счетчик вызовов определенных строк кода будет стремительно расти.
Выполним следующие действия для локализации проблемного участка:
Для или Пока.Если код выполняется в основном потоке клиентского или серверного приложения, можно воспользоваться командой прерывания. В главном меню Конфигуратора перейдем в пункт Отладка — Остановить (или используем комбинацию горячих клавиш). При этом платформа немедленно приостановит исполнение на текущей выполняемой строке кода встроенного языка и передаст управление разработчику.
Однако данный способ имеет ряд важных ограничений, которые необходимо учитывать:
Выполнить() или Вычислить().В современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) подавляющее большинство тяжелых операций выносится в фоновые задания через модуль ДлительныеОперации. В этом случае основной клиентский интерфейс лишь опрашивает сервер о статусе готовности, а зацикливание происходит в отдельном фоновом потоке, который отладчик по умолчанию не отслеживает.
Чтобы упростить отладку и заставить код выполняться синхронно прямо в контексте текущего сеанса, запустим клиентское приложение с параметром РежимОтладки. Выполним настройку запуска в Конфигураторе:
РежимОтладки.При наличии данного параметра механизмы БСП отключают запуск фоновых потоков и выполняют серверную процедуру непосредственно в текущем вызове. В такой ситуации стандартная точка останова в модуле сработает гарантированно.
Если логику работы фонового задания необходимо проверить в его реальном асинхронном виде, настроим параметры перехвата серверных потоков в Конфигураторе:
Важное условие: служба кластера серверов 1С (ragent) должна быть предварительно запущена с ключом отладки (параметр -debug или настроенная отладка по протоколу HTTP), иначе перехват серверных модулей и фоновых заданий будет невозможен.
Если проблемный алгоритм находится во внешней обработке, частой ошибкой является попытка отладить файл, открытый в сеансе из справочника Дополнительные отчеты и обработки. В этот момент конфигурация помещает двоичные данные файла во временное хранилище или кэш. Идентификатор исполняемого модуля перестает совпадать с файлом обработки, открытым в Конфигураторе, и точки останова игнорируются.
Чтобы точка останова сработала:
Когда отладчик по сетевым или системным причинам недоступен, проанализируем выполнение алгоритма с помощью явного вывода информации о шагах итерации. Добавим в подозрительный цикл запись событий в журнал регистрации:
Индекс = 0;
Для Каждого СтрокаТаблицы Из ТаблицаДанных Цикл
Индекс = Индекс + 1;
Если Индекс % 100 = 0 Тогда
ЗаписьЖурналаРегистрации("ОтладкаЗацикливания",
УровеньЖурналаРегистрации.Информация,,,
"Обработано строк: " + Строка(Индекс));
КонецЕсли;
КонецЦикла;
Периодическая фиксация прогресса позволяет быстро определить в окне журнала регистрации, выполняется ли цикл в данный момент, на каком шаге он остановился или почему счетчик начал крутиться бесконечно.
Если отладка и замер производительности показывают, что код не выполняет полезных инструкций, выясним, не завис ли сеанс на уровне СУБД. В утилите администрирования кластера серверов 1С перейдем в ветку Сеансы, найдем сеанс пользователя и проанализируем параметры: