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

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

Перейти к публикации

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

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

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


А вся "мудреность" относится к форматированию номера телефона и трансформации некоторых значений из запроса в значок "Х" по требованиям заполнения перед циклом заполнения.
AsKorysti; +1 Ответить
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г)
AsKorysti; +1 Ответить
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");
Показать
AsKorysti; +1 Ответить
15. vals 18 10.08.17 12:26 Сейчас в теме
(14) Отличный результат! Я под 7.7 не заморачивался.

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

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

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

Если доведете до законченной разработки, я буду только рад. Времени, если честно, нет для причесывания.
16. sly2k 10.08.17 19:32 Сейчас в теме
Да в принципе я довел (код выше рабочий) - на выходе заполненная и сохраненная форма по указанному пути (пдф при этом закрывается корректно - пользователь даже не замечает что он открывается), а делее заполненную форму я отсылаю автоматом на почту - это уже отдельная история, также как что за форма у меня и чем я ее заполняю.
17. echonok 15 05.02.19 17:16 Сейчас в теме
doc = Новый COMОбъект("AcroExch.PDDoc");

Проблема в этой строке, на новых версиях Adobe Reader DC этот метод уже не работает. Не решали эту проблему?
Вы на какой версии Adobe Reader проверяли?
18. vals 18 05.02.19 21:08 Сейчас в теме
Не проверял. На новых версиях чего?
Насколько помню, Adobe X
19. vals 18 05.02.19 21:09 Сейчас в теме
Reader не катит, нужна про либо стандарт.
20. visusby 5 16.10.20 09:21 Сейчас в теме
Можно добавить свою таблицу в PDF файл?
21. vals 18 16.10.20 13:18 Сейчас в теме
(20) В смысле средствами 1с? Теоретически можно, но практически это означает, что надо работать с внутренним форматом PDF. Боюсь, это невозможно из практических соображений.

Данная обработка лишь показывает способ как обеспечить доступ к слою полей документа PDF и ничего другого.

Добавьте таблицу в документ PDF редактором, разместите в ячейках поля и заполняйте их.
22. visusby 5 16.10.20 15:00 Сейчас в теме
(21)
Да, именно средствами 1с. "Добавить таблицу в документ PDF и затем ее заполнять" - не подходит, т.к. таблица будет иметь не постоянное количество строк. Предполагается выводить в PDF документ табличную часть документа.
23. vals 18 16.10.20 19:05 Сейчас в теме
(22) Я уже ответил, что в таком случае не подойдет.

Как вариант: выводите в ворд, а затем конвертором в командной строке получаете искомый пдф. Это 1с умеет делать хорошо.
Оставьте свое сообщение
Вопросы с вознаграждением