1С: проблема с общими макетами в расширении

Задача: при печати РКО сумма прописью должна выводится всегда. Конфигурация находится на поддержке

Конфигурация: BAS Бухгалтерія, редакція 2.1 (2.1.2.1)

Платформа: 1С:Предприятие 8.3 (8.3.14.1779)

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

  • внешние печатные формы
  • расширения

Воспользуемся новым для украинских конфигураци механизмом расширений.

Шаг 1. Заимствуем нужные объекты

Необходимо позаимствовать 2 печатных формы (ПФ_MXL_UK_КО2 и ПФ_MXL_UK_КО2_2018) и документ "Расходный кассовый ордер". В документе нам необходим будет модуль менеджера.

Заимствуем объекты в расширение

Шаг 2. Редактируем модуль менеджера

В модуле менеджера необходимо обновить 2 процедуры (ДобавитьКомандыПечати и Печать) и добавить функцию ПечатьРКОСуммаПрописью, которая будет возвращать сформированный табличный документ.

&После("ДобавитьКомандыПечати")
Процедура ДобавитьКомандыПечатиРасш(КомандыПечати) Экспорт
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "РКОСуммаПрописью";
	КомандаПечати.Представление = НСтр("ru='Расходный кассовый ордер (сумма прописью)';uk='Видатковий касовий ордер (сумма прописью)'");
	КомандаПечати.Обработчик    = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";	
КонецПроцедуры

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


// Функция формирует табличный документ с печатной формой накладной,
// разработанной методистами
//
// Возвращаемое значение:
//  Табличный документ - печатная форма накладной
//
Функция ПечатьРКОСуммаПрописью(МассивОбъектов, ОбъектыПечати)

	УстановитьПривилегированныйРежим(Истина);
	
	ВалютаРегламентированногоУчета = ОбщегоНазначенияБПВызовСервераПовтИсп.ПолучитьВалютуРегламентированногоУчета();
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

	Запрос.Текст =
	"ВЫБРАТЬ
	|	Ссылка,
	|	Номер,
	|	Дата                          КАК ДатаДокумента,
	|	Организация,
	|	ВидОперации,
	|	СчетКасса,
	|	ОбособленноеПодразделениеОрганизации,
	|	ОбособленноеПодразделениеОрганизации.НаименованиеПолное КАК ОбособленноеПодразделениеОрганизацииПредставление,
	|	СуммаДокумента                КАК Сумма,
	|	Контрагент,
	|	Контрагент.Представление      КАК ФИОПолучателя,
	|	ВалютаДокумента               КАК Валюта,
	|	ВалютаДокумента.Представление КАК ВалютаПредставление,
	|	Выдать,
	|	Приложение,
	|	ПоДокументу,
	|	Основание,
	|	НомерОрдера
	|ИЗ
	|	Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер
	|
	|ГДЕ
	|	РасходныйКассовыйОрдер.Ссылка В(&МассивОбъектов)";

	Шапка = Запрос.Выполнить().Выбрать();
	ПервыйДокумент = Истина;
	
	ТабДокумент   = Новый ТабличныйДокумент;
	ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РасходныйКассовыйОрдер_КО2";
	
	Пока Шапка.Следующий() Цикл

		Если НЕ ПервыйДокумент Тогда
			ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		
		ПервыйДокумент = Ложь;
		// Запомним номер строки, с которой начали выводить текущий документ.
		НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;
		
		Вариант2018 = Истина;
		Если Шапка.ДатаДокумента >= Дата('20180105') Тогда
			Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_UK_КО2_2018");
		Иначе
			Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_UK_КО2");
			Вариант2018 = Ложь;
		КонецЕсли;
		
		ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
		КодЯзыкаПечать = "uk";
		
		СведенияОбОрганизации = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Шапка.Организация, Шапка.ДатаДокумента);
		
		// Выводим шапку накладной
		ОбластьМакета.Параметры.Заполнить(Шапка);
		
		Если Вариант2018 Тогда
			ПредставлениеДаты = Формат(Шапка.ДатаДокумента, "Л=uk_UA; ДЛФ=DD");
			ПредставлениеДаты = Сред(ПредставлениеДаты, 1, СтрДлина(ПредставлениеДаты) - 2) + "року";
			ОбластьМакета.Параметры.ДатаДокументаШапка = ПредставлениеДаты;
		КонецЕсли;
		
		Если НЕ ЗначениеЗаполнено(Шапка.ОбособленноеПодразделениеОрганизации) Тогда
			ОбластьМакета.Параметры.ПолноеНаименование 	= СведенияОбОрганизации.ПолноеНаименование;
		Иначе
			ОбластьМакета.Параметры.ПолноеНаименование = Шапка.ОбособленноеПодразделениеОрганизацииПредставление;
		КонецЕсли;
		
		ОбластьМакета.Параметры.Сумма             	= ОбщегоНазначенияБПВызовСервера.ФорматСумм(Шапка.Сумма, Шапка.Валюта);
		
		//Если Вариант2018 И (Шапка.ВидОперации = Перечисления.ВидыОперацийРКО.ВзносНаличнымиВБанк
		//	Или Шапка.ВидОперации = Перечисления.ВидыОперацийРКО.ВыплатаЗаработнойПлатыПоВедомостям
		//	Или Шапка.ВидОперации = Перечисления.ВидыОперацийРКО.ИнкассацияДенежныхСредств) Тогда 
		//	ОбластьМакета.Параметры.СуммаПрописью = ?(Шапка.Валюта = ВалютаРегламентированногоУчета, "грн      коп.", "");
		//	ОбластьМакета.Область("R15C2:R15C8").ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;
		//Иначе
			ОбластьМакета.Параметры.СуммаПрописью = ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью(Шапка.Сумма, Шапка.Валюта, КодЯзыкаПечать);
		//КонецЕсли;
		
		
		Если Шапка.Валюта = ВалютаРегламентированногоУчета Тогда
			ОбластьМакета.Параметры.СуммаПрописьюПолучил = ?(Вариант2018, "грн      коп.", "грн.      коп.");
		Иначе
			ОбластьМакета.Параметры.СуммаПрописьюПолучил = "";
		КонецЕсли;
		
		Попытка
				ОбластьМакета.Параметры.КодПоЕДРПОУ 		= БухгалтерскийУчетПереопределяемый.ПолучитьКодОрганизации(СведенияОбОрганизации);	
		Исключение
		    //ОписаниеОшибки()
		КонецПопытки;
		
		Если НЕ ЗначениеЗаполнено(Шапка.ОбособленноеПодразделениеОрганизации) Тогда
			Руководители = ОтветственныеЛицаБП.ОтветственныеЛица(Шапка.Организация, Шапка.ДатаДокумента);
		Иначе
			Руководители = ОтветственныеЛицаБП.ОтветственныеЛицаОбособленногоПодразделения(Шапка.ОбособленноеПодразделениеОрганизации, Шапка.ДатаДокумента);
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Руководители.РуководительФИО) Тогда
			ОбластьМакета.Параметры.ФИОРуководителя = ОбщегоНазначенияБПВызовСервера.ПолучитьФамилиюИмяОтчество(Руководители.РуководительФИО.Фамилия, Руководители.РуководительФИО.Имя, Руководители.РуководительФИО.Отчество, Истина); // Кратко
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Руководители.ГлавныйБухгалтерФИО) Тогда
			ОбластьМакета.Параметры.ФИОБухгалтера   = ОбщегоНазначенияБПВызовСервера.ПолучитьФамилиюИмяОтчество(Руководители.ГлавныйБухгалтерФИО.Фамилия, Руководители.ГлавныйБухгалтерФИО.Имя, Руководители.ГлавныйБухгалтерФИО.Отчество, Истина); // Кратко
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Руководители.КассирФИО) Тогда
			ОбластьМакета.Параметры.ФИОКассира      = ОбщегоНазначенияБПВызовСервера.ПолучитьФамилиюИмяОтчество(Руководители.КассирФИО.Фамилия, Руководители.КассирФИО.Имя, Руководители.КассирФИО.Отчество, Истина); // Кратко
		КонецЕсли;
		
		Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("ТекущийДокумент", Шапка.Ссылка);
		
		Запрос.УстановитьПараметр("Счет", Шапка.СчетКасса);
		
		Запрос.Текст =
		"ВЫБРАТЬ
		|	Проводки.СчетДт КАК СчетДт
		|ИЗ
		|	РегистрБухгалтерии.Хозрасчетный КАК Проводки
		|
		|ГДЕ
		|	Проводки.Регистратор = &ТекущийДокумент И
		|	Проводки.СчетКт = &Счет"+
		?( Шапка.СчетКасса.Валютный, "
		|// проводки по курсовой разнице (без валютной суммы) пропускаем
		|	И Проводки.ВалютнаяСуммаКт <> 0","");
		
		ВыборкаСчетов = Запрос.Выполнить().Выбрать();
		
		СписокСчетов = ""; Разделитель = "";
		
		Пока ВыборкаСчетов.Следующий() Цикл
			Если Найти(СписокСчетов, Строка(ВыборкаСчетов.СчетДТ)) <> 0 Тогда
				Продолжить;
			КонецЕсли;	
			СписокСчетов = СписокСчетов + Разделитель + Строка(ВыборкаСчетов.СчетДТ);
			Разделитель = ", ";
		КонецЦикла;	
		ОбластьМакета.Параметры.Счет = СписокСчетов;
		
		
		ТабДокумент.Вывести(ОбластьМакета);
		
		// В табличном документе зададим имя области, в которую был 
		// выведен объект. Нужно для возможности печати покомплектно.
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДокумент, 
		НомерСтрокиНачало, ОбъектыПечати, Шапка.Ссылка);
		
	КонецЦикла;

	Возврат ТабДокумент;

КонецФункции // ПечатьРКО()

Проверяем.

Новый элемент списка в меню печати

Печатная форма формируется, но немного странная: отстуствует КодПоЕДРПОУ и текст "Додаток 3":

Разница в напечатанных РКО

Любопытная ситуация. Макет печатной формы возвращает функция УправлениеПечатью.МакетПечатнойФормы. С помощью инструментов разработчика (Функция Ис() при отладке) проверим, какую форму возвращает "чистая" конфигурация, а какую конфигурация с расширением:

Разница в макетах между "чистой" конфигурацией и расширением

Интересное поведение платформы. Объяснения, честно говоря, нет.

Шаг 3. Копируем печатные формы в расширение

Опытным путем было выяснено: для решения задачи с помощью расширений необходимо не заимствовать общие печатные формы, а копировать их в расширение и переименовать. В коде небходимо обращаться к скопированным макетам по именам:

Исправленное расширение


Похожие материалы

Комментарии