К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как вывести файл PDF в табличный документ 1С

Как вывести данные из PDF-файла в табличный документ 1С: чтение через внешние компоненты, конвертация, построчный разбор текста и готовые примеры кода.

Задача вывести содержимое PDF-файла в табличный документ 1С возникает при загрузке счетов, накладных, выписок и прайсов от контрагентов, которые присылают документы только в формате PDF. Встроенного объекта «чтение PDF» в платформе 1С нет: объект ТабличныйДокумент умеет сохранять данные в PDF, но не читать их обратно. Поэтому перенос данных из PDF в табличный документ всегда строится через промежуточный шаг — извлечение текста или таблиц внешними средствами.

Выбор способа зависит от структуры исходного файла. PDF бывает текстовым (текст можно выделить и скопировать) и сканированным (по сути картинка, требующая распознавания). Текстовый PDF разбирается программно относительно надёжно, сканированный — только через OCR, и качество результата заранее не гарантировано. Перед началом работы откройте файл и попробуйте выделить фрагмент текста: если выделение работает, задача решаема штатными средствами разбора.

Ниже разобраны рабочие подходы: чтение текста через внешние утилиты и компоненты, разбор извлечённых данных и построчное заполнение табличного документа, а также проверка результата и типичные ошибки.

Почему 1С не читает PDF напрямую и что с этим делать

Объект ТабличныйДокумент в 1С предназначен для вывода печатных форм и отчётов. Он поддерживает сохранение в форматы MXL, XLS, HTML, PDF и другие через метод Записать(), но обратное чтение возможно только из форматов MXL и, с ограничениями, из электронных таблиц через Прочитать(). PDF в список читаемых форматов не входит — это формат конечного представления, а не обмена данными.

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

Практическое следствие: не пытайтесь открыть PDF через ТабличныйДокумент.Прочитать() или ЧтениеXML — эти попытки завершатся ошибкой или пустым результатом. Начинайте с выбора инструмента извлечения.

Шаг 1. Определите тип PDF и извлеките текст внешней утилитой

Самый надёжный бесплатный инструмент для текстовых PDF — утилита pdftotext из пакета Poppler (доступна для Windows и Linux). Она запускается из командной строки, что позволяет вызывать её прямо из 1С через ЗапуститьПриложение() или КомандаСистемы().

Ключ -layout сохраняет примерное расположение колонок пробелами, что критично для табличных документов вроде накладных: колонки «Количество», «Цена», «Сумма» остаются на своих позициях, и их можно вырезать по фиксированным смещениям или разбивать по группам пробелов.

bsl
Процедура ИзвлечьТекстИзPDF(ПутьКPDF, ПутьКТексту)
    СтрокаКоманды = """C:\tools\poppler\pdftotext.exe"" -layout """" + ПутьКPDF + """ """" + ПутьКТексту + """"";
    КодВозврата = Неопределено;
    ЗапуститьПриложение(СтрокаКоманды, , Истина, КодВозврата);
    Если КодВозврата <> 0 Тогда
        ВызватьИсключение "pdftotext завершился с ошибкой, код " + КодВозврата;
    КонецЕсли;
КонецПроцедуры

Если файл оказался сканом, pdftotext вернёт пустой или почти пустой текст. Это диагностический признак: дальше нужен OCR (например, Tesseract с русским языковым пакетом), и точность распознавания чисел в колонках придётся проверять вручную по контрольным суммам.

Шаг 2. Разберите извлечённый текст построчно

После извлечения текст читается штатным ЧтениеТекста и разбирается в цикле. Логика разбора всегда привязана к структуре конкретного документа: ищется строка-заголовок табличной части, затем читаются строки данных до признака конца таблицы (строка «Итого», «Всего» или пустая строка).

Для разделения колонок удобно использовать регулярные выражения через объект VBScript.RegExp (на Windows) либо разбивку по двум и более пробелам, если использовался ключ -layout. Числа из PDF часто содержат неразрывные пробелы и запятые как разделитель дробной части — перед преобразованием в тип Число очищайте их функцией СтрЗаменить().

bsl
Функция РазобратьСтрокуТаблицы(Строка)
    // Колонки разделены двумя и более пробелами (pdftotext -layout)
    Пока СтрНайти(Строка, "  ") = 0 И СтрДлина(Строка) > 0 Цикл
        Прервать;
    КонецЦикла;
    Части = СтрРазделить(СокрЛП(Строка), "  ", Ложь);
    Результат = Новый Массив;
    Для Каждого Часть Из Части Цикл
        Результат.Добавить(СокрЛП(Часть));
    КонецЦикла;
    Возврат Результат;
КонецФункции

Учтите, что СтрРазделить с разделителем из двух пробелов не сработает, если между колонками три и более пробелов — такие фрагменты дадут пустые элементы, которые отсекаются параметром Ложь. Надёжнее предварительно нормализовать строку: заменить все последовательности пробелов на один маркер-разделитель и разбивать уже по нему.

Шаг 3. Заполните табличный документ

Когда данные разобраны в массивы или таблицу значений, заполнение табличного документа — рутинная операция. Есть два подхода: через макет с областями (правильный способ для регулярной загрузки документов одного вида) и прямым выводом в ячейки (быстрый вариант для разовой обработки).

При работе через макет создайте макет табличного документа с областями «Шапка», «Строка», «Подвал», задайте в них параметры и выводите области последовательно. При прямом выводе используйте ТабДок.Область(\"R\" + НомерСтроки + \"C\" + НомерКолонки).Текст = Значение — это медленнее на больших объёмах, но не требует макета.

bsl
Процедура ВывестиВТабличныйДокумент(ТаблицаДанных) Экспорт
    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("МакетЗагрузкиPDF");
    ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
        ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);
        ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;
    ТабДок.Показать("Данные из PDF");
КонецПроцедуры

Для числовых колонок задавайте в макете формат ячейки и тип «Число», иначе итоговые функции и группировки в дальнейшем будут работать с текстом. Проверить тип проще всего, попробовав сложить две ячейки программно: если результат конкатенация строк — тип задан неверно.

Альтернативные способы извлечения данных из PDF

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

Сравнение вариантов

pdftotext (Poppler)

Быстро, бесплатно, вызывается из 1С. Не работает со сканами, требует установки утилиты на сервере или клиенте.

COM-объекты и внешние компоненты

Чтение без запуска внешних процессов. Привязка к Windows, нужна регистрация компоненты, зависимость от сторонней разработки.

Конвертация PDF в Excel сторонним сервисом

Таблицы распознаются лучше всего, дальше файл читается через ТабличныйДокумент.Прочитать(). Нельзя отправлять конфиденциальные документы во внешние сервисы.

OCR (Tesseract и аналоги)

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

Отдельно упомянем маршрут через Excel: многие PDF-редакторы и онлайн-конвертеры превращают табличный PDF в XLSX с сохранением сетки. Далее файл открывается в 1С через ТабличныйДокумент.Прочитать() — и вы получаете готовый табличный документ без ручного разбора. Это самый быстрый путь для разовых загрузок, но для конфиденциальных документов используйте только локальные конвертеры.

Проверка результата и типичные ошибки

После заполнения табличного документа результат нужно верифицировать до записи данных в учётные регистры. Минимальный набор проверок: совпадение количества строк с исходным документом, совпадение итоговой суммы с суммой в PDF, отсутствие пустых значений в обязательных колонках.

Контрольные точки

Как проверить результат

Количество строк табличной части
Норма

Совпадает с числом позиций в PDF

Тревожный признак

Строк меньше — часть данных потерялась при разборе

Итоговая сумма
Норма

Сумма колонки равна итогу, указанному в PDF

Тревожный признак

Расхождение — ошибка распознавания чисел или разделителей

Числовые ячейки
Норма

Значения имеют тип Число, участвуют в расчётах

Тревожный признак

Числа выглядят как текст, итоги не считаются

Наименования номенклатуры
Норма

Читаемый текст без обрывов

Тревожный признак

Строки склеены или разорваны посередине названия

Типичные ошибки
01
Разбор сканированного PDF как текстового — на выходе пустой текст и потерянное время; сначала проверяйте выделяемость текста.
02
Преобразование чисел без очистки неразрывных пробелов — Число() возвращает 0 или вызывает ошибку.
03
Разбивка колонок по одиночному пробелу — названия с пробелами разваливаются на лишние колонки; используйте -layout и группы пробелов.
04
Загрузка в учёт без сверки итогов — искажённые суммы попадают в проводки и обнаруживаются только при сверке с контрагентом.
05
Запуск внешней утилиты без проверки кода возврата — при сбое обработка молча работает с пустым файлом.

Ограничения и когда задачу лучше решать иначе

Программный разбор PDF оправдан, когда документы однотипные и приходят регулярно: один раз написанный разбор окупается. Для разовых загрузок разнородных файлов дешевле ручная конвертация в Excel с последующей типовой загрузкой из табличного документа.

Принципиальные ограничения: PDF со сложной вёрсткой (многоуровневые шапки, объединённые ячейки, повёрнутый текст) разбирается нестабильно даже с -layout; защищённые паролем файлы требуют снятия защиты; сканы низкого качества дают ошибки OCR в цифрах. В этих случаях правильнее запросить у контрагента документ в машиночитаемом формате — XML, CSV или Excel, а PDF оставить как визуальное приложение.

Маршрут решения

Как выбрать действие

Текст в PDF выделяется, документы однотипные и регулярныеПишите разбор через pdftotext -layout и построчное заполнение табличного документа
PDF — скан без текстового слояПрименяйте OCR и обязательную сверку сумм, либо запросите у контрагента исходник в Excel/XML
Загрузка разовая и структура файлов разнаяКонвертируйте локально в Excel и читайте через ТабличныйДокумент.Прочитать()
Файл содержит конфиденциальные данныеИспользуйте только локальные инструменты, исключите онлайн-конвертеры
Итог

Что важно запомнить

1С не читает PDF напрямую: текст извлекается внешней утилитой (pdftotext -layout), разбирается построчно и выводится в табличный документ через макет. Сканы требуют OCR. Перед загрузкой в учёт всегда сверяйте количество строк и итоговую сумму с оригиналом.

Частые вопросы

Можно ли открыть PDF методом ТабличныйДокумент.Прочитать()?

Нет. Метод читает только форматы MXL и электронные таблицы (XLS, XLSX, ODS). PDF — формат конечного представления, и платформа не умеет извлекать из него данные. Сначала конвертируйте файл в Excel или текст, затем читайте результат.

Что делать, если pdftotext возвращает пустой файл?

Почти наверняка PDF является сканом без текстового слоя. Проверьте, выделяется ли текст в просмотрщике. Если нет — нужен OCR (например, Tesseract), после распознавания текст разбирается тем же способом, но числа обязательно сверяются с оригиналом.

Как разобрать таблицу, если названия товаров содержат пробелы?

Запускайте pdftotext с ключом -layout: колонки будут разделены группами из нескольких пробелов. Разбивайте строку по двум и более пробелам, а не по одиночному — тогда пробелы внутри названия не разорвут колонку. Альтернатива — регулярные выражения с якорями на числовые колонки справа.

Почему после загрузки итоговая сумма не сходится с PDF?

Типичные причины: неразрывные пробелы внутри чисел, запятая вместо точки как разделитель дробной части, потерянные строки при разборе. Очищайте строки функцией СтрЗаменить() перед преобразованием в число и проверяйте количество обработанных строк.

Можно ли выполнять извлечение на сервере 1С?

Да, если утилита установлена на сервере и учётной записи агента сервера 1С разрешён запуск внешних приложений. В файловом режиме запуск выполняется на клиенте. Учитывайте, что в некоторых конфигурациях и режимах безопасности запуск внешних программ заблокирован настройками защиты.

Что лучше запросить у контрагента вместо PDF?

Оптимальны XML по согласованному формату, CSV или Excel — они читаются штатными средствами 1С без потерь. PDF стоит просить как дополнительное визуальное приложение для сверки, а не как источник данных.