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