Всем доброго дня.
Поставили мне задачу массово напечатать/сохранить/разослать акты сверок.
Не думал, что данная задача когда-нибудь отнимет у меня столько времени, однако современные продукты от 1С умеют удивлять. Казалось бы, выведи печатную форму через менеджер и дело с концом. И там же, скорее всего, признак печати факсимиле "да/нет" ...
Однако, если с первой частью действительно особо хлопот не возникло, то вот понять замысел разработчиков с системой "факсимиле" мне так и не удалось.
После нескольких часов реверс инжиниринга отладки, алгоритм вырисовался такой: в печатной форме есть встроенные картинки с поименованными областями. Мы их все запомним, а потом... УДАЛИМ. А вместо этого добавим область с расшифровкой в виде временной ссылки на структуру, в которой будет информация о том, что здесь когда-то была такая-то область с ее геометрическими размерами и расположением. И если вы хотите вернуть все обратно, будьте добры  - восстановите из структуры картинки, их размещение, и тогда вы получите свои факсимиле и печати.
При этом, если честно, писать особо ничего не пришлось. Я просто скопировал одну функцию и одну процедуру из общего модуля УправлениеПечатьюБП и вызвал их.
Самое главное - это можно сделать во внешней обработке и никак не изменять бухгалтерскую конфу.
Возможно, кому-то сэкономит время.
Собственно код:
Функция МассивИменПоказателейФаксимиле()
	
	МассивИменПоказателей = Новый Массив;
	МассивИменПоказателей.Добавить("ФаксимилеПечать");
	МассивИменПоказателей.Добавить("ФаксимилеПечатьПредприниматель");
	МассивИменПоказателей.Добавить("ФаксимилеРуководитель");
	МассивИменПоказателей.Добавить("ФаксимилеРуководительНакладная");
	МассивИменПоказателей.Добавить("ФаксимилеПредприниматель");
	МассивИменПоказателей.Добавить("ФаксимилеГлавныйБухгалтер");
	МассивИменПоказателей.Добавить("ФаксимилеОтветственныйЗаОформление");
	МассивИменПоказателей.Добавить("ФаксимилеИсполнитель");
	МассивИменПоказателей.Добавить("ФаксимилеИсполнительНакладнаяУслуги");
	МассивИменПоказателей.Добавить("ФаксимилеИсполнительНакладнаяМатериалы");
	МассивИменПоказателей.Добавить("ФаксимилеКладовщик");
	МассивИменПоказателей.Добавить("ФаксимилеДоверенноеЛицо");
	// для совместимости - подвал Счета
	МассивИменПоказателей.Добавить("ФаксимильнаяПечать");
	МассивИменПоказателей.Добавить("ФаксимильнаяПечатьПредприниматель");
	
	Возврат МассивИменПоказателей;
	
КонецФункции
Процедура УправлениеКартинкойФаксимиле(РабочаяПечатнаяФорма, МассивИменПоказателей, Добавить = Истина)
	
	МассивИменОбластей = Новый Массив;
	Для Каждого ОбластьМакета ИЗ РабочаяПечатнаяФорма.Области Цикл
		Если СтрНайти(ОбластьМакета.Имя, "РасшифровкаФаксимилеМакета") <> 0 Тогда
			МассивИменОбластей.Добавить(ОбластьМакета.Имя);
		КонецЕсли;
	КонецЦикла;
	
	ЦветФонаБелый = Новый Цвет(255,255,255);
	ЦветФонаАвто  = Новый Цвет();
	
	Для Каждого ИмяОбластиМакета ИЗ МассивИменОбластей Цикл
		
		ОбластьМакета = РабочаяПечатнаяФорма.Области[ИмяОбластиМакета];
		Если НЕ ЭтоАдресВременногоХранилища(ОбластьМакета.Расшифровка) Тогда
			Продолжить;
		КонецЕсли;
		
		ДанныеФаксимиле = ПолучитьИзВременногоХранилища(ОбластьМакета.Расшифровка);
		Если ТипЗнч(ДанныеФаксимиле) <> Тип("Структура") Тогда
			Продолжить;
		КонецЕсли;
		
		Для Каждого ЗначениеПоказателя ИЗ МассивИменПоказателей Цикл
			
			Если НЕ ДанныеФаксимиле.Свойство(ЗначениеПоказателя) Тогда
				Продолжить;
			КонецЕсли;
			
			СтруктураЗначений = ДанныеФаксимиле[ЗначениеПоказателя];
			
			ИмяОбластиФаксимиле = ЗначениеПоказателя + "_" + СтруктураЗначений.ОбластьВладелец;
			
			АдресКартинки = СтруктураЗначений.ДанныеКартинки;
			
			Если Добавить И ЗначениеЗаполнено(АдресКартинки) Тогда
				
				ОбластьКартинки = РабочаяПечатнаяФорма.Области[СтруктураЗначений.ОбластьВладелец];
				
				РисунокТабличногоДокумента = РабочаяПечатнаяФорма.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
				РисунокТабличногоДокумента.Имя = ИмяОбластиФаксимиле;
				РисунокТабличногоДокумента.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
				РисунокТабличногоДокумента.РазмерКартинки = РазмерКартинки.Пропорционально;
				РабочаяПечатнаяФорма.Рисунки[РисунокТабличногоДокумента.Имя].Картинка = ПолучитьИзВременногоХранилища(АдресКартинки);
				РабочаяПечатнаяФорма.Рисунки[РисунокТабличногоДокумента.Имя].Расположить(ОбластьКартинки);
				РабочаяПечатнаяФорма.Рисунки[РисунокТабличногоДокумента.Имя].Верх           = СтруктураЗначений.Верх;
				РабочаяПечатнаяФорма.Рисунки[РисунокТабличногоДокумента.Имя].Лево           = СтруктураЗначений.Лево;
				РабочаяПечатнаяФорма.Рисунки[РисунокТабличногоДокумента.Имя].Высота         = СтруктураЗначений.Высота;
				РабочаяПечатнаяФорма.Рисунки[РисунокТабличногоДокумента.Имя].Ширина         = СтруктураЗначений.Ширина;
				Если СтрНайти(РисунокТабличногоДокумента.Имя, "ФаксимильнаяПечать") > 0 Тогда
					РабочаяПечатнаяФорма.Рисунки[РисунокТабличногоДокумента.Имя].ЦветФона   = ЦветФонаБелый;
				Иначе
					РабочаяПечатнаяФорма.Рисунки[РисунокТабличногоДокумента.Имя].ЦветФона   = ЦветФонаАвто;
				КонецЕсли;
			Иначе
				
				Если РабочаяПечатнаяФорма.Области.Найти(ИмяОбластиФаксимиле) <> Неопределено Тогда
					РабочаяПечатнаяФорма.Рисунки.Удалить(ИмяОбластиФаксимиле);
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЦикла
		
	КонецЦикла;
	
КонецПроцедуры
Получение табличного документа с факсимиле (СсылкаНаДокумент):
    ПечатьСПодписями = истина;
    МассивДокументов = Новый Массив();
    МассивДокументов.Добавить(СсылкаНаДокумент);
    ПараметрыПечати = Новый Структура();
    ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы("Документ.АктСверкиВзаиморасчетов", "АктСверки", МассивДокументов, ПараметрыПечати); 
    Коллекция = ПечатныеФормы.КоллекцияПечатныхФорм;
    Если Коллекция.Количество() тогда
        ТабличныйДокумент = Коллекция[0].ТабличныйДокумент;
		УправлениеКартинкойФаксимиле(ТабличныйДокумент,МассивИменПоказателейФаксимиле(),ПечатьСПодписями)
        возврат ТабличныйДокумент;
    КонецЕсли;
	
Вступайте в нашу телеграмм-группу Инфостарт
