Для создания общей команды для запуска конкретного варианта внешнего отчета. Сам отчет включается в дополнительные, а в команде можно указать наименование встроенного варианта отчета (СКД) или добавленного пользователем. Если пользовательский вариант будет удален или переименован, будет открываться первый встроенный вариант отчета.
&НаКлиенте
Функция ДанныеОтчетаИВарианта()
Результат = Новый Структура;
// внести данные по открываемому отчету и варианту
Результат.Вставить("ИмяОтчета", "ОтчетПоПродажамПоПродавцам"); // Имя внешнего отчета.
Результат.Вставить("НаименованиеОтчета", "Отчет по продажам"); // Наименование отчета. Как он зарегистрирован
Результат.Вставить("ИмяВариантаОтчета", "Отчет по продажам (по продавцам)"); // Наименование варианта. Встроенного или пользовательского
Возврат Результат
КонецФункции
#Область ОбработчикиСобытий
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыОтчета = ДанныеОтчетаИВарианта();
//Подключение нужно только для внешнего отчета
Если ПодключитьВнешнийОтчет(ПараметрыОтчета) Тогда
КлючВарианта = ПолучитьКлючВариантаОтчета(ПараметрыОтчета);
Если КлючВарианта = Неопределено Тогда
Сообщить("Не найден вариант отчета");
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура("КлючВарианта", КлючВарианта);
ОткрытьФорму("ВнешнийОтчет." + ПараметрыОтчета.ИмяОтчета + ".Форма", ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Функция ПодключитьВнешнийОтчет(ПараметрыОтчета)
ОтчетСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ПараметрыОтчета.НаименованиеОтчета);
Если ОтчетСсылка.Пустая() Тогда
Сообщить("Не удалось найти внешний отчет");
Возврат Ложь;
КонецЕсли;
ДвоичныеДанные = ОтчетСсылка.ХранилищеОбработки.Получить();
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ВнешниеОтчеты.Подключить(АдресХранилища, ПараметрыОтчета.ИмяОтчета);
Возврат Истина;
КонецФункции
&НаСервере
Функция ПолучитьКлючВариантаОтчета(ПараметрыОтчета)
СписокВариантов = ПолучитьСписок("ВнешнийОтчет." + ПараметрыОтчета.ИмяОтчета);
Если СписокВариантов.Количество() = 0 Тогда
Возврат Неопределено;
КонецЕсли;
Если СписокВариантов.Количество() = 1 Тогда
Возврат СписокВариантов[0].Значение;
КонецЕсли;
Для Каждого ТекВариант Из СписокВариантов Цикл
Если ТекВариант.Представление = ПараметрыОтчета.ИмяВариантаОтчета Тогда
Возврат ТекВариант.Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
&НаСервере
Функция ПолучитьСсылкуНаОтчетПоИмени(НаименованиеОтчета)
СсылкаНаОтчет = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеОтчета);
Возврат СсылкаНаОтчет;
КонецФункции
// Получает список настроек из хранилища. Значениями элементов списка являются ключи настроек.
//
// Параметры:
// КлючОтчета - Строка - Полное имя отчета с точкой.
// Пользователь - Пользователь, настройки которого получаются. Необязательный параметр.
// - Неопределено - Получаются настройки текущего пользователя.
// - Строка - Имя пользователя ИБ.
// - УникальныйИдентификатор - Идентификатор пользователя ИБ.
// - ПользовательИнформационнойБазы - Пользователь ИБ.
// - СправочникСсылка.Пользователи - Пользователь.
//
// Возвращаемое значение:
// СписокЗначений - Список вариантов отчета.
// * Значение - Строка - Ключ варианта.
// * Представление - Строка - Представление варианта.
//
// Важно:
// В отличие от механизма платформы вместо права "АдминистрированиеДанных" проверяются права доступа к отчету.
//
// См. также:
// "СтандартноеХранилищеНастроекМенеджер.ПолучитьСписок" в синтакс-помощнике.
//
&НаСервере
Функция ПолучитьСписок(КлючОтчета, Знач Пользователь = Неопределено, Пользовательский = Ложь) Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Результат = Новый СписокЗначений;
Если ТипЗнч(КлючОтчета) = Тип("Строка") Тогда
ОтчетИнформация = ВариантыОтчетов.СформироватьИнформациюОбОтчетеПоПолномуИмени(КлючОтчета);
Если ТипЗнч(ОтчетИнформация.ТекстОшибки) = Тип("Строка") Тогда
ВызватьИсключение ОтчетИнформация.ТекстОшибки;
КонецЕсли;
ОтчетСсылка = ОтчетИнформация.Отчет;
Иначе
ОтчетСсылка = КлючОтчета;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Варианты.КлючВарианта,
| Варианты.Наименование
|ИЗ
| Справочник.ВариантыОтчетов КАК Варианты
|ГДЕ
| Варианты.Отчет = &Отчет
| И Варианты.Автор = &Автор
| И Варианты.Автор.ИдентификаторПользователяИБ = &GUID
| И Варианты.ПометкаУдаления = ЛОЖЬ
| И Варианты.Пользовательский = ИСТИНА";
Запрос.УстановитьПараметр("Отчет", ОтчетСсылка);
Если Пользователь = "" Тогда
Пользователь = Пользователи.СсылкаНеуказанногоПользователя();
ИначеЕсли Пользователь = Неопределено Тогда
Пользователь = Пользователи.АвторизованныйПользователь();
КонецЕсли;
Если Не Пользовательский Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Варианты.Пользовательский = ИСТИНА", "");
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Варианты.Автор = &Автор", "");
КонецЕсли;
Если ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда
Запрос.УстановитьПараметр("Автор", Пользователь);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Варианты.Автор.ИдентификаторПользователяИБ = &GUID", "");
Иначе
Если ТипЗнч(Пользователь) = Тип("УникальныйИдентификатор") Тогда
ИдентификаторПользователя = Пользователь;
Иначе
Если ТипЗнч(Пользователь) = Тип("Строка") Тогда
УстановитьПривилегированныйРежим(Истина);
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(Пользователь);
УстановитьПривилегированныйРежим(Ложь);
Если ПользовательИБ = Неопределено Тогда
Возврат Результат;
КонецЕсли;
ИначеЕсли ТипЗнч(Пользователь) = Тип("ПользовательИнформационнойБазы") Тогда
ПользовательИБ = Пользователь;
Иначе
Возврат Результат;
КонецЕсли;
ИдентификаторПользователя = ПользовательИБ.УникальныйИдентификатор;
КонецЕсли;
Запрос.УстановитьПараметр("GUID", ИдентификаторПользователя);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "И Варианты.Автор = &Автор", "");
КонецЕсли;
ТаблицаВариантов = Запрос.Выполнить().Выгрузить();
Для Каждого СтрокаТаблицы Из ТаблицаВариантов Цикл
Результат.Добавить(СтрокаТаблицы.КлючВарианта, СтрокаТаблицы.Наименование);
КонецЦикла;
Возврат Результат;
#КонецЕсли
КонецФункции
#КонецОбласти
НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов (БСП)
Внешняя обработка с несколькими командами, добавляемая в регламентные задания
ШаблонИмениПрофиляБезопасности (БСП)
Подключение внешней обработки/отчета, пример оформления модуля объекта