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