Как реализовать распознавание текста и автоматическую загрузку данных из сканов и PDF в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

Проблема ручного ввода данных из бумажных сканов или PDF-файлов, присылаемых поставщиками, остается актуальной для многих компаний. Несмотря на развитие ЭДО, значительная часть документов (счета на оплату, ТОРГ-12, специфические формы спецификаций) по-прежнему поступает в виде изображений или неструктурированных файлов. Рассмотрим, как разработать гибкое решение для автоматизации этой задачи, разберем технические нюансы работы с OCR-движками и методы извлечения данных в 1С.

Архитектура решения: почему обычного распознавания текста недостаточно

Разберем типичную ситуацию: у нас есть скан документа. Просто получить из него набор слов (текстовый слой) через бесплатные библиотеки часто бывает недостаточно для корректной загрузки в 1С. Основная сложность заключается в сохранении структуры документа. Для автоматизации загрузки в табличную часть (ТЧ) нам нужно понимать, где заканчивается колонка "Наименование" и начинается "Цена".

Проанализируем разницу между подходами:

  1. Простое извлечение текста (OCR как текст): Инструмент выдает «кашу» из слов. Программисту приходится использовать сложные алгоритмы регулярных выражений, чтобы восстановить данные. Это работает для простых документов, но ломается на многострочных наименованиях.
  2. Распознавание структуры (OCR как документ): Продвинутые движки (например, ABBYY FineReader) позволяют не просто распознать символы, но и определить границы таблиц, ячеек и шапок. Это критически важно для гибкой настройки загрузки.

Использование встроенных механизмов 1С для текстовых PDF

Прежде чем подключать тяжелые внешние библиотеки распознавания (OCR), выясним, является ли ваш файл "картинкой" или "текстовым PDF". Если текст в PDF можно выделить мышкой, нам не нужен FineReader. Мы можем воспользоваться встроенным объектом платформы ИзвлечениеТекста.

Рассмотрим пример кода для извлечения текста из файла:


// Создаем объект для извлечения текста
Попытка
    Экстрактор = Новый ИзвлечениеТекста(ПутьКФайлу);
    ТекстДокумента = Экстрактор.ПолучитьТекст();
    Сообщить(ТекстДокумента);
Исключение
    Сообщить("Не удалось извлечь текст: " + ОписаниеОшибки());
КонецПопытки;

Важное ограничение: Метод ИзвлечениеТекста работает преимущественно в среде Windows и требует установленных iFilter (для PDF — например, от Adobe или Foxit). Кроме того, он не сохраняет визуальное расположение колонок, превращая таблицу в последовательный текст. Если вам нужно сохранить структуру, лучше использовать специализированные библиотеки или конвертацию в HTML через внешние компоненты.

Интеграция с ABBYY FineReader для сложных сканов

Для работы с изображениями и сканами высокого качества часто применяется связка 1С и ABBYY FineReader. Проанализируем алгоритм работы такого расширения:

  1. Передача файла во внешнее приложение (или использование SDK/Cloud API).
  2. Распознавание с сохранением в промежуточный формат, поддерживающий структуру (например, HTM или XLSX).
  3. Парсинг полученного файла в 1С с использованием гибких настроек (маппинг колонок).

Использование формата HTML в качестве промежуточного позволяет программно обходить дерево DOM и точно определять значения в конкретных ячейках таблицы. Это решает проблему "слипшихся" строк, характерную для чистого текстового распознавания.

Проблема сопоставления номенклатуры и "нечеткий поиск"

Даже если мы идеально распознали текст "Шина зимняя R16", в нашей базе 1С этот товар может называться "Покрышка R16 зима". Выясним, как решать задачу идентификации объектов:

1. Использование артикулов поставщика. Самый надежный метод. Рекомендуется создать в справочнике Номенклатура дополнительный регистр сведений или табличную часть "Номенклатура контрагентов", где будут храниться соответствия ваших кодов и кодов поставщика.

2. Алгоритмы нечеткого сравнения (Расстояние Левенштейна). Рассмотрим ситуацию, когда артикула нет. Нам нужно найти наиболее похожее наименование. Для этого в 1С можно реализовать функцию сравнения строк, которая вычисляет количество правок, необходимых для превращения одной строки в другую.

Пример логики для поиска соответствий:


// Пример упрощенного алгоритма сопоставления
Функция НайтиСхожесть(Строка1, Строка2)
    // Здесь может быть вызов внешней компоненты или алгоритм Левенштейна на языке 1С
    // Возвращает процент совпадения от 0 до 100
    // ...
КонецФункции

// Логика подбора
Если ПроцентСхожести > 85 Тогда
    // Автоматическая подстановка
ИначеЕсли ПроцентСхожести > 50 Тогда
    // Предложить пользователю для выбора (желтая зона)
КонецЕсли;

Современные альтернативы и облачные технологии

Проанализируем, какие инструменты появились в последние годы и могут заменить классический FineReader:

Практические советы по разработке загрузчика

Рассмотрим пошагово, как сделать загрузку данных гибкой, чтобы она не "ломалась" при изменении формы документа поставщиком:

  1. Реализуйте шаблоны распознавания. Не привязывайтесь к номерам колонок (например, "Цена всегда в 5-й колонке"). Ищите ключевые слова в шапке (например, "Цена", "Стоимость", "Price") и определяйте индекс колонки динамически.
  2. Обрабатывайте многостраничные документы. При распознавании таблица может разрываться переносом страницы. Ваш алгоритм должен уметь "склеивать" строки, если в новой строке заполнено только наименование, а цена и количество пустые (признак переноса длинного названия).
  3. Используйте "Ключ структуры". Создайте в настройках расширения таблицу, где для каждого контрагента можно задать правила: какой текст считать началом таблицы, а какой — концом (например, итоги).

Резюмируем: Создание полноценного коммерческого продукта для распознавания требует не только качественного OCR-движка, но и мощного интеллектуального алгоритма сопоставления номенклатуры (Data Mining). В современных реалиях наиболее перспективным выглядит использование облачных API (Yandex/1C), так как они обеспечивают высокую точность без привязки к локальным мощностям сервера и лицензиям стороннего ПО.

← На главную