Как отладить внешнюю обработку из справочника дополнительных обработок БСП

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

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

Почему обычная отладка не работает?

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

Дополнительно процесс усложняют следующие факторы:

  1. Фоновые задания: БСП часто запускает обработку на сервере в фоновом режиме, из-за чего отладчик без специальных настроек пропускает точки останова.
  2. Кэширование платформы: Платформа 1С кэширует код внешних обработок. Даже если вы обновили файл в справочнике, в сеансе может выполняться его старая версия.

Способ 1. Подмена файла через расширение конфигурации (Рекомендуемый метод)

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

Разберем этот процесс по шагам:

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

&Вместо("ПодключитьВнешнююОбработку")
Функция Мой_ПодключитьВнешнююОбработку(Ссылка) Экспорт
    // Проверяем, что подключается именно наша отлаживаемая обработка
    Если Ссылка.Наименование = "МойРасчетРеквизитов" Тогда
        // Подключаем локальный файл напрямую с диска разработчика
        ИмяОбработки = ВнешниеОбработки.Подключить("C:\Debug\MyProcessing.epf", , Ложь);
        Возврат ИмяОбработки;
    КонецЕсли;
    
    // Для всех остальных обработок вызываем стандартное поведение
    Возврат ПродолжитьВызов(Ссылка);
    КонецФункции

После этого мы можем открыть файл C:\Debug\MyProcessing.epf в конфигураторе, расставить в нем точки останова и запустить процесс в режиме предприятия. Программа автоматически выполнит локальный файл с диска, и отладчик сработает в нужных местах.

Способ 2. Эмуляция вызова обработки из внешней формы (без изменения конфигурации)

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

Проанализируем алгоритм создания такой эмуляции:

  1. Откроем нашу внешнюю обработку в конфигураторе и добавим в нее новую форму (сделаем ее основной формой обработки).
  2. Добавим на форму реквизит СсылкаНаОбъект с типом документа или справочника, для которого предназначена обработка.
  3. Вынесем этот реквизит на форму и создадим кнопку «Выполнить отладку».
  4. В обработчике команды кнопки пропишем код, который подготавливает параметры (например, структуру ПараметрыВыполнения) и вызывает экспортные процедуры модуля объекта обработки:

&НаКлиенте
Процедура ВыполнитьОтладку(Команда)
    ВыполнитьОтладкуНаСервере(СсылкаНаОбъект);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьОтладкуНаСервере(ТестовыйОбъект)
    // Создаем экземпляр обработки из текущего файла на диске
    АдресФайла = "C:\Debug\MyProcessing.epf";
    ИмяОбработки = ВнешниеОбработки.Подключить(АдресФайла, , Ложь);
    ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбработки);
    
    // Заполняем необходимые параметры, которые обычно передает БСП
    ПараметрыВыполнения = Новый Структура;
    ПараметрыВыполнения.Вставить("ДополнительнаяОбработкаСсылка", Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка());
    
    // Имитируем вызов основной экспортной процедуры обработки
    ОбъектОбработки.ВыполнитьКоманду(ТестовыйОбъект, ПараметрыВыполнения);
КонецПроцедуры

Теперь для отладки достаточно открыть файл обработки через стандартное меню «Файл -> Открыть» в режиме предприятия, выбрать нужный документ-тест и нажать кнопку. Процедура запустится локально, и все точки останова будут успешно перехвачены конфигуратором.

Способ 3. Настройка отладки фоновых заданий и серверного кода

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

  1. Включение отладки на сервере: Убедитесь, что служба сервера «1С:Предприятие» запущена с ключом -debug. Без этого отладка серверного кода невозможна в принципе.
  2. Автоподключение фоновых заданий: В конфигураторе перейдем в меню «Отладка» -> «Подключение...». Нажмем кнопку «Настройка автоматического подключения» и установим флажок напротив пункта «Фоновые задания».
  3. Параметр запуска для обхода фонового режима: Для того чтобы заставить БСП выполнять длительные операции синхронно в вашем текущем сеансе, добавим специальный параметр запуска. В настройках запуска отладки в конфигураторе (в свойствах конфигурации) в поле «Параметры запуска» укажем параметр /C РежимОтладки. Механизмы БСП увидят этот флаг и выполнят код обработки напрямую, без создания фонового процесса.

Полезный лайфхак: борьба с кэшированием обработок платформой

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

Чтобы принудительно сбросить кэш без перезапуска сервера и сеансов, выполните простой трюк: откройте обработку в конфигураторе, зайдите в ее свойства и измените значение свойства «Имя» (например, переименуйте ЗаполнениеТабличнойЧасти в ЗаполнениеТабличнойЧасти_Тест). Сохраните файл и загрузите его в справочник дополнительных обработок. Смена внутреннего идентификатора заставит платформу загрузить обновленный код с нуля.

← На главную