Идея данной разработки в том, чтобы сформировав какой либо отчет пользователь смог сразу же выполнить ряд определенных функций. В данном конкретном примере была задача, чтобы можно было перепровести документы полученные в расшифровке отчета. В целом задача показать как добавить свою кнопку в зависимости от вида отчета и как с помощью нее обработать результат отчета. Разработка велась на УТ 11.4.14.176, но будет работать на любой конфигурации где используется БСП (может быть с небольшими отклонениями из-за разности версий БСП, но принцип одинаковый).
1. Добавляем расширение в базу
2. Заимствуем в него общие модули "ОтчетыПереопределяемый" и "ОтчетыКлиентПереопределяемый", и создаем свой модуль для написания своих процедур обработки (у меня называется АУ_Сервер)
3. В модуле ОтчетыПереопределяемый идет инициализация формы отчета - тут считываем какой отчет открывается и добавляем свою кнопку на форме. Соответственно для разных отчетов можно создать разные команды.
&После("ПриСозданииНаСервере")
Процедура АУ_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
ИмяОтчета="";
Если Форма.Параметры.Свойство("ИмяОтчета",ИмяОтчета) тогда
Иначе
ИмяОтчета=Форма.КлючТекущегоВарианта;
КонецЕсли;
Если ИмяОтчета="ВедомостьПоТоварамНаСкладах" тогда
ТвояКоманда = Форма.Команды.Добавить("ПерепровестиДокументы");
ТвояКоманда.Действие = "Подключаемый_Команда";
ТвояКоманда.заголовок = "Перепровести документы";
Форма.ПостоянныеКоманды.Добавить(ТвояКоманда.Имя);
ТвояКнопка= Форма.Элементы.Добавить(ТвояКоманда .Имя, Тип("КнопкаФормы"), Форма.Элементы.ГруппаПрограммныйИнтерфейс);
//При добавлении элемента на форму, надо убедиться что на ней есть такая группа ГруппаПрограммныйИнтерфейс - в зависимости от версии БСП она может отсутствовать или называться иначе
ТвояКнопка.ИмяКоманды = ТвояКоманда .Имя;
ТвояКнопка.ТолькоВоВсехДействиях = Ложь;
КонецЕсли;
КонецПроцедуры
4. В модуле ОтчетыКлиентПереопределяемый перехватываем процедуру ОбработчикКоманды, и если все таки нажата наша кнопка вызываем процедуру из нашего модуля.
&Вместо("ОбработчикКоманды")
Процедура АУ_ОбработчикКоманды(ФормаОтчета, Команда, Результат) Экспорт
Если Команда.Имя="ПерепровестиДокументы" тогда //Проверяем имя команды и вызываем нужную процедуру
АУ_Сервер.ПерепровестиДокументыИЗОтчета(ФормаОтчета.ОтчетДанныеРасшифровки,ФормаОтчета.ОтчетТабличныйДокумент);
Иначе
ПродолжитьВызов(ФормаОтчета, Команда, Результат);
КонецЕсли;
КонецПроцедуры
5. Собственно в нашем модуле пишем обработчик нашей команды, в моем случае процедура ищет все документы в результате отчета и перепроводит их.
Процедура ПерепровестиДокументыИЗОтчета(ОтчетДанныеРасшифровки,ОтчетТабличныйДокумент) Экспорт
Попытка
ДанныеРасшифровки=ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки);
Исключение
ДанныеРасшифровки=Неопределено;
Сообщить("Не удалось запустить проведение документов");
Возврат;
КонецПопытки;
Если не ДанныеРасшифровки =Неопределено тогда
Мас=Новый Массив;
Для Каждого Элемент из ДанныеРасшифровки.Элементы Цикл
Если ТипЗнч(Элемент)=Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") тогда
Поля=Элемент.ПолучитьПоля();
Для Каждого Поле из Поля Цикл
Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Поле.Значение)) тогда
Если Мас.Найти(Поле.Значение) =Неопределено и Поле.Значение.Проведен тогда
Мас.Добавить(Поле.Значение);
Попытка
Об=Поле.Значение.ПолучитьОбъект();
Об.записать(РежимЗаписиДокумента.Проведение);
Сообщить("Проведен документ " +Поле.Значение);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
6. Готово
Результат работы на скрине, пример готового расширения прилагается.
Разработка велась на платформе 8.3.22, УТ 11.4.14