helpf.pro
Регистрация
 +5 
Распечатать

Загрузка данных в 1С из PDF

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

И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.

Чтение PDF файлов из 1С

Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой ) В результате банальный текст вида Красный стул превращался в страшную кракозябру.

Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt

Поддержка командной строки:

PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]

<input PDF file> : Open an existing PDF file to convert.

[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.

[-first <page number>]: Specify the first page number.

[-last <page number>]: Specify the last page number.

[-logfile] : Write log to "C:\pdf2txt.log" file.

[-open] : Auto open the text file after it be created.

[-space] : Auto insert spaces into text file.

[-html] : Output to a HTML file, not a text file.

[-format] : Keep the page layout in the generated TXT file.

[-silent] : Disable error and warning messages.

[-blankline] : Auto delete blank line in the generated TXT file.

[-summary] : Get PDF document summary.

[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.

[-unicode] : Create UTF-8 encoding text file.

Примеры:

Код Batch File (DOS, CMD, BAT)
 C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt   

В архиве (Скачать Вы можете из статьи по ссылке) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо )

Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С!


Код на 1С для конфигурации УТ 10.3:

Код 1C v 8.х
 Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
	МассивСтрок = Новый Массив();
	Если Разделитель = " " Тогда
		Стр = СокрЛП(Стр);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Стр,Поз-1));
			Стр = СокрЛ(Сред(Стр,Поз));
		КонецЦикла;
	Иначе
		ДлинаРазделителя = СтрДлина(Разделитель);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			ТекЗнч = СокрЛП(Лев(Стр,Поз-1));
			Если ЗначениеЗаполнено(ТекЗнч) Тогда
				МассивСтрок.Добавить(ТекЗнч);
			КонецЕсли;
			Стр = Сред(Стр,Поз+ДлинаРазделителя);
		КонецЦикла;
	КонецЕсли;	
КонецФункции 




Процедура КнопкаВыполнитьНажатие(Кнопка)
	//Ищем Файлы
	тч.Очистить();
	НайденныеФайлы = НайтиФайлы(ПутьКPDF,"*.pdf",ложь);
	Для каждого стр Из НайденныеФайлы Цикл
		Нстр = ТЧ.Добавить();
		Нстр.ФайлPDF = стр.Имя;
	КонецЦикла;
	ЭтаФорма.Обновить();
	//Преобразуем PDF в TXT
	Для каждого стр Из ТЧ Цикл
		Попытка
			pdf = СокрЛП(ПутьКPDF+"\"+стр.ФайлPDF);
			txt = СтрЗаменить(pdf,"pdf","txt");
			Команд = ПутьКPDF2TXT+"\pdf2txt.exe "+pdf+" "+txt; 
			ЗапуститьПриложение(Команд,ПутьКPDF,Истина);	         
			стр.ФайлTXT = txt;
		Исключение
			стр.ФайлTXT = "!!!_ОШИБКА";
		КонецПопытки;
		ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
		ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
	КонецЦикла;	
	
	мТекущийПользователь = глЗначениеПеременной("глТекущийПользователь");
	мСкладПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойСклад");
	мОсновноеПодразделение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеПодразделение");
	мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов");
	мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам");
	мВидНоменклатурыПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойВидНоменклатуры");
	
	мОтражатьВРеглУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете");
	мОтражатьВБухУчета = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете");
	мОтражатьВНалУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете");

	//Создаем Документ
	Для каждого стр Из ТЧ Цикл
		Состояние("Загружаю: "+стр.ФайлTXT);
		текдок=Новый ТекстовыйДокумент;
		текдок.Прочитать(стр.ФайлTXT,"UTF-8");
		ЗагрузкаТЧ=Ложь;
		
		ДокВозвратТоваровОтПокупателя = Документы.ВозвратТоваровОтПокупателя.СоздатьДокумент();	
		ДокВозвратТоваровОтПокупателя.Ответственный = мТекущийПользователь;   	
		ДокВозвратТоваровОтПокупателя.Дата  = ОбщегоНазначения.ПолучитьРабочуюДату();
		ДокВозвратТоваровОтПокупателя.УстановитьНовыйНомер();
		
		ДокВозвратТоваровОтПокупателя.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;
		ДокВозвратТоваровОтПокупателя.СкладОрдер = Склад;
		ДокВозвратТоваровОтПокупателя.Подразделение = мОсновноеПодразделение;
		ДокВозвратТоваровОтПокупателя.ВалютаДокумента  = Справочники.Валюты.НайтиПоКоду("643");
		ДокВозвратТоваровОтПокупателя.УчитыватьНДС     = ИСТИНА;
		ДокВозвратТоваровОтПокупателя.СуммаВключаетНДС = ИСТИНА;

		Для Ном=1 по текдок.КоличествоСтрок() цикл
			ТСтр = текдок.ПолучитьСтроку(Ном);
			ТекСтр = СокрЛП(ТСтр);
			
			Если Найти(ТекСтр, "Всего по накладной")>0 Тогда
				ЗагрузкаТЧ=Ложь;
				
				//делаем пересчеты сумм, количества мест и НДС по строкам
				Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя.Товары Цикл
					ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
					ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
					ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
				КонецЦикла;
				Попытка  
					ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Проведение); 
				Исключение
					ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Запись);  
				КонецПопытки;
				стр.Документ = ДокВозвратТоваровОтПокупателя.Ссылка;
				стр.Инфо = "Все ОК";
				ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
				ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
				
				//ВСЕ
				Прервать;
			КонецЕсли;	
				
			Если ЗагрузкаТЧ  Тогда
				ТекСтр = СтрЗаменить(ТекСтр, "подложке  ","подложке");
				ТекСтр = СтрЗаменить(ТекСтр, "   ","|");
				
				СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
				Если СтрМ.Количество()>2 Тогда
					//Сообщить(СтрМ);
					Попытка
						НоваяСтрока                            = ДокВозвратТоваровОтПокупателя.Товары.Добавить();
						НоваяСтрока.Номенклатура               = Справочники.Номенклатура.НайтиПоКоду(СтрМ[2]);
						//НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицы.ХарактеристикаНоменклатуры;		
						//УстановитьСтавкуНДСВТабЧасти(НоваяСтрока, СтрокаТаблицы);
						//ПроверитьНаличиеСерииНоменклатуры(НоваяСтрока, СтрокаТаблицы);
						//УстановитьПризнакВеденияПоСериямНоменклатуры(НоваяСтрока); 		
						НоваяСтрока.ЕдиницаИзмерения           = НоваяСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
						НоваяСтрока.Коэффициент                = 1;
						НоваяСтрока.Количество                 = Число(СтрМ[6]);
						НоваяСтрока.Цена                       = Число(СтрМ[7]);
						НоваяСтрока.Сумма         = Число(СтрМ[8]);
						НоваяСтрока.СуммаНДС     = Число(СтрМ[11]);
						НоваяСтрока.Качество = Справочники.Качество.Новый;
						Попытка
							НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС["НДС"+Лев(СокрЛП(СтрМ[9]),2)];
						Исключение
							НоваяСтрока.СтавкаНДС = НоваяСтрока.Номенклатура.СтавкаНДС;
						КонецПопытки;
					Исключение
						Сообщить("Не загружено: "+ТекСтр);
					КонецПопытки;
				Иначе
					Продолжить;
				КонецЕсли;				
			Иначе
				// Возможно что-то будет			
			КонецЕсли;
			//Сообщить(ТекСтр);
			Если Найти(ТекСтр, "Товарная накладная")>0 Тогда
				ТекСтр = СтрЗаменить(ТекСтр, "   ","|");
				СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
				Если СтрМ.Количество()>1 Тогда
					//Сообщить(СтрМ);
					ДокВозвратТоваровОтПокупателя.НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1];
					ТекДата = СтрМ[2];
					ДокВозвратТоваровОтПокупателя.ДатаВходящегоДокументаЭлектронногоОбмена = Дата(Прав(ТекДата,4)+Сред(ТекДата,4,2)+Лев(ТекДата,2));
				КонецЕсли;			
			КонецЕсли;
			
			Если Найти(ТекСтр, "Грузополучатель:")>0 Тогда
				//Сообщить(ТекСтр);
				//Получим ИНН
				ГдеИНН = Найти(ТекСтр, "ИНН");
				Если ГдеИНН>0 Тогда
					ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
					текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
					текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));  
					ТекОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН",текИНН);
					Если ТекОрганизация=Справочники.Организации.ПустаяСсылка() Тогда
						ДокВозвратТоваровОтПокупателя.Организация = Организация;	
					Иначе
						ДокВозвратТоваровОтПокупателя.Организация = ТекОрганизация;			
					КонецЕсли;
					
				КонецЕсли;	
			КонецЕсли;
			
			Если Найти(ТекСтр, "Поставщик:")>0 Тогда
				//Сообщить(ТекСтр);
				//Получим ИНН
				ГдеИНН = Найти(ТекСтр, "ИНН");
				Если ГдеИНН>0 Тогда
					ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
					текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
					текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));  
					ТекПоставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
					ДокВозвратТоваровОтПокупателя.Контрагент = ТекПоставщик;
					ДокВозвратТоваровОтПокупателя.ДоговорКонтрагента = ТекПоставщик.ОсновнойДоговорКонтрагента;
				КонецЕсли;
			КонецЕсли;
			
			Если Найти(ТекСтр, "Плательщик:")>0 Тогда
				//Сообщить(ТекСтр);
				//Получим ИНН
				ГдеИНН = Найти(ТекСтр, "ИНН");
				Если ГдеИНН>0 Тогда
					ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
					текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
					текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));  
					ТекПлательщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
				КонецЕсли;
			КонецЕсли;
			
			Если текстр="1                                   2                                       3            4        5      6       7            8             9      10               11                      12                  13               14                            15" Тогда
				ЗагрузкаТЧ=Истина;				
			КонецЕсли;
		КонецЦикла;	
		
	КонецЦикла;
	
КонецПроцедуры

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

Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Режим = РежимДиалогаВыбораФайла.ВыборКаталога; 
	ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим); 
	ДиалогОткрытия.Каталог = ""; 
	ДиалогОткрытия.МножественныйВыбор = Ложь; 
	ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT"; 
	Если ДиалогОткрытия.Выбрать() Тогда 
		ПутьКPDF = ДиалогОткрытия.Каталог; 
	КонецЕсли; 
КонецПроцедуры   
Разместил:   Версии: | 8.x | 8.2 УП | 8.3 |  Дата:   Прочитано: 60592
 +5 
Распечатать
Возможно, вас также заинтересует
10060 (0x0000274C): Попытка установить соединение была безуспешной 24
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче
Google maps : вывод точек на карту и режим панорамы 9
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!