Варианты настроек СКД на командную панель с группировками по подменю.
Тестировалось на платформе 8.3.9.2170.
Только для обычного приложения!
Тестировалось на платформе 8.3.9.2170.
Только для обычного приложения!
Предлагаю вариант решения вывода настроек СКД с группировками (см скриншот №1).
Для этого необходимо в каком-либо общем модуле (в моем случае называется УправлениеОтчетами) прописать следующее
Общий модуль
Процедура СменитьВариантНастройки(Элемент,отчетОбъект) Экспорт
ВыбранныйВариант = отчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек.Найти(Элемент.Имя);
Если ВыбранныйВариант <> Неопределено Тогда
отчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ВыбранныйВариант.Настройки);
КонецЕсли;
КонецПроцедуры
///
Процедура СоздатьПунктВариантыНастроек(Форма,отчетОбъект) Экспорт
#Если толстыйКлиентОбычноеПриложение Тогда
Если отчетОбъект.СхемаКомпоновкиДанных<>Неопределено Тогда
//Создание пункта меню
Если отчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек.Количество()<>0 Тогда
Попытка
КнопкиДействияФормы = Форма.ЭлементыФормы.ДействияФормы.Кнопки;
НоваяКнопкаПодменю = КнопкиДействияФормы.Вставить(1,"МенюВариантыОтчетов", ТипКнопкиКоманднойПанели.Подменю, "Варианты отчетов");
МассиСтрок=Новый Массив;
Для Каждого Вариант из отчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
МассиСтрок.Добавить(Вариант.Имя);
КонецЦикла;
ПостроениеДереваСтруктурыНастроек(МассиСтрок,форма,отчетОбъект);
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
#КонецЕсли
КонецПроцедуры
///
Процедура ПостроениеДереваСтруктурыНастроек(МассивСтрокРазбора,форма,Объект)
запрос=Новый Запрос;
запрос.Текст="ВЫБРАТЬ
| "" "" КАК Элемент,
| "" "" КАК Родитель,
| ИСТИНА КАК ЭтоГруппа,
| 1555 КАК Уровень,
| "" "" КАК Представление";
ТзСоздание=запрос.Выполнить().Выгрузить().СкопироватьКолонки();
индекс=1;
ОбщийУровень=1;
Для Каждого СтрокаМассива из МассивСтрокРазбора Цикл
СтрокаОтработки=СтрЗаменить(СтрокаМассива,"__","*");
чв=СтрЧислоВхождений(СтрокаОтработки,"*");
Если чв=0 Тогда
ДобавитьЭлемент(СтрокаМассива,СтрЗаменить(СтрокаМассива,"_"," "),,,форма,объект,Индекс);
Иначе
МассивРаздела=СтрРазделить(СтрокаОтработки,"*",ложь);
КвоЭлементов=МассивРаздела.Количество();
ТекЭлемем=1;
ТекРодитель="";
Для Каждого СтрокаРаздела из МассивРаздела Цикл
Если ТекЭлемем=КвоЭлементов Тогда
СтрокаТз=ТзСоздание.Добавить();
Если ТекРодитель="" Тогда
СтрокаТз.элемент=СтрокаРаздела;
Иначе
СтрокаТз.элемент=ТекРодитель+"__"+СтрокаРаздела;
КонецЕсли;
СтрокаТз.Родитель=ТекРодитель;
СтрокаТз.уровень=ТекЭлемем;
СтрокаТз.этогруппа=ложь;
СтрокаТз.Представление=СтрЗаменить(СтрокаРаздела,"_"," ");
Иначе
СтрокаТз=ТзСоздание.Добавить();
Если ТекРодитель="" Тогда
СтрокаТз.элемент=СтрокаРаздела;
Иначе
СтрокаТз.элемент=ТекРодитель+"__"+СтрокаРаздела;
КонецЕсли;
СтрокаТз.Родитель=ТекРодитель;
СтрокаТз.уровень=ТекЭлемем;
СтрокаТз.этогруппа=Истина;
СтрокаТз.Представление=СтрЗаменить(СтрокаРаздела,"_"," ");
ТекРодитель=СтрокаТз.элемент;
КонецЕсли;
ТекЭлемем=ТекЭлемем+1;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТзСоздание.Свернуть("Уровень,ЭтоГруппа,Представление,Элемент,Родитель");
ТзСоздание.Сортировать("Уровень,ЭтоГруппа,Представление");
Для Каждого СтрокаТз из ТзСоздание Цикл
Если ОбщийУровень<>СтрокаТз.Уровень Тогда
ОбщийУровень=СтрокаТз.Уровень;
Индекс=1;
КонецЕсли;
ДобавитьЭлемент(СтрокаТз.элемент,СтрокаТз.Представление,СтрокаТз.ЭтоГруппа,СтрокаТз.Родитель,форма,Объект,индекс);
КонецЦикла;
КонецПроцедуры
///
Процедура ДобавитьЭлемент(ИмяЭлемента,Представление,ЭтоГруппа=Ложь,Родитель="",форма,объект,Индекс)
Если Родитель="" Тогда
КнопкиДействияФормы = Форма.ЭлементыФормы.ДействияФормы.Кнопки.Найти("МенюВариантыОтчетов");
Иначе
//КнопкиДействияФормы = Форма.ЭлементыФормы.ДействияФормы.Кнопки.Найти(Родитель);
КнопкиДействияФормы = ПолучитьКнопку(Форма,Родитель);
КонецЕсли;
Если ЭтоГруппа Тогда
НоваяКнопкаПодменю = КнопкиДействияФормы.Кнопки.Добавить(ИмяЭлемента, ТипКнопкиКоманднойПанели.Подменю, Представление);
Иначе
НовоеДействие = Новый Действие("ВариантНастройки");
НоваяКнопка = КнопкиДействияФормы.Кнопки.Добавить(ИмяЭлемента, ТипКнопкиКоманднойПанели.Действие, Представление, НовоеДействие);
КонецЕсли;
Индекс=индекс+1;
КонецПроцедуры
///
функция ПолучитьКнопку(Форма,имя)
СтрокаОтработки=СтрЗаменить(имя,"__","*");
чв=СтрЧислоВхождений(СтрокаОтработки,"*");
Если чв=0 Тогда
Кнопка=Форма.ЭлементыФормы.ДействияФормы.Кнопки.МенюВариантыОтчетов.Кнопки.Найти(имя);
Иначе
МассивРаздела=СтрРазделить(СтрокаОтработки,"*",ложь);
ТекКнопка=Форма.ЭлементыФормы.ДействияФормы.Кнопки.МенюВариантыОтчетов;
текстТекКнопка="";
это1=Истина;
Для Каждого СтрокаРаздела из МассивРаздела Цикл
Если это1 Тогда
текстТекКнопка=СтрокаРаздела;
это1=Ложь;
Иначе
текстТекКнопка=текстТекКнопка+"__"+СтрокаРаздела;
КонецЕсли;
НовТекКнопка=ТекКнопка.Кнопки.Найти(текстТекКнопка);
ТекКнопка=НовТекКнопка;
КонецЦикла;
Кнопка=ТекКнопка;
КонецЕсли;
Возврат Кнопка;
КонецФункции
и просто добавить в отчет несколько строк
Отчет
Процедура ПриОткрытии()
УправлениеОтчетами.СоздатьПунктВариантыНастроек(ЭтаФорма,ЭтотОбъект);
КонецПроцедуры
Процедура ВариантНастройки(кнопка)
УправлениеОтчетами.СменитьВариантНастройки(кнопка, ЭтотОбъект);
КонецПроцедуры
Важно:
- представление наименования варианта настроек не имеет значения
- в имени варианта настроек 1 символ "_" означает пробел в заголовке кнопки, два символа "_" означают переход группы (пример именования вариантов настроек в скриншоте №2)
- в процедурах модуля есть излишние передачи параметров (пока экспериментировал, много чего надобавлял), но они не мешают работе.
Related Posts
- Получение логина и пароля техподдержки 1С из базы
- Класс для вывода отчета в Excel
- Счет-фактура для УПП
- Библиотека классов для создания внешней компоненты 1С на C#
- Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
- Прайс-лист с артикулом в отдельной колонке