Документ с печатью и подписью

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

Статья является продолжением цикла статей и разработок:
Внешние печатные формы в восьмерке http://infostart.ru/blogs/157
Обработка для тестирования внешних печатных форм в восьмерке http://infostart.ru/projects/833/
Использование встроенного почтового клиента — http://infostart.ru/blogs/161/
Документ с печатью и подписью — http://infostart.ru/blogs/162/
Внешние печатные формы в восьмерке II — http://infostart.ru/blogs/324/
Заполнение табличных частей документов в восьмерке (внешние обработки) http://infostart.ru/blogs/345/
Обработка для тестирования внешних обработок изменения табличных частей http://infostart.ru/projects/1749/
Использование свойств объектов при доработке типовых конфигураций http://infostart.ru/blogs/692/

При отправке документов по электронной почте //infostart.ru/articles/161/?ref=4246 клиент справедливо желает, что бы на документе стояла печать и подписи ответственных лиц. Самый простой способ – создать макет печатной формы с отсканированной печатью и подписями. Такой подход хорош тогда, когда работа идет от имени одной организации и ответвленные лица, которые заверяют документ, не меняются в течение длительного времени. В остальных случаях необходимо создавать множество макетов, что совершенно непрактично.

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

Для этого создадим новый регистр сведений «Изображения» с измерением «Объект» типа «СправочникСсылка.Организации, СправочникСсылка.ФизическиеЛица» и ресурсом «Изображение» типа «ХранилищеЗначения». Сформируем основную форму записи. Устанавим на ней поле картинки, поле для выбора объекта и кнопку «Загрузить». В модуле формы пишем код:

Процедура ДействияФормыЗагрузить(Кнопка) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл с изображением";
Диалог.ПолноеИмяФайла = "";
Диалог.ПредварительныйПросмотр = Истина;
Диалог.Фильтр = "Все картинки (*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf)|*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf|" + "Формат bmp (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle|" + "Формат JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|" + "Формат TIFF (*.tif)|*.tif|" + "Формат GIF (*.gif)|*.gif|" + "Формат PNG (*.png)|*.png|" + "Формат icon (*.ico)|*.ico|" + "Формат метафайл (*.wmf;*.emf)|*.wmf;*.emf|"; // картинки Если Диалог.Выбрать() Тогда ВыбранноеФото = Новый Картинка(Диалог.ПолноеИмяФайла,Ложь);
ЭлементыФормы.Картинка.Картинка = ВыбранноеФото;
РегистрСведенийМенеджерЗаписи.Изображение = Новый ХранилищеЗначения(ВыбранноеФото);
КонецЕсли;

КонецПроцедуры Процедура ПриОткрытии() Картинка = РегистрСведенийМенеджерЗаписи.Изображение.Получить();
Если Картинка <> Неопределено Тогда ЭлементыФормы.Картинка = Картинка;
КонецЕсли;

КонецПроцедуры 

В макете добавляем рисунки, называем их «Печать», «РуководительПодпись», «БухгалтерПодпись». В модуле формирования печатной формы добавляем код:

ОбластьМакета = Макет.ПолучитьОбласть("ПодвалСчета");

// Здесь может быть еще какой-нибудь код РегИзображения = РегистрыСведений.Изображения.СоздатьМенеджерЗаписи();

РегИзображения.Объект = Шапка.Организация;
РегИзображения.Прочитать();
Картинка = РегИзображения.Изображение.Получить();
Если ТипЗнч(Картинка) = Тип("Картинка") Тогда ОбластьМакета.Рисунки.Печать.Картинка = Новый Картинка(Картинка.ПолучитьДвоичныеДанные(), Истина);
КонецЕсли;

СписокПоказателей = Новый СписокЗначений;
СписокПоказателей.Добавить("","ФИОРук");
СписокПоказателей.Добавить("","ФИОБух");
мСведенияОбОрганизации = ПолучитьСведенияОбОрганизации(Шапка.Организация, Шапка.Дата, СписокПоказателей);

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

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

ТабДокумент.Вывести(ОбластьМакета);

Если у нас нет возможности изменить макет табличного документа, тогда добавляем рисунки сразу в табличный документ:

РегИзображения = РегистрыСведений.Изображения.СоздатьМенеджерЗаписи();

РегИзображения.Объект = Шапка.Организация;
РегИзображения.Прочитать();
Картинка = РегИзображения.Изображение.Получить();
Если ТипЗнч(Картинка) = Тип("Картинка") Тогда Рисунок = ТабДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(Картинка.ПолучитьДвоичныеДанные(), Истина);
Рисунок.Имя = "Печать";
Рисунок.Высота = 30;
Рисунок.Ширина = 30;
Рисунок.Верх = 110 + 4 * ТабДокумент.ВысотаТаблицы;
Рисунок.Лево = 7;
Рисунок.ГраницаСверху = Ложь;
Рисунок.ГраницаСнизу = Ложь;
Рисунок.ГраницаСправа = Ложь;
Рисунок.ГраницаСлева = Ложь;
Рисунок.Узор = ТипУзораТабличногоДокумента.БезУзора;

КонецЕсли;

34 Comments

  1. CheBurator

    Н-дя… а пользы от этого?

    М.б. ЭЦП подписывать письмо?

    Reply
  2. poppy

    > Н-дя… а пользы от этого?

    Это замена передачи документов по факсу. ЭЦП здесь точно не при чем…

    Reply
  3. NewNick

    >Для этого создадим новый регистр сведений «Изображения» с измерением «Объект» >типа «СправочникСсылка.Организации, СправочникСсылка.ФизическиеЛица» и >ресурсом «Изображение» типа «ХранилищеЗначения». Сформируем основную форму записи. >Устанавим на ней поле картинки, поле для выбора объекта и кнопку «Загрузить». В модуле формы >пишем код:

    А если не секрет чем нас не устраивает справочник «ХранилищеДополнительнойИнформации» ? Вроде он есть во всех типовых конфигурациях, и ненадо лишний раз тормошить метаданные.

    Reply
  4. poppy

    > А если не секрет чем нас не устраивает справочник «ХранилищеДополнительнойИнформации» ?

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

    Всем устраивает. С точки зрения «тормошения метаданных» — использование справочника «ХранилищеДополнительнойИнформации» решение более грамотное. Для такого решения придется немного подправить мой код.

    С помощью регистра сведений обеспечивается уникальность «изображения» для каждого объекта.

    Reply
  5. NewNick

    >С помощью регистра сведений обеспечивается уникальность «изображения» для каждого объекта.

    Хм ?)

    Reply
  6. d.snissarenko

    мда на самом деле ЭЦП — как более лучший вариант

    Reply
  7. registration

    Ваша ЭЦП Ваших партнеров мало инетресует 😉 Работаем по старинке 🙁

    Reply
  8. sashocq

    Давно и я такое задумал, да все как-то не довелось. Довольно изящно реализовано. Респект!

    Reply
  9. ineoosaki

    в свое время написал конфу — «Создание левых сертефикатов качества».

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

    очень помагает в работе… 🙂

    жаль, что такие вещи выкладывать нельзя…

    Reply
  10. Dadjbog

    Такая проблемка. При выводе на принтер катинка с печатью теряет прозрачность и выводится в белом прямоугольнике. Что я делаю не так? :'(

    Reply
  11. poppy

    (10)

    У тебя на экране картинка прозрачная?

    Reply
  12. Dadjbog

    (11) Да. прозрачная.

    Reply
  13. poppy

    (12) Не знаю чем помочь. Вероятно, платформа неправильно взаимодействует с драйвером принтера.

    Reply
  14. Душелов

    Можно попоровать мою html2image 😉 Как бы работает у ряда клиентов..

    Reply
  15. thorben

    Подскажите! У меня что-то не работает. Ошибок никаких нет, вот только печать и подпись остается одна и таже, которую я ввел на макет. Или я как-то по-другому должен был вводить рисунки?

    Reply
  16. poppy

    (15) Присылай свою обработку. Посмотрю.

    Reply
  17. thorben

    Спасибо, разобрался уже. Только теперь другая проблема. На экран все выводится прекрасно. Только когда я сохраняю документ в формате PDF, то все картинки gif становятся с черной заливкой. Если же беру jpg, то из прозрачных они превращаются в непрозрачные. Был бы благодарен за интересную подсказку.

    Reply
  18. poppy

    (17) Может проблема в программе, которая сохраняет в формате PDF?

    Reply
  19. madvik

    (17) У меня была та же проблема. Как оказалось, виновна не платформа, а драйвер принтера. Методом перебора установили, что на ХП лазерджет 1100 и на каком-то Коника печатает нормально, а вот на Ксероксе — черная заливка.

    Reply
  20. manlak

    спасибо большое!

    Reply
  21. alina-aud

    (18) Подскажите, почему такая ошибка вылезает ..

    {РегистрСведений.Изображения.Форма.ФормаСписка(20,3)}: Переменная не определена (РегистрСведенийМенеджерЗаписи)

    <<?>>РегистрСведенийМенеджерЗаписи.Изображение = Новый ХранилищеЗначения(ВыбранноеФото);

    {РегистрСведений.Изображения.Форма.ФормаСписка(27,13)}: Переменная не определена (РегистрСведенийМенеджерЗаписи)

    Картинка = <<?>>РегистрСведенийМенеджерЗаписи.Изображение.Получить();

    Reply
  22. poppy

    (21) РегистрСведенийМенеджерЗаписи — это реквизит формы типа РегистрСведенийМенеджерЗаписи.Изображения.

    У тебя такого реквизита нет, либо он имеет другой идентификатор.

    Reply
  23. pam71

    (22) А можно по подробнее, а то у меня такая же ошибка. Помгите, напишите подробнее что мне делать.

    Reply
  24. logdog

    (22) А под 8.2 для БУХ 2.0 данная статья будет адаптирована?

    Reply
  25. bullit.w

    Подскажите уважаемый poppy, почему после отправки счета с вставленной подписью и печатью из УТ 10.3 она приходит получателю с «невозможно отобразить рисунок» Подпись и печать вставлены в формате .jpeg ❓

    Reply
  26. vladuser

    Добрый день!

    Помогите разобраться новичку…

    Выдает следующую ошибку

    {Документ.СчетНаОплатуПокупателю(525,33)}: Переменная не определена (Шапка)

    РегИзображения.Объект = <<?>>Шапка.Организация; (Проверка: Толстый клиент (обычное приложение))

    {Документ.СчетНаОплатуПокупателю(535,64)}: Переменная не определена (Шапка)

    мСведенияОбОрганизации = ПолучитьСведенияОбОрганизации(<<?>>Шапка.Организация, Шапка.Дата, СписокПоказателей); (Проверка: Толстый клиент (обычное приложение))

    {Документ.СчетНаОплатуПокупателю(535,83)}: Переменная не определена (Шапка)

    мСведенияОбОрганизации = ПолучитьСведенияОбОрганизации(Шапка.Организация, <<?>>Шапка.Дата, СписокПоказателей); (Проверка: Толстый клиент (обычное приложение))

    {Документ.СчетНаОплатуПокупателю(535,34)}: Процедура или функция с указанным именем не определена (ПолучитьСведенияОбОрганизации)

    мСведенияОбОрганизации = <<?>>ПолучитьСведенияОбОрганизации(Шапка.Организация, Шапка.Дата, СписокПоказателей); (Проверка: Толстый клиент (обычное приложение))

    Конфигурация торговля 10.3.

    что не так?

    Reply
  27. cool.vlad4

    (26) Черным по белому написано — шапка не определенна, скорее всего это результат запроса, он у тебя есть?

    Reply
  28. SchemeR

    Есть такая утилита.

    http://docland.ru/node/34

    Конвертирует доки (счета) в PDF;

    По ИНН-у организации подбирает соответствующее изображение подписи печати, которую надо шлепнуть в счет;

    Автоматом создает е-mail, куда вставляет адрес клиента, полученный PDF со счетом подписанного документа, типовое обращение.

    Работает как внешняя утилита при печати счета на виртуальный принтер.

    Соответственно, работает хоть с 1С8, 7.7, SAP или Word.

    Reply
  29. alenakrr

    странная и стремная необходимость печатать печати и подписей бухгалтеров…

    ладно бы логотип фирмы и шапку исходящего документа…

    и почему не используются стандартная для всех конфигураций схема со справочником «Хранилище дополнительной информации» — был создан подобный регистр?!

    Reply
  30. zhleonid8

    реально пригодится при формировании актов сверок с 1000 контрагентов:)

    Reply
  31. si4

    Очень нужная статья! спасибо!

    Reply
  32. oleg_ss

    Да на данный момент тема актуальна, т.к. сверки надо делать.

    Хотя лучше мень вмешиваться в конфу, а то потом замучаешься обновлять, есть печальный опыт.

    Хотелось сделать как лучше бухам, а теперь куча проблемм в итоге.

    Спасибо.

    Reply
  33. Mamakan

    Очень нужная в данный момент статья! спасибо большое!

    Reply
  34. Asdam

    Если использовать справочник «ХранилищеДополнительнойИнформации», который присутствует в типовых конфигурациях, тогда и снимать с поддержки конфигурацию нет необходимости.

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

    Показать

    Reply

Leave a Comment

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