Пример задачи: в форме пакетного формирования документов необходимо предусмотреть печать всех видов форм, подключаемых через механизм доп.печатных форм (доступны из формы документа и из формы списка).
Задача реализуется через использование штатных настроек для обработчиков подключаемых команд и небольших правок в модулях БСП. Использование доработок актуально для версии БСП 3.1.7.526, ERP 2.5.12.121.
Этапы доработки:
1.Обработчики формы обработки
ПриСозданииНаСервере
// СтандартныеПодсистемы.ПодключаемыеКоманды
//++ добавляем описание параметров размещения (это требование описано в документации)
ПараметрыРазмещения = ПодключаемыеКоманды.ПараметрыРазмещения();
ПараметрыРазмещения.Источники = Новый ОписаниеТипов("ОбработкаОбъект.ПакетнаяПечатьДокументов_v1");
ПараметрыРазмещения.КоманднаяПанель = ЭтаФорма.КоманднаяПанель;
//---
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект,ПараметрыРазмещения);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
ПриОткрытии
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
Добавляемые обработчики подсистемы подключаемых команд:
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
//+++
//для обработок нужно переопределить параметры, чтобы не было лишних проверок по метаданным документов
ДанныеСтруктура = ЗаполнитьПараметрыКоманды(); //нужно обезличить ДанныеФормыСтруктура
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ЭтоФормаОбъекта", Ложь);
ДополнительныеПараметры.Вставить("ТребуетсяЗапись", Ложь);
ДополнительныеПараметры.Вставить("ТребуетсяПроведение", Ложь);
ДополнительныеПараметры.Вставить("ТребуетсяРаботаСФайлами", Ложь);
ДополнительныеПараметры.Вставить("ВызовСервераЧерезОбработкуОповещения", Истина);
ДополнительныеПараметры.Вставить("МассивСсылок", ПолучитьМассивСсылокНаДокументы());
//---
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, ДанныеСтруктура,
//+++
ДополнительныеПараметры); //добавлен параметр с настройками переопределения
//---
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения,ДополнительныеПараметры) Экспорт
ПараметрыВыполнения.ТребуетсяЗапись = Ложь;
ПараметрыВыполнения.МассивСсылок = ПолучитьМассивСсылокНаДокументы ();
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
&НаСервере
Функция ПолучитьМассивСсылокНаДокументы ()
//сформировать массив ссылок на документы
МассивСсылокНаДокументы = Новый Массив;
МассивСсылокНаДокументы.Добавить(...); //из таблицы на форме или запросом в БД
Возврат МассивСсылокНаДокументы;
КонецФункции
&НаСервере
Функция ЗаполнитьПараметрыКоманды()
ДанныеСтруктура = Новый Структура;
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Для каждого Ревизит из ОбработкаОбъект.Метаданные().Реквизиты Цикл
ДанныеСтруктура.Вставить(Ревизит.Имя, ОбработкаОбъект[Ревизит.Имя]);
КонецЦикла;
Возврат ДанныеСтруктура;
КонецФункции
2. Добавить возможность переопределения параметров исполнения команды
В модуле ПодключаемыеКомандыКлиент для метода НачатьВыполнениеКоманды добавить возможность переопределения:
// ДополнительныеПараметры - Структура с ключами переопределяемых параметров
Процедура НачатьВыполнениеКоманды(Форма, Команда, Источник, ДополнительныеПараметры = Неопределено) Экспорт
...
Если ДополнительныеПараметры <> Неопределено Тогда
Для каждого ПереопределяемыйПараметр из ДополнительныеПараметры Цикл
ПараметрыВыполнения[ПереопределяемыйПараметр.Ключ] = ПереопределяемыйПараметр.Значение;
КонецЦикла;
КонецЕсли;
ПродолжитьВыполнениеКоманды(ПараметрыВыполнения);
КонецПроцедуры
3. Доработки модулей БСП для исполнения кода из формы обработки:
В модуле ЗаполнениеОбъектов в методе ПриОпределенииКомандПодключенныхКОбъекту проверку прав на изменение документа поменять с учетом метаданных обработки
Если Источник.Вид = "ОБРАБОТКА"
И НЕ ПравоДоступа("Использование", Источник.Метаданные) Тогда
Продолжить;
ИначеЕсли Источник.Вид = "ДОКУМЕНТ"
И Не Источник.ЭтоЖурналДокументов
И Не ПравоДоступа("Изменение", Источник.Метаданные) Тогда
Продолжить;
ИначеЕсли Не ПравоДоступа("Изменение", Источник.Метаданные) Тогда //любая другая проверка
Продолжить;
КонецЕсли;
В модуле ПодключаемыеКоманды в методе ЗарегистрироватьИсточник добавить обработку метаданных обработки
ИначеЕсли Не Метаданные.Обработки.Содержит(ОбъектМетаданных) И Не Метаданные.Отчеты.Содержит(ОбъектМетаданных) Тогда
Источник.ТипСсылкиДанных = Тип(Источник.Вид + "Ссылка." + ОбъектМетаданных.Имя);
//+++
ИначеЕсли Метаданные.Обработки.Содержит(ОбъектМетаданных) Тогда
Источник.ТипСсылкиДанных = Тип(Источник.Вид + "Объект." + ОбъектМетаданных.Имя);
//---
КонецЕсли;
В методе КэшФормы для обработок сэмулировать поведение по аналогии с формой списка для документов
Если ЭтоФормаОбъекта = Неопределено Тогда
Если ТипыИсточников.Количество() > 1 Тогда
ЭтоФормаОбъекта = Ложь;
//+++
ИначеЕсли ТипыИсточников.Количество() = 1
И Лев(ИсточникиЧерезЗапятую, 10) = "Обработка." Тогда
ЭтоФормаОбъекта = Ложь;
//---
...
КонецЕсли;
КонецЕсли;
В модуле УправлениеПечатью в методе ЗаполнитьКомандыПечатиДляСпискаОбъектов исправить формирование представления типа для обработок
Если ДобавляемаяКомандаПечати.ТипыОбъектовПечати.Количество() = 0 Тогда
//+++
Если Метаданные.Обработки.Содержит(ОбъектМетаданных) Тогда
ТипПредставление = СтрЗаменить(ОбъектМетаданных.ПолноеИмя(), ".", "Объект.");
Иначе
ТипПредставление = СтрЗаменить(ОбъектМетаданных.ПолноеИмя(), ".", "Ссылка.");
КонецЕсли;
ДобавляемаяКомандаПечати.ТипыОбъектовПечати.Добавить(Тип(ТипПредставление));
//---
КонецЕсли;
4. В модуле УправлениеПечатьюУТСервер в методе ОпределитьОбъектыСКомандамиПечати в СписокОбъектов добавить обработку для выбора в форме редактирования внешних дополнительных обработок для размещения.
5. В форме обработки, по аналогии с документами, в командной панели нужно разместить Подменю с наименованием ПодменюПечать.