В данной статье описан пример реализации загрузки данных накладных из 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 = СокрЛП( ПутьК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 = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры