Разработчики 1С часто сталкиваются с ситуацией, когда при попытке отладить код внутри фонового задания отладчик ведет себя непредсказуемо. Вы устанавливаете точку остановки, выполнение прерывается, но буквально через пару секунд курсор «прыгает» в другой модуль (например, в ДлительныеОперации или системные модули БСП), хотя там нет никаких точек остановки. Это явление называют «соскальзыванием» или «выбрасыванием» из отладки.
Особенно остро эта проблема проявилась в версиях платформы 8.3.20.1674 и смежных релизах. В этой статье мы подробно разберем причины такого поведения, проанализируем технические нюансы взаимодействия конфигуратора с сервером и рассмотрим все доступные способы решения этой проблемы.
Первым делом нам необходимо понять, что происходит «под капотом» платформы. Когда мы запускаем фоновое задание в режиме отладки, сервер 1С выделяет отдельный рабочий процесс для его выполнения. Отладчик (конфигуратор) должен подключиться к этому конкретному сеансу. Рассмотрим основные причины сбоев:
8.3.21.ДлительныеОперации. В вызывающем потоке (клиентском сеансе) работает цикл ожидания. Если точка остановки удерживает фоновый процесс дольше, чем заданный таймаут (обычно около 1-2 секунд), клиентская часть может решить, что задание зависло или произошло исключение, и инициировать прерывание или повторный запрос, что сбивает фокус отладчика.Проанализируем теперь способы борьбы с этим поведением, начиная от самых простых настроек и заканчивая изменением логики кода.
Одним из самых действенных методов решения проблем со стабильностью отладки в современных версиях 1С является переход на протокол HTTP. Рассмотрим, как это сделать. HTTP-отладка работает через специальный сервис (отладочный сервер), который выступает посредником между предметами отладки и конфигуратором.
Чтобы включить этот режим, необходимо:
-http.Преимущество этого метода: HTTP-протокол более устойчив к «зависаниям» сеансов на точках остановки. Он лучше справляется с ситуацией, когда поток «замер» на длительное время, и предотвращает самопроизвольный переход отладчика в другие модули.
Часто отладчик начинает «соскальзывать», когда в системе открыто слишком много окон или активных сеансов под одним пользователем. Проанализируем простую рекомендацию: попробуйте закрыть клиентское приложение (Тонкий или Толстый клиент) перед началом отладки фонового задания.
Алгоритм действий следующий:
Фоновые задания.Это минимизирует количество контекстов, к которым пытается привязаться отладчик, и снижает вероятность того, что конфигуратор переключится на «соседний» сеанс, вызванный механизмом ожидания БСП.
Если баг платформы не позволяет комфортно работать, самым надежным решением будет временное отключение выполнения кода в фоновом режиме. Рассмотрим, как это реализовать программно. В БСП при вызове длительных операций используется структура параметров.
Найдите место вызова фонового задания и измените свойство ЗапуститьВФоне на значение Ложь. Посмотрим на пример кода:
// До модификации:
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры(УникальныйИдентификатор);
ДлительныеОперации.ВыполнитьПроцедуруВФоне(СтруктураПараметров, "МойМодуль.МояПроцедура", ПараметрыВыполнения);
// После модификации для отладки:
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры(УникальныйИдентификатор);
ПараметрыВыполнения.ЗапуститьВФоне = Ложь; // Принудительно запускаем в основном потоке
ДлительныеОперации.ВыполнитьПроцедуруВФоне(СтруктураПараметров, "МойМодуль.МояПроцедура", ПараметрыВыполнения);
В этом случае код выполнится в контексте вашего текущего сеанса (Тонкого клиента), и отладка будет работать максимально стабильно, так как не произойдет переключения между процессами сервера. После завершения отладки не забудьте вернуть значение Истина.
Если автоматическое подключение подводит, мы можем использовать «хитрость» с принудительной паузой. Это даст нам время вручную найти нужный сеанс в списке доступных для отладки.
Вставьте в начало серверной процедуры следующий код:
Процедура МояФоноваяПроцедура(Параметры) Экспорт
#Если Сервер Тогда
// Задержка на 10 секунд для ручного подключения отладчика
ТекущийМомент = ТекущаяДата();
Пока ТекущаяДата() - ТекущийМомент < 10 Цикл
// Ожидаем
КонецЦикла;
#КонецЕсли
// Далее ваш основной код, на котором стоит точка остановки
Результат = ОбработатьДанные(Параметры);
КонецПроцедуры
Пока выполняется этот пустой цикл, перейдите в конфигуратор: Отладка — Подключение — Доступные диалоги отладки. Найдите там сеанс с типом «Фоновое задание», выделите его и нажмите «Подключить». После этого, когда цикл завершится, отладчик корректно остановится на вашей точке без прыжков в сторону.
Иногда причиной нестабильности становится кэш или оптимизация серверных процессов. Рассмотрим шаги по очистке окружения:
%LOCALAPPDATA%\1C\1cv8.snccntxt (предварительно остановив службу 1С). Это помогает, если индексы строк в исполняемом коде разошлись с текстом модуля в конфигураторе.Попытка...Исключение. Хотя в нормальных условиях это не должно влиять на фокус отладчика, в проблемных релизах платформы любое возникшее (даже обработанное) исключение может привести к сбросу контекста отладки фонового задания.Подведем итог. Если вы столкнулись с «соскальзыванием» отладки в версии 8.3.20, проанализируйте возможность обновления до 8.3.21 или выше. Если обновление невозможно, наиболее эффективным сочетанием будет переход на HTTP-отладку и временная установка флага ЗапуститьВФоне = Ложь в коде вызова длительной операции. Эти меры позволят вам сохранить контроль над процессом и успешно отладить даже самые сложные алгоритмы, работающие на стороне сервера.