Как переопределить стандартную кнопку Сформировать во внешнем отчете 1С и вывести результат в новое окно?

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

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

Анализ проблемы стандартной команды

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

Выясним причину, по которой нам может потребоваться вмешательство:

  1. Необходимость постобработки табличного документа на клиенте (например, вызов метода Показать()).
  2. Вывод данных в несколько разных табличных документов.
  3. Интеграция с другими формами или запуск специфических клиентских сценариев перед началом формирования.

Способ 1: Создание собственной формы и подмена кнопок

Это самый надежный и гибкий метод для внешнего отчета. Разберем его по шагам. Вместо того чтобы пытаться «взломать» стандартную команду, мы создадим визуальную копию стандартного интерфейса, но с полным контролем над кодом.

Во-первых, создадим свою форму отчета и назначим её основной. Нам потребуется добавить на форму стандартные реквизиты: Отчет и Результат (типа ТабличныйДокумент). Чтобы интерфейс выглядел привычно, выполним следующие действия:

  1. В редакторе формы найдем стандартную командную панель.
  2. Скроем системную кнопку формирования. Проанализируем код в обработчике ПриСозданииНаСервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Находим стандартную кнопку формирования и скрываем её
    ЭлементКнопка = Элементы.Найти("ФормаСформировать");
    Если ЭлементКнопка <> Неопределено Тогда
        ЭлементКнопка.Видимость = Ложь;
    КонецЕсли;
КонецПроцедуры

Затем создадим свою команду формы, назовем её, например, СформироватьКастом. В свойствах этой команды обязательно установим Сочетание клавишCtrl+Enter и свойство Кнопка по умолчаниюИстина. Это обеспечит привычное поведение пользователя.

Способ 2: Программная компоновка и вывод в новое окно

Рассмотрим ситуацию, когда нам нужно открыть сформированный отчет в новом окне. Поскольку метод Показать() доступен только на клиенте, наша процедура-обработчик будет выглядеть следующим образом:


&НаКлиенте
Процедура СформироватьКастом(Команда)
    
    // Очищаем текущий результат на форме, если это необходимо
    Результат.Очистить();
    
    // Вызываем серверный метод для компоновки результата
    СформироватьОтчетНаСервере();
    
    // Открываем результат в новом окне
    // Параметр "Заголовок" позволит пользователю ориентироваться в окнах
    Результат.Показать("Результат формирования отчета");
    
КонецПроцедуры

&НаСервере
Процедура СформироватьОтчетНаСервере()
    
    // Используем стандартный метод отчета для формирования СКД
    // Это позволит применить все пользовательские настройки, отборы и параметры
    ЭтотОбъект.СкомпоноватьРезультат(Результат);
    
КонецПроцедуры

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

Способ 3: Перехват через ПриКомпоновкеРезультата

Если нам не хочется менять форму, мы можем попробовать использовать модуль объекта отчета. Посмотрим на процедуру ПриКомпоновкеРезультата. Однако здесь есть важный нюанс: эта процедура выполняется на сервере, и мы не можем напрямую вызвать открытие окна отсюда.

Рассмотрим алгоритм действий в этом случае:

  1. В модуле объекта прописываем СтандартнаяОбработка = Ложь.
  2. Программно формируем ТабличныйДокумент.
  3. Если нам всё же нужно клиентское действие, этот метод нам не подойдет напрямую, так как он не возвращает управление на клиент до завершения процесса формирования в стандартном контейнере.

Работа с вариантами отчетов

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

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

Использование возможностей БСП

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

Например, можно использовать расширение формы для перехвата команды формирования. Посмотрим на пример использования аннотации &Вместо (если вы решите включить отчет в состав расширения конфигурации):


&Вместо("Сформировать")
&НаКлиенте
Процедура Расш_Сформировать(Команда)
    // Выполняем стандартную логику, если нужно
    ПродолжитьВызов(Команда);
    
    // Добавляем свою логику открытия окна
    Результат.Показать("Дополнительное окно");
КонецПроцедуры

Однако для строго внешних отчетов (файлов .erf) наиболее правильным путем остается Создание собственной формы + Скрытие стандартной кнопки + Программный вызов СкомпоноватьРезультат. Это гарантирует стабильную работу независимо от обновлений платформы и изменений в БСП.

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

← На главную