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