Шаблон я заготовил еще на БСП 2.х, сейчас актуальна БСП 3.0.х – шаблон менял с развитием БСП. Сравнивая шаблоны получилось очень наглядно как «1С» реализует концепцию «вести разработку как бы сбоку, оставляя типовые объекты на поддержке, а в идеале на замке». Для этого развивает программный интерфейс подсистем БСП, что позволяет свести к минимуму количество объектов в расширении конфигурации.
Для БСП 2.х и БСП 3.0 макет табличного документа и алгоритм формирования печатной формы располагаю в объекте обработка, расширения конфигурации. «Обычно макет печатной формы располагается при объекте, но если макет является общим для двух и более объектов, то либо его следует располагать в обработке, либо это должен быть общий макет.» [ИТС, БСП гл. 3.38 Печать]. Для меня важно оставить конфигурацию «девственной» и минимум объектов заимствовать в расширение конфигурации, поэтому в обработке.
Если на БСП 2.х укладываемся в 7 шагов:
- Создаем Расширение;
- Создаем обработку;
- Создаем макет в обработке;
- Заимствуем сам объект (например, документ), для которого требуется добавить команду печати;
- Заимствуем Группу команд – «Печать»;
- Создаем команду у обработки и определяем свойства «Тип параметра команды» (шаг 4) и «Группа» (шаг 5);
- В модуле менеджера Обработки располагаем процедуру с кодом формирования печатной формы и методы подсистемы Печать.
После этого в командной панели формы объекта (например, документа) и формы журнала, в меню «Печать» появится созданная команда.
Рис. 1 Расширение конфигурации на БСП 2.х
то на БСП 3.0 получаем желаемое за 4-е шага
- Создаем Расширение;
- Создаем обработку;
- Создаем макет в обработке;
- В модуле менеджера Обработки располагаем процедуру с кодом формирования печатной формы и методы подсистемы Печать.
Благодаря развившемуся программному интерфейсу подсистемы «Печать» в расширении конфигурации ничего заимствовать более не нужно.
Рис. 2 Расширение конфигурации на БСП 3.0
Повинуясь ИТС, подсистему «ПодключаемыеОтчетыИОбработки» заимствуем и в нее включаем созданную обработку.
Вот тот программный интерфейс БСП 3.0, благодаря которому нет более надобности заимствовать «Группу команд», «Документ» и создавать команды у обработки. Следующие процедуры, располагаем в модуле менеджера обработки.
#Область ПрограммныйИнтерфейс
// Определяет состав программного интерфейса для интеграции с конфигурацией.
//
// Параметры:
// Настройки - Структура - Настройки интеграции этого объекта.
// См. возвращаемое значение функции ПодключаемыеКоманды.НастройкиПодключаемыхОтчетовИОбработок().
//
Процедура ПриОпределенииНастроек(Настройки) Экспорт
Настройки.Размещение.Добавить(Метаданные.Документы.РасходнаяНакладная);
Настройки.ДобавитьКомандыПечати = Истина;
КонецПроцедуры
// Заполняет список команд печати.
//
// Параметры:
// КомандыПечати - ТаблицаЗначений - Подробнее см. в УправлениеПечатью.СоздатьКоллекциюКомандПечати().
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
Команда = КомандыПечати.Добавить();
Команда.Представление = НСтр("ru = 'Акт передачи на комиссию (из расширения)'");
Команда.Идентификатор = "АктПередачиНаКомиссию";
Команда.ПроверкаПроведенияПередПечатью = Истина;
Команда.Порядок = 1;
КонецПроцедуры
// Формирует печатные формы.
//
// Параметры:
// МассивОбъектов - Массив - ссылки на объекты, которые нужно распечатать;
// ПараметрыПечати - Структура - дополнительные настройки печати;
// КоллекцияПечатныхФорм - ТаблицаЗначений - сформированные табличные документы (выходной параметр)
// ОбъектыПечати - СписокЗначений - значение - ссылка на объект;
// представление - имя области, в которой был выведен объект (выходной параметр);
// ПараметрыВывода - Структура - дополнительные параметры сформированных табличных документов (выходной параметр).
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПолноеИмя = Создать().Метаданные().ПолноеИмя();
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "АктПередачиНаКомиссию") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "АктПередачиНаКомиссию", "Акт передачи на комиссию (из расширения)", ПечатнаяФорма(МассивОбъектов, ОбъектыПечати, ПолноеИмя, "АктПередачиНаКомиссию"));
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Процедуру формирования печатной формы располагаем в ММ обработки
До процедуры с кодом формирования конкретного табличного документа, я заворачиваю в метод «обертку» ПечатнаяФорма(), в который вынес общие действия характерные для формирования любого табличного документа и обработки массива ссылок, которые нужно распечатать.
В самой процедуре формирования печатной формы я придерживаюсь следующей структуры:
- Определяю параметры печати и макет табличного документа;
- Запросом выбираю нужные данные;
- Результатами выборки заполняю структуру ДанныеПечати и таблицы значений данными табличных частей. Причем, имена ключей структуры и полей таблицы значений совпадают с именами параметров макета;
- Области макета собираю в массив и обхожу его заполняя параметры макета из созданных коллекций на предыдущем шаге, на каждом витке цикла выводя в результирующий табличный документ. Для повышения устойчивости кода заполняю методом ЗаполнитьЗначенияСвойств().
Такой прием позволяет в дальнейшем передвигать параметры по областям макета, не меняя код в процедуре и выглядит элегантно.
После того как я себе «зарубил на носу» разрабатывать «так», когда приходят задачи изменить печатные формы не «так» разработанные (например, мной давно) теперь я испытываю когнитивный диссонанс J. Собрал этот паттерн для себя, может, кто еще проникнется.
//тол+ Обновление публикации от 20.02.2020 г.