IE2017

Заполнение PDF формы c полями ввода Сбербанка из 1С для ЗУП

Печать - Печатные формы документов

Сбербанк, осваивая новые технологии, теперь требует заполнять PDF формы c полями. Формы очень замысловатые и трудно поддаются воспроизведению штатными средствами 1С. Делюсь опытом интеграции 1С и Adobe Acrobat.

Заполнение сделано в виде простейшей обработки, которая для списка физ.лиц заполняет форму заявления Сбербанка на банковское обслуживание в рамках зарплатного проекта.

Работает в ЗУП, переделав запрос, можно заставить работать и в УПП и другой конфигурации.

При желании, на базе обработки можно легко сделать внешнюю печатную форму.

Добавлена новая версия бланка заявления 2017 года

Скачать файлы

Наименование Файл Версия Размер
ЗаявлениеНаКартуСбербанкаPDF
.epf 242,73Kb
31.03.17
34
.epf 0.1 242,73Kb 34 Скачать
НОВАЯ версия 2017 ЗаявлениеНаКартуСбербанкаPDF
.epf 756,49Kb
31.03.17
12
.epf 756,49Kb 12 Скачать

См. также

Лучшие комментарии
16. Сергей Лазарев (sly2k) 10.08.17 19:32 Сейчас в теме
Да в принципе я довел (код выше рабочий) - на выходе заполненная и сохраненная форма по указанному пути (пдф при этом закрывается корректно - пользователь даже не замечает что он открывается), а делее заполненную форму я отсылаю автоматом на почту - это уже отдельная история, также как что за форма у меня и чем я ее заполняю.
Остальные комментарии
1. BigB (BigB) 162 09.12.15 14:37 Сейчас в теме
(0) я правильно понимаю, что Вы напрямую разбираете структуру PDF файла из 1С, заполняете поля и потом обратно формируете PDF файл?
2. Александр Лопатин (lopatin) 243 09.12.15 14:38 Сейчас в теме
(1) BigB, По идеи разбирать там ни чего не надо.. используются средства соответствующего COM-объекта для прямого доступа к полям PDF
3. BigB (BigB) 162 09.12.15 14:59 Сейчас в теме
(2) lopatin, если не секрет, какой COM объект используется?
4. vals (vals) 15 09.12.15 19:16 Сейчас в теме
Два объекта, один сам документ, другой слой с полями:
doc = Новый COMОбъект("AcroExch.PDDoc");
form = Новый COMОбъект("AFormAut.App");
5. deadman66 (deadman66) 18.12.15 01:20 Сейчас в теме
(4) vals, эти объекты доступны только с полной версией Acrobat? C ридером нет возможности создать такие объекты, как я понял.
6. vals (vals) 15 18.12.15 08:07 Сейчас в теме
(5) deadman66, верно, нужен Adobe Acrobat либо стандарт либо про.
7. Рустам Газимов (grrus) 19.01.17 13:51 Сейчас в теме
Можно ли получить полный код?
пришлите пожалуйста на grrus@mai.ru
8. vals (vals) 15 19.01.17 17:27 Сейчас в теме
(7) Так там и лежит полный код, ничего не запаролено. Я что-то не так понимаю?
9. Андрей (user652881_verbatim1976) 17.07.17 00:26 Сейчас в теме
Добрый вечер! Скачал Вашу обработку. А где в ней собственно взаимодействие с pdf документом?
Поля = ОткрытьНовыйШаблон("Шаблон"); // Шаблон в двоичных данных
Это как бы самое интересное....
10. vals (vals) 15 17.07.17 07:55 Сейчас в теме
(9) Код открыт. Доступ осуществляется непосредственно к полям документа PDF, в котором эти поля предварительно созданы, и который отрывается как com объект.
Что именно Вам непонятно? С удовольствием поясню.
11. Андрей (user652881_verbatim1976) 18.07.17 23:48 Сейчас в теме
Код слишком мудреный, а пояснений так и не дождался. СомОбъект form = Новый COMОбъект("AFormAut.App") не подключался, выдавал ошибку, требуя его "прикручивания к системе". Перерыв английский сегмент сети, нашел изящное решение по работе только с СомОбъектом doc = Новый COMОбъект("AcroExch.PDDoc").
12. vals (vals) 15 19.07.17 09:16 Сейчас в теме
(11) Мудреного там мало.
Готовим PDF документ с полями, храним его в макете в двоичных данных, создаем запрос для получения данных, которыми нужно заполнить поля (имена полей в запросе и в документе совпадают, это желательно для упрощения кода - простой цикл на несколько строк.)

Идея такова: достаем файл из макета, открываем как СОМ, из него получаем через AFormAut.App из слоя полей документа коллекцию полей, значения которых заполняем данными запроса, убирая пробелы из имени поля, так чтобы они совпадали с именами в запросе, попутно различаем типы полей - если булево, то проставляем соотв. значение:

Для Каждого поле ИЗ Поля Цикл
		Если поле.IsTerminal Тогда
			ИмяПоля = СтрЗаменить(поле.Name, " ", "");
			Если Заполнить.Свойство(ИмяПоля, ЗнПоля) Тогда
				Если ТипЗнч(ЗнПоля) = Тип("Булево") Тогда
					Если ЗнПоля Тогда
						ЗнПоля = "On";
					Иначе
						ЗнПоля = "Off";
					КонецЕсли;	
				КонецЕсли;	
				поле.Value = ЗнПоля;
			КонецЕсли;
		КонецЕсли;	
	КонецЦикла; 
...Показать Скрыть


А вся "мудреность" относится к форматированию номера телефона и трансформации некоторых значений из запроса в значок "Х" по требованиям заполнения перед циклом заполнения.
13. Сергей Лазарев (sly2k) 09.08.17 14:18 Сейчас в теме
Пытаюсь адаптировать вашу обработку под заполнение форм из из 1с 77. Для наглядности форма лежит по фиксированному пути.
Получилась вот такая выжимка, сделанная из вашего кода с преобразованием под 77, которая заполняет одно из полей формы:
	Док=СоздатьОбъект("AcroExch.PDDoc");
	Док.Open("C:\1C\PDF\formp1.pdf");
	Сообщить("Страниц: "+Док.GetNumPages());
	ВремДок = Док.OpenAVDoc("C:\1C\PDF\tm.pdf");
	Формы=СоздатьОбъект("AFormAut.App");
	Сообщить("Полей: "+Формы.Fields.Count);
	Формы.Fields.Item("Аппарат").Value="Проверка заполнения поля Аппарат";
...Показать Скрыть

Отрабатывает без ошибок, но форма C:\1C\PDF\formp1.pdf остается незаполненной, а "C:\1C\PDF\tm.pdf" нет, что вроде бы не удивительно - явно не хватает сохранения сделанных изменений, в вашем коде сохранения я тоже не заметил - оно точно работает в выложенном вами виде? (имею в виду посл версию 2017г)
14. Сергей Лазарев (sly2k) 09.08.17 15:37 Сейчас в теме
(13)
По факту вот такой код оказался рабочим, т.е. из OpenAVDoc имя файла я вообще убрал - по описанию метода на адоб сайте там титул, а не путь к файлу.

Док=СоздатьОбъект("AcroExch.PDDoc");
	Док.Open("C:\1C\PDF\formp1.pdf");
	Сообщить("Страниц: "+Док.GetNumPages());
	ВремДок = Док.OpenAVDoc("");
	Формы=СоздатьОбъект("AFormAut.App");
	Сообщить("Полей: "+Формы.Fields.Count);
	Сообщить(Формы.Fields.Item("Аппарат").Value);
	Формы.Fields.Item("Аппарат").Value="Проверка заполнения поля Аппарат";
	Док.Save(0,"C:\1C\PDF\formp1.pdf");
...Показать Скрыть
15. vals (vals) 15 10.08.17 12:26 Сейчас в теме
(14) Отличный результат! Я под 7.7 не заморачивался.

Также не было задачи сохранять заполненный ПДФ, кадровик просто его печатает и закрывает.

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

Я эту форму делал всего день, скачал API reference, да и сделал по-быстрому, чтобы кадровиков освободить от вала ручной работы.

Если доведете до законченной разработки, я буду только рад. Времени, если честно, нет для причесывания.
16. Сергей Лазарев (sly2k) 10.08.17 19:32 Сейчас в теме
Да в принципе я довел (код выше рабочий) - на выходе заполненная и сохраненная форма по указанному пути (пдф при этом закрывается корректно - пользователь даже не замечает что он открывается), а делее заполненную форму я отсылаю автоматом на почту - это уже отдельная история, также как что за форма у меня и чем я ее заполняю.
Оставьте свое сообщение