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