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