Почему внешний отчет СКД не формируется сразу при открытии и как это исправить

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

При разработке внешних отчетов на базе системы компоновки данных (СКД) для типовых конфигураций (таких как 1С:Управление торговлей, 1С:ERP, 1С:Комплексная автоматизация) разработчики часто сталкиваются с задачей автоматического формирования отчета сразу при его открытии. Казалось бы, в модуль внешнего отчета добавлена экспортная процедура ОпределитьНастройкиФормы, внутри взведен флаг Настройки.ФормироватьСразу = Истина, однако отчет все равно открывается пустым и требует нажатия кнопки Сформировать.

Разберем причины такого поведения платформы и подсистемы БСП, а также выясним, какие параметры необходимо настроить для гарантированного автоформирования отчета.

Основная причина: регистрация в подсистеме внешних отчетов и обработок (БСП)

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

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

Посмотрим на пример правильного заполнения таблицы или структуры параметров регистрации:


Функция СведенияОВнешнейОбработке() Экспорт

    РегистрационныеДанные = Новый Структура;
    РегистрационныеДанные.Вставить("Вид", "ДополнительныйОтчет");
    РегистрационныеДанные.Вставить("Версия", "1.0");
    РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
    
    // Обязательный параметр для интеграции с БСП:
    РегистрационныеДанные.Вставить("ОпределитьНастройкиФормы", Истина);
    
    // Настройка команд отчета
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Основной", "Основной", "ОткрытиеФормы", Истина);
    РегистрационныеДанные.Вставить("Команды", ТаблицаКоманд);
    
    Возврат РегистрационныеДанные;

КонецФункции

Если строка РегистрационныеДанные.Вставить("ОпределитьНастройкиФормы", Истина); отсутствует, общая типовая форма отчета просто пропустит вызов процедуры ОпределитьНастройкиФормы, и флаг Настройки.ФормироватьСразу = Истина не будет прочитан.

Сама процедура в модуле объекта при этом выглядит следующим образом:


Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.ФормироватьСразу = Истина;
КонецПроцедуры

Использование стандартной формы отчета

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

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

  1. Отправку отчета по электронной почте прямо из формы.
  2. Штатные механизмы сохранения и загрузки пользовательских вариантов настроек.
  3. Рассылку отчетов по расписанию и расширенное управление группировками.

Если отчет использует форму по умолчанию, платформа открывает общую форму отчета БСП, которая полностью отрабатывает алгоритмы настройки при открытии.

Дополнительные факторы, блокирующие автоформирование

Если регистрация в СведенияОВнешнейОбработке() выполнена и используется типовая форма, но отчет все равно не формируется, проанализируем следующие моменты:

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

Альтернативные варианты формирования отчета при открытии

Разберем другие способы решения задачи, если отчет открывается программно или имеет собственную форму.

Способ 1. Программное открытие с параметром формы

При программном вызове формы из другой обработки или формы документа можно передать стандартный платформенный параметр:


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

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

Этот параметр поддерживается стандартным расширением формы отчета и заставляет систему запустить компоновку данных сразу после открытия.

Способ 2. Автоматическое формирование в собственной форме

Если создание индивидуальной формы неизбежно, вызов формирования можно реализовать в клиентском событии ПриОткрытии самой формы отчета:


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

Либо можно использовать программный вызов команды компоновки на сервере, передав табличный документ для вывода: ОтчетОбъект.СкомпоноватьРезультат(Элементы.Результат).

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

← На главную