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

05.03.17

Разработка - Механизмы платформы 1С

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

     Используя новые возможности платформы 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 и думаю уже скоро режим совместимости в последующих релизах будет повышен. И тогда выбор в пользу расширения перед внешней печатной формой будет очивиден. Разумеется если у Вас не базовая версия, в которой механизм расширений, как мы знаем, не работает.

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

Расширение конфигурации. Печатная форма.

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4509    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5287    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18470    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8817    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15983    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Angry 11 08.03.17 11:22 Сейчас в теме
Почему Вы применяете метод "Вместо"?
По хорошему тут надо применять "После". для того что бы можно было корректно обновлять.
Так же не плохо бы описать как настроить профиль безопасности что бы такие расширения работали.
Eillecho; mrChOP93; Strannik777; dmb-dima; pavelpribytkin96; Intercititude; ram3; Dmitri93; Krasnyj; shampan; config; CyberCerber; +12 Ответить
2. haso.itrp 08.03.17 13:58 Сейчас в теме
(1)
Так же не плохо бы описать как настроить профиль безопасности что бы такие расширения работали


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

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

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

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

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

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

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

Я заметил. Просто добавил, что это полезно указать более подробно. Т.к. расширения сейчас очень актуальная тема. Буквально на прошедшем семинаре 1Сникам говорил, что нет методических материалов, как правильно делать в т.ч. доп. печатные формы.
Вы пометили общий обход для всех "не безопасных" действий, а ведь можно разрешить работать только своему расширению и не опасаться что бух что-то там ещё запустит.
CyberCerber; +1 Ответить
5. niko11s 988 08.03.17 21:33 Сейчас в теме
(4) В принципе, Вы правы. С &после будет правильнее.
28. Anteros 30.10.19 19:22 Сейчас в теме
(4)
Всем привет. А можно про &После немного поподробней? В каком смысле "Опускайте"?
29. Angry 11 30.10.19 23:07 Сейчас в теме
(28) При использовании "После" не нужно копировать типовой код, он и так исполнится, а только затем добавленный нами..
В статье же описан только метод "Вместо", который заменяет типовой код и для сохранения стандартного поведения нужно его (типовой код) копировать в наше расширение.
6. kolya_tlt 86 09.03.17 11:32 Сейчас в теме
(0) нафига это надо? чем печатная форма не угодила?
7. niko11s 988 09.03.17 12:02 Сейчас в теме
(6) Хотя бы тем, что процесс разработки и отладки намного проще.
9. kolya_tlt 86 09.03.17 12:17 Сейчас в теме
(7) мой процесс разработки выглядит как редактирование запроса и макета, думаю в вашем случае он не проще.
(8) какая из возможностей расширений (старых\новых) используется\демонстрируется в статье?
11. niko11s 988 09.03.17 13:04 Сейчас в теме
(9) новые возможности - это те, которые появились в 8.3.9.

8. niko11s 988 09.03.17 12:09 Сейчас в теме
К тому же, возможности расширений постоянно растут, и было бы странно дорабатывать конфу с помощью расширений и при этом использовать внешние печатные формы.
10. TODD22 18 09.03.17 12:23 Сейчас в теме
(8)
и было бы странно дорабатывать конфу с помощью расширений и при этом использовать внешние печатные формы.

В чём именно странность?
12. niko11s 988 09.03.17 13:10 Сейчас в теме
Вы же не будете спорить, что процесс отладки кода в расширениях проще? (можно запустить отладчик и работать с ним, как и при отладке обычной конфы)
13. Brawler 454 09.03.17 19:24 Сейчас в теме
ИМХО, использовать расширения, для изготовления печатных форм, это как по слону стрелять дробиной...
К тому же у печатных форм есть такая особенность, что их можно независимо распространять, а с расширениями есть большое желание напихать в них всего и побольше, что сразу отметает идею о частичном распространении.
14. baracuda 2 10.03.17 08:54 Сейчас в теме
(13)Бред сивой кабылы. Что вам мешает напихать в форму в отдельное расширение?
Почему наш народ так отчаянно противится всему новому? Лучше бы сами попробовали САБЖ где нить, может тогда поймете для чего они делались.
15. Brawler 454 10.03.17 09:09 Сейчас в теме
(14) Может быть бы сначала сами подумали, что уже целая армия пользователей знает о существовании обработок, а теперь вы еще их "убогих" хотите научить и каким-та расширениям неведомым?
Мне как программисту все равно как реализовать, хоть тупо в код залезть типовой и там накуролесить, но пока я выберу путь внешних печатных форм, покуда они поддерживаются в БСП.
AlX0id; DoctorRoza; JohnyDeath; pol_k; +4 Ответить
19. Vovan1975 13 26.04.17 17:03 Сейчас в теме
(15) Вы попробуйте отделить суп от мух.
Вам продемонстрировали внятный пример "как сделать свое расширение"(суть), на примере создания печатной формы(частность). Почему Вы сосредоточились на частности?
Автор не про печатные формы писал а про расширения конфигураций.
smahuseev; mulla1979; +2 Ответить
20. AlX0id 26.04.17 18:04 Сейчас в теме
(14)
Попробуйте на досуге доработать запрос в печатной форме, и тогда поймете, чем же лучше ВПФ ) Уж как минимум тем, что не надо втаскивать в нее стомильонов объектов заради одного запроса..
21. a45 88 27.04.17 07:14 Сейчас в теме
(20) Запрос (его текст) можно сделать в модуле внешней обработке, дальше копипастом в расширение.
rabota.v8.1c; +1 Ответить
16. &rew 49 26.04.17 11:24 Сейчас в теме
Тут как посмотреть. Надо мне, например, ответственного за выписку документов поменять. Зачем я буду создавать отдельную ВПФ, когда я в расширение "пихну" модуль менеджера, там его обработаю и все.
17. DoctorRoza 26.04.17 15:41 Сейчас в теме
(16) Комрад Brawler верно говорит, такую задачу лучше решать через ВПФ! Опять же, вопрос поддержки, один - написал, второй будет тянуть, ВПФ всегда проще отладить и изменить! Ну и опять же, в конторах любят иметь набор ПФ, которые отрабатывают по разному. Ну и какой шлак, тогда будет внутри?
18. Vovan1975 13 26.04.17 16:55 Сейчас в теме
Спасибо!
Очень познавательно.
22. &rew 49 27.04.17 07:18 Сейчас в теме
Подождите, Господа. Тут речь идет не о том, через какое место лучше делать. Человек сказал что можно вот так. А как делать оптимальнее, зависит от задачи и от ЗУНов каждого конкретного прогера.
23. Rasdag 159 19.06.17 01:52 Сейчас в теме
Не помешало бы расширение закинуть что бы на нее глазами посмотреть
24. niko11s 988 19.06.17 07:31 Сейчас в теме
(23) Так в статье весь код есть. Хотя можно и выложить.
25. zhuravlev_as 392 17.05.18 09:19 Сейчас в теме
Вот уже и становится задача перед тем, как реализовать дополнительную печатную форму в базе. А задача, как доп. печ. форму реализовать - или через внешнюю обработку, или через механизм расширений.
26. zhuravlev_as 392 17.05.18 09:19 Сейчас в теме
(25) Хотя, признаюсь честно, что через расширения больше как-то нравится.
27. r1000 24.08.18 11:48 Сейчас в теме
А обязательно в общие макет добавлять свой новый макет, или можно добавить типовой макет в расширении его там поправить ? попробовал так сделать - не получается. говорит что макет к которому обращаюсь не найден.
30. Ujine1313 9 08.12.20 18:33 Сейчас в теме
(27)Макет надо добавить в расширение не заимствованием а полным копирование в расширение и вызвать макет из расширения
Макет = ПолучитьМакет("ПФ_MXL_АктОбУслугах1");
где ПФ_MXL_АктОбУслугах1 - макет который был скопирован из стандартного документа где имел имя ПФ_MXL_АктОбУслугах
pilot_Danik; +1 Ответить
31. MindParadox 26.02.21 14:57 Сейчас в теме
(30) Вопрос:
Про получение макета в расширении Вы пишите: Макет = ПолучитьМакет("ПФ_MXL_АктОбУслугах1");
Смотрю в инете - не заметил, чтобы меняли способ получения макета. Оставляют прежнее (из основной конфы), например так:
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.АктСверкиВзаиморасчетов.ПФ_MXL_АктСверки");
Почему в одних случаях так, а в других иначе? ....или я что-то не понимаю?

P.S.
Я в расширении сначала оставил получение макета как с основной конфе - ПФ без внесённых изменений. После изменил получение макета на "Макет=ПолучитьМакет...." - ПФ со всеми изменениями. В расширении - функция (&Вместо)
Оставьте свое сообщение