Альтернативный способ доработки типовых печатных форм. БСП

Всем известен способ доработки типовой печатной формы, когда ее код копируется в модуль обработки. Конечно, 1С плохо изолирует функции и там приходится немного повозиться, но ничего сложного. Например, тут описана последовательность.

Недостаток — нужно отслеживать изменения в типовом макете и алгоритмах. Можно, конечно, дергать типовой макет, но иногда 1С и код по выбору макета берет меняет, например, если печатная форма зависит от даты документа.

А если нужно всего-лишь поменять название номенклатуры? Зачем эти сложности.

Можно просто в своей печатной форме вызвать типовую печатную форму. Например так:

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

А далее при получении данных для печати формы, просто определить, работаем ли мы из своей внешней печатной формы, и если да, то сделать нужные замены.

Вот код по замене данных в модуле менеджера расходной накладной:

&Вместо("ДанныеДокументовРегУчет")
Функция Доп_ДанныеДокументовРегУчет(МассивОбъектов, ИспользоватьФаксимиле, ПечатнаяФормаТолькоВРублях, Ошибки)
	//Осипов - подменяем данные объектов по заменам
	Результат = ПродолжитьВызов(МассивОбъектов, ИспользоватьФаксимиле, ПечатнаяФормаТолькоВРублях, Ошибки);
	Если Доп_С.ЭтоПечатьИзВнешнейПечатнойФормойСЗаменами() Тогда
		//Подменяем в таблице запасов
		Для Каждого СтрокаДокумента ИЗ Результат Цикл   
			Сч = 0;
			Для Каждого Строка ИЗ СтрокаДокумента.ТаблицаЗапасы Цикл
				Сч = Сч + 1;
				Строка.ПредставлениеНоменклатуры = "" + Сч;
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	Возврат Результат;
КонецФункции

Определяем, наша печатная форма УПДСЗаменами или нет с помощью анализа стека:

Функция ЭтоПечатьИзВнешнейПечатнойФормойСЗаменами() Экспорт
	Попытка
		Ошибка = 1 / 0;  //https://infostart.ru/1c/articles/1879817/
	Исключение
		ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;	
	Возврат Найти(ПодробноеПредставлениеОшибки, "ВнешняяОбработка.УПДСЗаменами");
КонецФункции

В результате имеем то, что нам нужно (названия товаров заменены цифрами):

Красиво, гениально! Для меня лично нет ничего более приятного, чем обманывать 1С, когда удается легко подсунуть ей нужные мне данные. Учитывая, как порой это сложно сделать, ведь 1С любит километровой длины процедуры, плохо изолирует функции и плохо документирует код.

Слава богу, тут 1С передает на печать данные в виде коллекции, которую можно обработать самому и даже сохраняет там ссылки на исходные объекты. Это уже небольшие следы улучшений.

Среда: УНФ 3.0.11.142. Объем: 1.5 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментариев 6

  1. rzd:

    Если все равно залез в расширение, то и делай все в расширении. А так это антипаттерн как делать не надо

    • надо — не надо — вкусовщина, если доводы не приводить.
      «Если все равно залез в расширение, то и делай все в расширении» — вот это очень спорный момент.

      • rzd:

        Имеется две подсистемы (внешняя обработка и расширение) в которых функционал разделен таким образом, что каждая из них по отдельности бесполезна без другой. Вопрос, а зачем так делать? Наверное чтобы удобнее было обслуживать. Уже не говорю, что внешняя обработка это бесполезная заглушка, от которой используется только ее имя (о чем будет ниже).
        Проверка вызова через стек, точнее через некое представление стека — это вторая глупость. Что там завтра выдаст в новой платформе и другой локализации? Вот и я не знаю.
        Ну и любимая фишка фиксина — намертво приколачивать типы данных. «ВнешняяОбработка.УПДСЗаменами» — она и только она имеет право на обслуживание этой системой! Ну или фиксин опять полезет в код его менять. Такое вот «переиспользование кода».

        • Весьма сомнительные доводы. ВПФ — известный механизм, почему бы его не использовать.
          Хотя у меня есть статья, как добавлять доп. формы через расширение.
          а в чем приколачивание?

  2. rzd:

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

    • это опять же вкусовщина. про 1с в контексте книг по архитектуре ПО смешно сейчас было.
      я обычно исхожу из принципа — «чтобы дольше прожило у клиента».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *