Расширение конфигурации. Создаем печатную форму для документа.

Опубликовал Николай С (niko11s) в раздел Программирование - Практика программирования

На примере покажу, как можно создать новую печатную форму для документа, используя расширение.

     Используя новые возможности платформы 8.3.9 в плане работы с расширениями, а именно возможность изменять модули типовой конфигурации, достаточно просто сделать новую печатную форму для документа. 

     Допустим стоит задача создать новую печатную форму для документа "РеализацияТоваровУслуг" на основе уже имеющейся "ТОРГ-12". Мы будем использовать конфигурацию "Бухгалтерия предприятия, ред. 3.0".

     Итак, создаем новое расширение:

     Для вывода новой печатной формы нам понадобятся две процедуры модуля менеджера документа "РеализацияТоваровУслуг". Это процедуры ДобавитьКомандыПечати() и Печать(). 

     Для этих процедур мы будем использовать аннотацию &Вместо.  Т.е. типовые процедуры выполняться не будут, а вместо них будут выполнены наши, которые мы сделаем на основе типовых.

     Итак, добавляем модуль менеджера документа "РеализацияТоваровУслуг" в наше расширение, текст модуля будет следующий:

&Вместо("ДобавитьКомандыПечати")
Процедура РасшНПФ_ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	// Наша новая печатная форма на основе (ТОРГ-12)
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "НашаФорма";
	КомандаПечати.Представление = НСтр("ru = 'Наша форма'");
	КомандаПечати.Обработчик    = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";
	КомандаПечати.СписокФорм    = "ФормаСписка,ФормаВыбора,ФормаДокументаОбщая,ФормаДокументаТовары";
	КомандаПечати.Порядок = 10;
	
	
  //
  // Здесь идет код типовой процедуры ДобавитьКомандыПечати(КомандыПечати)
  //


	
КонецПроцедуры


&Вместо("Печать")
Процедура РасшНПФ_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	

	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "НашаФорма") Тогда
		ВключатьУслуги = Ложь;
		ТаблицаСведенийТОРГ12 = ПолучитьТаблицуСведенийТОРГ12(МассивОбъектов, ВключатьУслуги);
		ИмяПараметровПечати	= "ПАРАМЕТРЫ_ПЕЧАТИ_НашаФорма";
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "НашаФорма", "НашаФорма",
			ПечатьТорговыхДокументов.ПечатьТОРГ12(ТаблицаСведенийТОРГ12, ОбъектыПечати, ИмяПараметровПечати),,"ОбщийМакет.РасшНПФ_Макет");
		ПараметрыВывода.Вставить("ФормироватьЭД", Истина);
	КонецЕсли;


  //
  // Здесь идет код типовой процедуры Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
  //
	
КонецПроцедуры

     Итак, мы добавили вывод нашей формы в меню "Печать" документа "РеализацияТоваровУслуг" и поменяли параметры процедуры "ВывестиТабличныйДокументВКоллекцию" из общего модуля "УправлениеПечатью". В частности, мы заменили общий макет из типовой конфигурации на наш "ОбщийМакет.РасшНПФ_Макет", который мы предварительно добавили в наше расширение.

     Казалось бы все, но нет. Из процедуры "РасшНПФ_Печать" вызов идет в функцию  ПечатьТорговыхДокументов.ПечатьТорг12(), в которой жестко используется типовой общий макет, а нам хотелось бы использовать свой собственный. Поэтому данную функцию мы тоже заменяем своей:

&Вместо("ПечатьТОРГ12")
Функция РасшНПФ_ПечатьТОРГ12(СведенияТОРГ12, ОбъектыПечати, ИмяПараметровПечати) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.АвтоМасштаб         = Истина;
	ТабличныйДокумент.ОриентацияСтраницы  = ОриентацияСтраницы.Ландшафт;
	
	
	ТабличныйДокумент.ИмяПараметровПечати = ИмяПараметровПечати;
	
	УстановитьМинимальныеПоляПечати(ТабличныйДокумент);
	
	Если ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_НашаФорма" Тогда
		
		Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.Расш2_Макет");
		
	Иначе
		
		Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_ТОРГ12");
	КонецЕсли;
	
	ПервыйДокумент = Истина;
	СведенияОКонтрагентах = Новый Соответствие;
	КонтрагентыДляПечати = Новый Структура("Поставщик, Грузоотправитель, Покупатель, Грузополучатель");
	


//
//      Оставшаяся часть кода типовой функции
//



	
	Возврат ТабличныйДокумент;
 
КонецФункции

     В принципе все готово. Осталось обратить внимание еще на пару моментов.

     При добавлении расширения необходимо снять галочку "Безопасный режим, имя профиля безопасности" иначе при запуске 1с мы получим следующее уведомление:

Ошибка расширения модуля 'Документ.РеализацияТоваровУслуг.МодульМенеджера': расширение модуля запрещено из-за того, что расширение 'РасширениеНоваяПечатнаяФорма' подключено в безопасном режиме

     Второй момент это то, что в разработке расширения мы использовали новые возможности платформы 8.3.9 поэтому режим совместимости мы использовать не можем. Для Бухгалтерии 8, ред. 3.0 на момент написания статьи итспользуется режим совместимости 8.3.8, поэтому, чтобы его поменять нам придется снять конфигурацию с замка.

     Подводя итог, можно сказать следующее. Я рассматривал возможности работы с расширением в плане используя его в качестве альтернативы использования внешним печатным формам в типовых конфигурациях. Так как плюсы работы с расширениями очевидны. Это в первую очередь и простота разработки и легкость отладки кода. Любой начинающий программист или консультант 1с сможет легко сделать небольшие доработки. Это будет намного проще, чем делать внешнюю печатную форму.

     Из минусов, это то, что пока необходимо снимать конфигурацию с замка. Но для Бухгалтерии 8, ред. 3.0 эта проблема скорее всего решится в ближайшее время. На днях, должна уже выйти 8.3.10 и думаю уже скоро режим совместимости в последующих релизах будет повышен. И тогда выбор в пользу расширения перед внешней печатной формой будет очивиден. Разумеется если у Вас не базовая версия, в которой механизм расширений, как мы знаем, не работает.

     Всем спасибо за внимание, и всего хорошего) 

См. также

Комментарии
1. Angry (Angry) 11 08.03.17 11:22 Сейчас в теме
Почему Вы применяете метод "Вместо"?
По хорошему тут надо применять "После". для того что бы можно было корректно обновлять.
Так же не плохо бы описать как настроить профиль безопасности что бы такие расширения работали.
Krasnyj; shampan; config; CyberCerber; +4 Ответить 2
2. Олег Хасанов (haso.itrp) 08.03.17 13:58 Сейчас в теме
(1)
Так же не плохо бы описать как настроить профиль безопасности что бы такие расширения работали


актуально. где об этом можно почитать(посмотреть)?
3. Николай С (niko11s) 235 08.03.17 19:48 Сейчас в теме
(1) Про профиль безопасности я говорил

"При добавлении расширения необходимо снять галочку "Безопасный режим, имя профиля безопасности" иначе при запуске 1с мы получим следующее уведомление:"

А если применить "После" вообще ничего работать не будет - пункты меню задвоятся.
4. Angry (Angry) 11 08.03.17 20:33 Сейчас в теме
(3)
А если применить "После" вообще ничего работать не будет - пункты меню задвоятся.

Так не надо типовой код копировать ) , там надо только "добавки" написать.

Опускайте
//
// Здесь идет код типовой процедуры Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
//

И у Вас всё получится.

(3)
Про профиль безопасности я говорил

Я заметил. Просто добавил, что это полезно указать более подробно. Т.к. расширения сейчас очень актуальная тема. Буквально на прошедшем семинаре 1Сникам говорил, что нет методических материалов, как правильно делать в т.ч. доп. печатные формы.
Вы пометили общий обход для всех "не безопасных" действий, а ведь можно разрешить работать только своему расширению и не опасаться что бух что-то там ещё запустит.
CyberCerber; +1 Ответить 1
5. Николай С (niko11s) 235 08.03.17 21:33 Сейчас в теме
(4) В принципе, Вы правы. С &после будет правильнее.
6. kolya_tlt kolya_tlt (kolya_tlt) 10 09.03.17 11:32 Сейчас в теме
(0) нафига это надо? чем печатная форма не угодила?
7. Николай С (niko11s) 235 09.03.17 12:02 Сейчас в теме
(6) Хотя бы тем, что процесс разработки и отладки намного проще.
8. Николай С (niko11s) 235 09.03.17 12:09 Сейчас в теме
К тому же, возможности расширений постоянно растут, и было бы странно дорабатывать конфу с помощью расширений и при этом использовать внешние печатные формы.
9. kolya_tlt kolya_tlt (kolya_tlt) 10 09.03.17 12:17 Сейчас в теме
(7) мой процесс разработки выглядит как редактирование запроса и макета, думаю в вашем случае он не проще.
(8) какая из возможностей расширений (старых\новых) используется\демонстрируется в статье?
10. борян петров (TODD22) 15 09.03.17 12:23 Сейчас в теме
(8)
и было бы странно дорабатывать конфу с помощью расширений и при этом использовать внешние печатные формы.

В чём именно странность?
11. Николай С (niko11s) 235 09.03.17 13:04 Сейчас в теме
(9) новые возможности - это те, которые появились в 8.3.9.

12. Николай С (niko11s) 235 09.03.17 13:10 Сейчас в теме
Вы же не будете спорить, что процесс отладки кода в расширениях проще? (можно запустить отладчик и работать с ним, как и при отладке обычной конфы)
13. Игорь Фелькер (Brawler) 284 09.03.17 19:24 Сейчас в теме
ИМХО, использовать расширения, для изготовления печатных форм, это как по слону стрелять дробиной...
К тому же у печатных форм есть такая особенность, что их можно независимо распространять, а с расширениями есть большое желание напихать в них всего и побольше, что сразу отметает идею о частичном распространении.
14. Олег Дмитров (baracuda) 2 10.03.17 08:54 Сейчас в теме
(13)Бред сивой кабылы. Что вам мешает напихать в форму в отдельное расширение?
Почему наш народ так отчаянно противится всему новому? Лучше бы сами попробовали САБЖ где нить, может тогда поймете для чего они делались.
15. Игорь Фелькер (Brawler) 284 10.03.17 09:09 Сейчас в теме
(14) Может быть бы сначала сами подумали, что уже целая армия пользователей знает о существовании обработок, а теперь вы еще их "убогих" хотите научить и каким-та расширениям неведомым?
Мне как программисту все равно как реализовать, хоть тупо в код залезть типовой и там накуролесить, но пока я выберу путь внешних печатных форм, покуда они поддерживаются в БСП.
AlX0id; DoctorRoza; JohnyDeath; pol_k; +4 Ответить 1
16. Андрей Суханцов (&rew) 6 26.04.17 11:24 Сейчас в теме
Тут как посмотреть. Надо мне, например, ответственного за выписку документов поменять. Зачем я буду создавать отдельную ВПФ, когда я в расширение "пихну" модуль менеджера, там его обработаю и все.
17. Алексей Роза (DoctorRoza) 26.04.17 15:41 Сейчас в теме
(16) Комрад Brawler верно говорит, такую задачу лучше решать через ВПФ! Опять же, вопрос поддержки, один - написал, второй будет тянуть, ВПФ всегда проще отладить и изменить! Ну и опять же, в конторах любят иметь набор ПФ, которые отрабатывают по разному. Ну и какой шлак, тогда будет внутри?
18. Владимир Безфамильный (Vovan1975) 14 26.04.17 16:55 Сейчас в теме
Спасибо!
Очень познавательно.
19. Владимир Безфамильный (Vovan1975) 14 26.04.17 17:03 Сейчас в теме
(15) Вы попробуйте отделить суп от мух.
Вам продемонстрировали внятный пример "как сделать свое расширение"(суть), на примере создания печатной формы(частность). Почему Вы сосредоточились на частности?
Автор не про печатные формы писал а про расширения конфигураций.
mulla1979; +1 Ответить
20. Алексей 1 (AlX0id) 26.04.17 18:04 Сейчас в теме
(14)
Попробуйте на досуге доработать запрос в печатной форме, и тогда поймете, чем же лучше ВПФ ) Уж как минимум тем, что не надо втаскивать в нее стомильонов объектов заради одного запроса..
21. А С (a45) 45 27.04.17 07:14 Сейчас в теме
(20) Запрос (его текст) можно сделать в модуле внешней обработке, дальше копипастом в расширение.
22. Андрей Суханцов (&rew) 6 27.04.17 07:18 Сейчас в теме
Подождите, Господа. Тут речь идет не о том, через какое место лучше делать. Человек сказал что можно вот так. А как делать оптимальнее, зависит от задачи и от ЗУНов каждого конкретного прогера.