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