Почему не работают точки останова во внешнем отчете 1С и как программно передать параметры в СКД?

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

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

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

Почему не срабатывают точки останова?

Проанализируем ситуацию. Когда мы открываем файл отчета локально с диска, платформа четко знает путь к исходному коду. Но при вызове из подсистемы дополнительных отчетов запускается экземпляр, сохраненный во временном хранилище конфигурации. Платформа подключает его с помощью метода ВнешниеОбработки.Подключить(), передавая адрес из хранилища. Из-за этого исполняемый код теряет связь с конкретным файлом .erf на вашем жестком диске, и отладчик просто не может сопоставить выполняемые строки с теми, где установлены точки останова.

Способы решения проблемы с отладкой

Разберем по шагам доступные нам варианты возвращения работоспособности отладчика:

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

Как передать параметры во внешний отчет СКД?

Теперь перейдем ко второй проблеме. Допустим, мы программно создаем экземпляр нашего внешнего отчета и пытаемся заполнить параметры СКД, но при открытии отчета они оказываются пустыми или перезаписываются типовыми механизмами (Вариантами отчетов) Библиотеки стандартных подсистем (БСП).

Посмотрим на пример кода, который часто пишут разработчики в попытке передать параметры:


ССылкаОтчета = ДополнительныеОтчетыИОбработкиВызовСервера.ОбъектВнешнейОбработки(ВнешнийОтчетОбработкаДляОткрытияСсылка);
КомпоновщикНастроек = ССылкаОтчета.КомпоновщикНастроек;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Закупка", ПараметрыОтчета.Закупка);
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Реализация", ПараметрыОтчета.Реализация);

КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

При таком подходе настройки часто «теряются». Выясним причину. Дело в том, что КомпоновщикНастроек нужно предварительно инициализировать макетом компоновки. Без инициализации компоновщик не всегда корректно понимает состав доступных параметров.

Инициализация выполняется методом Инициализировать, куда передается источник доступных настроек (например, схема компоновки данных):


КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));

Современный подход в конфигурациях на базе БСП

В современных конфигурациях 1С прямое вмешательство в КомпоновщикНастроек перед открытием формы отчета часто оказывается неэффективным, так как подсистема «Варианты отчетов» загружает свои сохраненные варианты, затирая ваши программные значения. Рассмотрим надежные способы передачи параметров с использованием стандартов БСП.

Способ 1: Передача через параметры открытия формы

Самый безопасный способ — передать значения в саму форму отчета при ее открытии. Мы можем передать туда настройки и дать команду сформировать отчет сразу:


ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);

// Если нужно передать пользовательские настройки
ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);

ОткрытьФорму("ВнешнийОтчет.МойОтчет.Форма", ПараметрыОткрытия);

Способ 2: Использование API БСП для установки параметров

Вместо ручного поиска и установки значений параметров в коллекции, БСП предоставляет удобную функцию. Обратимся к общему модулю:


КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "ИмяПараметра", ЗначениеПараметра);

Способ 3: Переопределение процедур в модуле объекта отчета

Чтобы гарантированно вмешаться в процесс формирования настроек до того, как БСП выведет их на экран пользователю, в модуле объекта внешнего отчета следует использовать специальные экспортные процедуры. Подсистема вызывает их автоматически:

  1. ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) — позволяет задать общие настройки формы.
  2. ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) — именно в этой процедуре мы можем безопасно менять программные параметры.

Важно помнить: если ваш параметр выведен в так называемые «быстрые» пользовательские настройки отчета, то просто изменить системные настройки СКД будет недостаточно. Значение из системных настроек будет перекрыто тем, что сохранено у пользователя. В этом случае необходимо изменять данные именно в ПользовательскиеНастройки, либо перехватывать процесс в обработчике события формы ПередЗагрузкойПользовательскихНастроекНаСервере.

Таким образом, комбинируя правильный подход к отладке (работа с физическим файлом) и корректное использование методов БСП для инициализации параметров, мы сможем создавать гибкие и надежные внешние отчеты.

← На главную