Имя: Пароль:
1C
1С v8
v8: Вывод логотипа фирмы при печати внизу каждой страницы. Эпизод 2. Универсальн
0 RafaelRS
 
31.01.12
12:41
Предыдущая ветка была тут:
v8: вывод логотипа фирмы при печати внизу каждой страницы

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

Задумал сделать универсальный механизм. И даже сделал его. При этом логотип запихал в общий макет где две строки - одна с пустой строкой, другая с логотипом. Просто вызываешь при печати в трех участках алгоритма печати и все ок... Кроме кое чего.

Как не крутился, так и не понял, как добиться того, чтобы логотип становился в ПРАВЫЙ угол печатной формы. Пробывал .ШиринаТаблицы, и потом выводить в соответствующей колонке, выходит полная ерунда. Более стабильный результат выходит тогда, когда используешь .Лево. Но тоже как то плавающе все - во первых не всегда выводится прямо в правый угол, во вторых при выводе на печать может думать что справа колонки дополнительные тоже надо выводить, хотя они пустые. Часть "глюков" удалось решить тем, что в донорском макете/шаблоне надо было поместить логотип строго в одну ячейку, чтобы он не вылезал в другие. Но проблемы все же остаются.

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

Для того, чтобы вывести логотип в Торг-12 например, достаточно добавить 3 строки:

Первая:
           МассивВыводимыхОбластей.Очистить();
           МассивВыводимыхОбластей.Добавить(ОбластьМакета);
           МассивВыводимыхОбластей.Добавить(ОбластьИтоговПоСтранице);
           // begin - RafaelRS mod - вывод логотипа снизу
           МассивВыводимыхОбластей.Добавить(ДополнительныеФункции.ВывестиЛоготипВПечатнойФорме(Шапка.Организация, ТабДокумент, Истина));
           // end - RafaelRS mod - вывод логотипа снизу
           Если НомерСтроки = КоличествоСтрок Тогда
               МассивВыводимыхОбластей.Добавить(ОбластьПодвала);
               МассивВыводимыхОбластей.Добавить(ОбластьМакетаВсего);
           КонецЕсли;        

Вторая:
               ТабДокумент.Вывести(ОбластьИтоговПоСтранице);
               // begin - RafaelRS mod - вывод логотипа снизу
               ДополнительныеФункции.ВывестиЛоготипВПечатнойФорме(Шапка.Организация, ТабДокумент);
               // end - RafaelRS mod - вывод логотипа снизу
Третья:
   // begin - RafaelRS mod - вывод логотипа снизу
   ДополнительныеФункции.ВывестиЛоготипВПечатнойФорме(Шапка.Организация, ТабДокумент);
   // end - RafaelRS mod - вывод логотипа снизу
   
   Возврат ТабДокумент;

В других документах может быть посложнее, например в счет фактуре механизм автоматического вывода шапки таблицы на каждой странице, от него придется отказаться и выводить шапку вручную по аналогии с Торг-12. Счет из заказа несмотря на простоту потребовал еще большей переделки. Но там все некритично, и результатом я вообщем то доволен.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн