Шаблон модуля команды для включения варианта внешнего отчета в интерфейс отдельной строкой

СергейТ 104 4 9

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

&НаКлиенте
Функция ДанныеОтчетаИВарианта()
	
	Результат = Новый Структура;
	
	// внести данные по открываемому отчету и варианту
	Результат.Вставить("ИмяОтчета", "ОтчетПоПродажамПоПродавцам"); // Имя внешнего отчета.
	Результат.Вставить("НаименованиеОтчета", "Отчет по продажам"); // Наименование отчета. Как он зарегистрирован
	Результат.Вставить("ИмяВариантаОтчета", "Отчет по продажам (по продавцам)"); // Наименование варианта. Встроенного или пользовательского
	
	Возврат Результат
	
КонецФункции

#Область ОбработчикиСобытий

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ПараметрыОтчета = ДанныеОтчетаИВарианта();
	
	//Подключение нужно только для внешнего отчета
	Если ПодключитьВнешнийОтчет(ПараметрыОтчета) Тогда
		
		КлючВарианта = ПолучитьКлючВариантаОтчета(ПараметрыОтчета);
		Если КлючВарианта = Неопределено Тогда
			Сообщить("Не найден вариант отчета");
			Возврат;
		КонецЕсли;
		
		ПараметрыФормы = Новый Структура("КлючВарианта", КлючВарианта);
		ОткрытьФорму("ВнешнийОтчет." + ПараметрыОтчета.ИмяОтчета + ".Форма", ПараметрыФормы);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция ПодключитьВнешнийОтчет(ПараметрыОтчета)
	
	ОтчетСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ПараметрыОтчета.НаименованиеОтчета);
	Если ОтчетСсылка.Пустая() Тогда
		Сообщить("Не удалось найти внешний отчет");
		Возврат Ложь;
	КонецЕсли;
	
	ДвоичныеДанные = ОтчетСсылка.ХранилищеОбработки.Получить();
	АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
	ВнешниеОтчеты.Подключить(АдресХранилища, ПараметрыОтчета.ИмяОтчета);
	
	Возврат Истина;
	
КонецФункции

&НаСервере
Функция ПолучитьКлючВариантаОтчета(ПараметрыОтчета)
	
	СписокВариантов = ПолучитьСписок("ВнешнийОтчет." + ПараметрыОтчета.ИмяОтчета);
	Если СписокВариантов.Количество() = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если СписокВариантов.Количество() = 1 Тогда
		Возврат СписокВариантов[0].Значение;
	КонецЕсли;
	
	Для Каждого ТекВариант Из СписокВариантов Цикл
		
		Если ТекВариант.Представление = ПараметрыОтчета.ИмяВариантаОтчета Тогда
			Возврат ТекВариант.Значение;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

&НаСервере
Функция ПолучитьСсылкуНаОтчетПоИмени(НаименованиеОтчета)
	
	СсылкаНаОтчет = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеОтчета);
	Возврат СсылкаНаОтчет;
	
КонецФункции

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

#КонецОбласти
0

См. также

НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов (БСП)

Внешняя обработка с несколькими командами, добавляемая в регламентные задания

ШаблонИмениПрофиляБезопасности (БСП)

ШаблонЗапроса (БСП)

ПоказатьПанельОтчетов (БСП)

Подключение внешней обработки/отчета, пример оформления модуля объекта

Запуск внешнего отчета в сформированном виде

ТаблицаПодключаемыхОбъектов (БСП)

Модератору