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