Разработка и отладка внешних обработок в среде 1С:Предприятие — это ежедневная задача любого программиста. Однако довольно часто разработчики сталкиваются с крайне неприятной ситуацией: в коде устанавливается точка останова (брейкпоинт), сеанс отладки запущен, код гарантированно выполняется, но программа «пролетает» мимо точки останова, даже не думая останавливаться. Особенно часто это происходит при работе с внешними обработками, созданными на базе Библиотеки Стандартных Подсистем (БСП), или при отладке сложных блоков обработки исключений.
В этой статье мы подробно разберем, почему конфигуратор игнорирует точки останова, проанализируем неочевидные особенности работы платформы 1С с оператором Попытка, рассмотрим специфику отладки механизмов БСП и предоставим пошаговые инструкции по устранению этих проблем.
Рассмотрим самую распространенную ошибку, с которой часто сталкиваются как начинающие, так и опытные разработчики. Вы хотите проверить алгоритм в самом начале выполнения процедуры и устанавливаете точку останова прямо на строку с ключевым словом Попытка. Визуально точка горит ярко-красным цветом, но при выполнении кода отладчик ее полностью игнорирует.
Почему это происходит? Дело в особенностях компиляции исходного кода платформой 1С. Ключевое слово Попытка не генерирует реальных исполняемых инструкций (байт-кода) для виртуальной машины 1С. Это лишь синтаксическая конструкция, указывающая границы защищенного блока кода. Точно так же себя ведут объявления переменных Перем, комментарии или пустые строки. Поскольку исполняемого кода на этой строке нет, отладчик физически не может приостановить на ней выполнение потока.
Проанализируем пример некорректного размещения точки останова:
Процедура ПриОткрытии(Отказ)
// Точка останова на этой строке НЕ СРАБОТАЕТ:
Попытка
ИмяФайла = "C:\temp\data.xml";
ЗапуститьЗагрузку(ИмяФайла);
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Для того чтобы решить эту проблему, перенесем точку останова на следующую строку — на первый исполняемый оператор внутри защищенного блока. В данном случае это строка инициализации переменной ИмяФайла:
Процедура ПриОткрытии(Отказ)
Попытка
// Установите точку останова СЮДА (на первый исполняемый оператор):
ИмяФайла = "C:\temp\data.xml";
ЗапуститьЗагрузку(ИмяФайла);
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
После переноса точки останова на строку с присвоением значения отладка сработает в штатном режиме.
Если вы разрабатываете внешнюю обработку или печатную форму для конфигурации, использующей БСП (например, «1С:Бухгалтерия», «1С:ERP» или «1С:Управление торговлей»), стандартный запуск механизма отладки может не сработать. Вы открываете обработку через интерфейс программы, но конфигуратор упорно проходит мимо всех точек останова.
Выясним причину такого поведения. Когда обработка зарегистрирована в справочнике «Дополнительные отчеты и обработки», БСП работает с ней следующим образом:
Для отладчика конфигуратора файл МояОбработка.epf, открытый у вас на диске, и динамически созданный БСП объект в оперативной памяти — это два абсолютно разных и никак не связанных между собой объекта. Соответственно, точки останова, расставленные в файле на диске, никак не повлияют на выполнение временного файла БСП.
Как правильно отлаживать обработки БСП:
ДополнительныеОтчетыИОбработки. В месте, где происходит подключение обработки из хранилища, пропишите явный путь к локальному файлу на вашем жестком диске. Например:
// Вместо стандартного получения из двоичных данных:
// ИмяОбработки = ПолучитьИзХранилища(Данные);
// Используем временный вызов файла с диска:
ИмяОбработки = Менеджер.Создать("D:\Develop\MyExternalProcessing.epf", Ложь);
Часто разработчики сталкиваются с тем, что в одной процедуре отладка работает отлично, а в другой полностью игнорируется. Например, точка останова срабатывает в процедуре ПриСозданииНаСервере, но не реагирует на событие ПриОткрытии (или наоборот).
Рассмотрим эту проблему подробнее. В управляемом приложении код жестко разделен по контекстам исполнения:
&НаСервере выполняются на сервере приложений 1С.&НаКлиенте (такие как событие формы ПриОткрытии) выполняются на стороне клиентского приложения.Если вы работаете в клиент-серверном варианте базы данных (на базе MS SQL Server, PostgreSQL и т.д.), для отладки серверного кода сервер приложений 1С должен быть запущен в специальном режиме отладки. Если служба ragent запущена без ключа -debug, любые точки останова в серверных процедурах (например, в модулях объектов, менеджеров или в серверных методах форм) работать не будут, тогда как клиентский код отлаживаться продолжит.
В файловом варианте базы данных клиент и сервер выполняются в рамках одного локального процесса, поэтому проблема с параметрами запуска службы сервера отпадает. Однако здесь могут возникнуть проблемы с правами доступа или блокировками со стороны сетевых экранов.
Даже при работе в файловом режиме отладчик конфигуратора взаимодействует с сеансом «1С:Предприятие» по сетевым протоколам (TCP или HTTP). По умолчанию для отладки по протоколу TCP используется пул локальных портов в диапазоне 1560–1591.
Если на вашем компьютере включен встроенный брандмауэр Windows (Firewall) или установлен сторонний антивирус с функцией сетевого экрана, пакеты данных между процессами конфигуратора и предприятия могут блокироваться. Сеанс в списке предметов отладки при этом может отображаться как активный, но сам сигнал о прохождении через точку останова до конфигуратора доходить не будет.
Для решения этой проблемы добавьте исполняемые файлы платформы 1cv8.exe и 1cv8c.exe в список исключений вашего брандмауэра либо временно отключите сетевой экран для проверки работы отладчика.
Начиная с версий платформы 8.3.6, разработчики 1С оптимизировали работу с внешними файлами. Теперь при открытии внешней обработки платформа кэширует ее структуру непосредственно в оперативную память для ускорения работы. Из-за этого периодически возникает рассинхронизация: вы вносите изменения в код обработки в конфигураторе, сохраняете файл на диск, а в режиме Предприятия продолжает крутиться старая закэшированная версия кода.
В таких случаях точка останова может стать «серой» (неактивной) или просто перестать работать.
Как бороться с кэшированием внешних файлов:
/ClearCache).