НовыйЗапросПоДоступнымКомандам (БСП)

Автор: 1С
ОбщийМодуль.ДополнительныеОтчетыИОбработки
БСП

Новый запрос по доступным командам. Формирует запрос для получения таблицы команд дополнительных отчетов или обработок.

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ФайловыеКомандыДоступны (БСП)

КомандыПечатиОбъектаДоступныеДляВложений (БСП)

ОбновитьДоступностьКомандПринятияКИсполнению (БСП)

НовыйФайлЗапускаКомандыWindows (БСП)

ДоступныНовыеДанные (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз