Как программно запустить формирование отчета в 1С с сохранением расшифровки

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

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

Ограничения платформы: почему нельзя просто «нажать» стандартную кнопку из кода

Для начала разберем важный теоретический нюанс. В 1С существует понятие «Источника действий» для командной панели (например, когда источником указана «Форма»). В этом случае платформа автоматически предоставляет набор стандартных команд: «Сформировать», «Закрыть», «Справка» и другие.

Многие начинающие разработчики пытаются найти способ программно сымитировать нажатие этих встроенных кнопок. Однако платформа 1С:Предприятие не предоставляет возможности программно инициировать нажатие стандартных системных кнопок или перехватить их базовые обработчики напрямую из кода. Попытка вызвать событие нажатия скрытой кнопки командной панели также не увенчается успехом.

Какое же решение остается? Единственный верный путь — использовать штатные программные методы объектов, которые выполняют абсолютно те же действия, что и стандартные кнопки интерфейса. Для генерации отчетов СКД таким методом является метод СкомпоноватьРезультат().

Рассмотрим по шагам, как правильно реализовать это решение в различных средах выполнения.

Решение для обычных форм (клиент-серверный режим и толстый клиент)

В обычных формах (которые активно использовались в платформе 8.2 и до сих пор встречаются в legacy-системах на 8.3) за формирование отчета отвечает объект отчета и его метод СкомпоноватьРезультат.

Если мы просто хотим сформировать отчет при открытии или по нажатию нашей собственной кнопки, базовый вызов выглядит следующим образом:

ЭтотОбъект.СкомпоноватьРезультат(ЭлементыФормы.Результат);

В данном примере ЭлементыФормы.Результат — это табличный документ на форме, куда будет выведен сформированный отчет. Однако при таком простом вызове разработчики сразу сталкиваются с проблемой: отчет формируется, но перестает работать расшифровка (двойной клик по ячейкам отчета не вызывает меню действий или детализацию).

Выясним причину этого поведения. По умолчанию метод СкомпоноватьРезультат не инициализирует данные расшифровки, если они не переданы ему явным образом вторым параметром. Чтобы исправить эту ошибку и сохранить интерактивность, необходимо передать переменную для хранения расшифровки:


// Объявляем переменную для хранения данных расшифровки в модуле формы
Перем ДанныеРасшифровки;

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

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

Решение для управляемых форм (Платформа 8.3)

В управляемом приложении работа с отчетами претерпела значительные изменения. Если основным реквизитом вашей управляемой формы является отчет (тип ОтчетОбъект), задача существенно упрощается. У самой управляемой формы появляется стандартный метод СкомпоноватьРезультат(), который можно вызвать на клиенте.

Проанализируем пример вызова в управляемой форме:


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

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

Автоматическое формирование при открытии через параметры формы

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

Рассмотрим, как правильно открыть форму отчета с автоматическим запуском формирования:


ПараметрыОткрытия = Новый Структура;
// Передаем стандартный параметр для автоматического формирования
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);

// При необходимости можем сразу передать нужные отборы
СтруктураОтбора = Новый Структура("Организация", СсылкаНаОрганизацию);
ПараметрыОткрытия.Вставить("Отбор", СтруктураОтбора);

ОткрытьForm = ОткрытьФорму("Отчет.Продажи.Форма", ПараметрыОткрытия);

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

Особенности работы в конфигурациях на базе БСП

Если вы работаете в типовой конфигурации (например, «1С:ERP», «1С:Комплексная автоматизация», «1С:Управление торговлей» или «1С:Бухгалтерия»), разработанной на основе **Библиотеки Стандартных Подсистем (БСП)**, прямой вызов ЭтаФорма.СкомпоноватьРезультат() может привести к нежелательным последствиям.

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

Для корректного программного запуска формирования в контексте БСП следует использовать процедуры общих модулей библиотеки:


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

Этот вызов полностью имитирует нажатие пользователем кнопки «Сформировать» в типовом интерфейсе БСП: запустится фоновое задание, отобразится стандартный индикатор прогресса, а результат запишется в форму с сохранением всех настроек расшифровки.

Ручная серверная компоновка с сохранением расшифровки в управляемых формах

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

В управляемом приложении передать объект расшифровки напрямую вторым параметром (как мы делали это в обычных формах) нельзя, так как объекты компоновки не могут существовать на клиенте в неизменном виде. Вместо этого используется **временное хранилище**.

Разберем по шагам правильный шаблон реализации серверной компоновки:


&НаСервере
Процедура СформироватьОтчетНаСервере()
    
    // 1. Очищаем поле табличного документа на форме
    Результат.Очистить();
    
    // 2. Получаем прикладной объект отчета из реквизита управляемой формы
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    
    // 3. Создаем уникальный адрес во временном хранилище для будущей расшифровки
    АдресДанныхРасшифровки = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
    
    // 4. Запускаем компоновку, передавая адрес хранилища вторым параметром
    ОтчетОбъект.СкомпоноватьРезультат(Результат, АдресДанныхРасшифровки);
    
    // 5. Важно! Записываем полученный адрес в реквизит формы "ДанныеРасшифровки" (тип: Строка)
    // Если этого не сделать, платформа не сможет связать ячейки табличного документа с расшифровкой
    ДанныеРасшифровки = АдресДанныхРасшифровки;
    
КонецПроцедуры

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

Резюме

Мы проанализировали различные методы программного вызова формирования отчетов СКД в системе «1С:Предприятие 8». Подведем итоги:

  1. Имитировать нажатие стандартной системной кнопки напрямую из кода невозможно из-за ограничений платформы.
  2. Для простых обычных форм решением является использование ЭтотОбъект.СкомпоноватьРезультат() с обязательной передачей переменной расшифровки вторым параметром.
  3. В управляемых формах достаточно вызвать клиентский метод формы ЭтаФорма.СкомпоноватьРезультат().
  4. Для автоматического формирования при открытии из внешнего кода используйте параметр формы СформироватьПриОткрытии.
  5. В конфигурациях, использующих БСП, всегда отдавайте предпочтение вызову ОтчетыКлиент.СформироватьОтчет(ЭтаФорма) для поддержки фонового режима выполнения.
← На главную