Разберем ситуацию, которая часто встречается при работе с современными типовыми конфигурациями (УТ 11, ERP, КА) и платформой 1С:Предприятие 8.3.25: вы пытаетесь отладить код, ставите точки останова, включаете режим Останавливаться по ошибке, но система игнорирует ваши действия, выдает ошибку в пользовательском интерфейсе и не дает проанализировать стек вызовов. Рассмотрим пошагово, как настроить среду разработки, чтобы найти «неуловимую» ошибку.
Прежде всего, выясним причину, по которой Конфигуратор может не видеть сеанс пользователя. Основное условие для работы отладчика — запуск службы сервера с ключом -debug. Проверим это совместно с системным администратором или самостоятельно через реестр Windows. Путь к исполняемому файлу должен выглядеть примерно так:
"C:\Program Files\1cv8\8.3.25.1374\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug
Важно помнить: в последних версиях платформы (8.3.20+) классический протокол TCP/IP может работать нестабильно. Рекомендуем переключиться на HTTP-отладку. Для этого в параметрах конфигуратора (Меню Сервис — Параметры — Отладка) выберем протокол HTTP и укажем адрес сервера отладки.
Часто проблема заключается в том, что конфигуратор автоматически подключается только к тонкому клиенту, игнорируя серверные вызовы. Проанализируем состояние окна подключения (Отладка — Подключение):
Клиент, другая с типом Сервер.В нашем случае пользователь сталкивается с ошибкой Значение не является значением объектного типа (МассивПараметров) в модуле ВзаиморасчетыСервер, но при остановке по ошибке стек вызовов пуст. Рассмотрим подробнее, почему так происходит. В УТ 11 многие механизмы (особенно взаиморасчеты) вынесены в Фоновые задания.
Когда код исполняется в фоне, ваш текущий сеанс Конфигуратора его «не видит», так как это отдельный серверный процесс. Чтобы отловить такую ошибку, мы должны заставить систему выполнять код синхронно. Для конфигураций на базе БСП (Библиотеки стандартных подсистем) используем специальный параметр запуска. Зайдем в Сервис — Параметры — Запуск 1С:Предприятия — Дополнительно и в поле Параметры запуска впишем:
/C РежимОтладки
Этот ключ сообщает системе, что фоновые задания (например, расчет взаиморасчетов при записи документа) нужно выполнять в текущем сеансе. Это позволит отладчику остановиться на нужной строке кода.
Если мы не знаем, в какую процедуру заходит программа перед вылетом, и точки останова в ОбработкаЗаполнения или ПриСозданииНаСервере не помогают, используем Замер производительности. Рассмотрим этот алгоритм:
Перед нами откроется полная трассировка всех выполненных процедур. Проанализируем колонку Количество вызовов и Текст строки кода. Найдем последние исполненные строки перед возникновением исключения. Именно туда следует поставить точку останова.
Если мы работаем с «симбиозом» старых доработок и новой типовой конфигурации, велика вероятность, что ошибка происходит в Подписках на события. Посмотрим на структуру вызовов при создании документа ЗаказПоставщику:
// В типовой конфигурации последовательность может быть такой:
// 1. Модуль менеджера (ОбработкаЗаполнения)
// 2. Подписки на события (перед созданием, при создании)
// 3. Модуль объекта (ОбработкаЗаполнения)
// 4. Модуль формы (ПриСозданииНаСервере)
Поставим точки останова не только в форме, но и в модуле объекта. Чтобы гарантированно прервать выполнение, можно использовать метод ВызватьИсключение в самом начале процедуры ОбработкаЗаполнения:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// Временная вставка для принудительной остановки
ВызватьИсключение "Проверка точки входа";
КонецПроцедуры
Если система не остановилась даже здесь, значит, ошибка происходит еще раньше — на этапе инициализации параметров формы или в правах доступа (Rls).
Проанализировав ситуацию, мы пришли к выводу, что для успешной отладки сложных документов в УТ 11 необходимо:
-debug в параметрах службы 1С./C РежимОтладки для «приземления» фоновых заданий в текущий сеанс.Эти шаги позволят нам пройти путь от нажатия кнопки до строки с ошибкой, даже если код сильно модифицирован и содержит множество вложенных вызовов в общих модулях.