Часто при разработке мы сталкиваемся с ситуацией: создаем внешний отчет или обработку, добавляем в справочник «Дополнительные отчеты и обработки», ставим точки останова в конфигураторе, запускаем код, но платформа упорно их игнорирует. При этом, если открыть тот же файл через меню «Файл - Открыть», отладка работает безупречно. Рассмотрим подробнее, почему так происходит и как с этим бороться.
Кроме того, мы разберем вторую частую проблему, связанную с внешними отчетами: как правильно программно передать параметры в отчет, построенный на Системе Компоновки Данных (СКД), чтобы они корректно применились при формировании.
Проанализируем ситуацию. Когда мы открываем файл отчета локально с диска, платформа четко знает путь к исходному коду. Но при вызове из подсистемы дополнительных отчетов запускается экземпляр, сохраненный во временном хранилище конфигурации. Платформа подключает его с помощью метода ВнешниеОбработки.Подключить(), передавая адрес из хранилища. Из-за этого исполняемый код теряет связь с конкретным файлом .erf на вашем жестком диске, и отладчик просто не может сопоставить выполняемые строки с теми, где установлены точки останова.
Разберем по шагам доступные нам варианты возвращения работоспособности отладчика:
ДополнительныеОтчетыИОбработки функцию ПодключитьВнешнююОбработку. Закомментируем типовой код вызова из хранилища и временно пропишем прямое создание из файла:
ИмяОбработки = ВнешниеОбработки.Создать("C:\Тест\МойОтчет.erf", Ложь);
При таком подходе файл жестко привязывается к отладчику, и мы спокойно поймаем любую точку останова.Теперь перейдем ко второй проблеме. Допустим, мы программно создаем экземпляр нашего внешнего отчета и пытаемся заполнить параметры СКД, но при открытии отчета они оказываются пустыми или перезаписываются типовыми механизмами (Вариантами отчетов) Библиотеки стандартных подсистем (БСП).
Посмотрим на пример кода, который часто пишут разработчики в попытке передать параметры:
ССылкаОтчета = ДополнительныеОтчетыИОбработкиВызовСервера.ОбъектВнешнейОбработки(ВнешнийОтчетОбработкаДляОткрытияСсылка);
КомпоновщикНастроек = ССылкаОтчета.КомпоновщикНастроек;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Закупка", ПараметрыОтчета.Закупка);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Реализация", ПараметрыОтчета.Реализация);
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
При таком подходе настройки часто «теряются». Выясним причину. Дело в том, что КомпоновщикНастроек нужно предварительно инициализировать макетом компоновки. Без инициализации компоновщик не всегда корректно понимает состав доступных параметров.
Инициализация выполняется методом Инициализировать, куда передается источник доступных настроек (например, схема компоновки данных):
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
В современных конфигурациях 1С прямое вмешательство в КомпоновщикНастроек перед открытием формы отчета часто оказывается неэффективным, так как подсистема «Варианты отчетов» загружает свои сохраненные варианты, затирая ваши программные значения. Рассмотрим надежные способы передачи параметров с использованием стандартов БСП.
Способ 1: Передача через параметры открытия формы
Самый безопасный способ — передать значения в саму форму отчета при ее открытии. Мы можем передать туда настройки и дать команду сформировать отчет сразу:
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
// Если нужно передать пользовательские настройки
ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);
ОткрытьФорму("ВнешнийОтчет.МойОтчет.Форма", ПараметрыОткрытия);
Способ 2: Использование API БСП для установки параметров
Вместо ручного поиска и установки значений параметров в коллекции, БСП предоставляет удобную функцию. Обратимся к общему модулю:
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "ИмяПараметра", ЗначениеПараметра);
Способ 3: Переопределение процедур в модуле объекта отчета
Чтобы гарантированно вмешаться в процесс формирования настроек до того, как БСП выведет их на экран пользователю, в модуле объекта внешнего отчета следует использовать специальные экспортные процедуры. Подсистема вызывает их автоматически:
ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) — позволяет задать общие настройки формы.ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) — именно в этой процедуре мы можем безопасно менять программные параметры.Важно помнить: если ваш параметр выведен в так называемые «быстрые» пользовательские настройки отчета, то просто изменить системные настройки СКД будет недостаточно. Значение из системных настроек будет перекрыто тем, что сохранено у пользователя. В этом случае необходимо изменять данные именно в ПользовательскиеНастройки, либо перехватывать процесс в обработчике события формы ПередЗагрузкойПользовательскихНастроекНаСервере.
Таким образом, комбинируя правильный подход к отладке (работа с физическим файлом) и корректное использование методов БСП для инициализации параметров, мы сможем создавать гибкие и надежные внешние отчеты.