Автоматизация потокового ввода документов — одна из наиболее востребованных задач в среде 1С. Основная идея заключается в том, чтобы оператор мог положить пачку документов в поточный сканер, а система сама распределила полученные изображения по соответствующим объектам базы данных (например, прикрепила скан реализации к соответствующему документу РеализацияТоваровУслуг). Ключевым звеном в этой цепочке является распознавание идентификатора, зашифрованного в QR-коде или штрихкоде. В этой статье мы подробно разберем несколько подходов к решению этой задачи: от использования бесплатных библиотек до облачных сервисов 1С. Для практической реализации такого сквозного процесса можно использовать решение для штрихкодирования входящих документов и загрузки сканов в 1С.
Это классический путь, который часто выбирают разработчики для реализации бюджетного решения. Суть метода заключается в двухэтапной обработке изображения. Сначала мы подготавливаем картинку, а затем передаем ее специализированному декодеру.
Рассмотрим процесс подробнее:
ImageMagick позволяет через командную строку выполнить бинаризацию изображения (перевод в строгий черно-белый формат), очистку от мелких точек и поворот.Zbar. Она также вызывается через командную строку или COM-объект и возвращает текстовое содержимое найденного QR-кода.Проанализируем пример кода на языке 1С, который управляет этим процессом через запуск внешнего приложения:
КомандаЗапуска = """C:\Program Files\ZBar\bin\zbarimg"" --raw -q """ + ПутьКФайлуКартинки + """";
ЗапуститьПриложение(КомандаЗапуска, , Истина, КодВозврата);
// Результат обычно считывается из текстового файла, куда Zbar перенаправляет вывод
Важный нюанс: для стабильной работы Zbar требуется разрешение сканирования не менее 300 DPI. При меньшем разрешении мелкие модули QR-кода могут сливаться, что сделает распознавание невозможным.
Если мы не хотим заниматься поддержкой стороннего софта на сервере, стоит обратить внимание на нативные решения от фирмы 1С. В последние годы активно развивается сервис 1С:Распознавание первичных документов.
Выясним преимущества этого подхода:
Для использования этого метода в коде вызываются методы специализированных библиотек стандартных подсистем (БСП). Основной объект для работы — Обработка.РаспознаваниеДокументов.
Как показывает практика обсуждений на форумах, иногда использование QR-кода является избыточным. Если ваша задача — просто закодировать уникальный идентификатор документа (например, его внутренний номер), можно использовать стандартный штрихкод EAN-13.
Проанализируем, почему это может быть удобнее:
КомпонентаРаспознаванияШтрихкодов, которая «из коробки» отлично справляется именно с форматом EAN-13.EAN-13 проще через стандартные шрифты или встроенные средства печати штрихкодов.Для продвинутых разработчиков оптимальным вариантом будет создание или использование готовой внешней компоненты на технологии Native API, использующей библиотеку ZXing.Net (Zebra Crossing). Это позволяет избежать «мигающих окон» командной строки и работать с изображением напрямую в памяти. Для готовой реализации считывания штрихкодов и QR-кодов из графических файлов и PDF можно использовать инструмент для чтения штрихкодов и QR-кодов из PDF и изображений.
Разберем алгоритм работы с такой компонентой:
УстановитьВнешнююКомпоненту или ПодключитьВнешнююКомпоненту.Пример вызова в коде:
Попытка
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаРаспознаванияQR", "QRScan", ТипВнешнейКомпоненты.Native);
Сканер = Новый("AddIn.QRScan.BarcodeReader");
Результат = Сканер.Распознать(ДвоичныеДанныеФайла);
Исключение
Сообщить("Не удалось подключить компоненту распознавания");
КонецПопытки;
При потоковом сканировании возникает вопрос: как понять, где заканчивается один документ и начинается другой? Рассмотрим стандартную логику решения этой проблемы:
Посмотрим на пример логики обработки очереди изображений:
ТекущийДокументСсылка = Неопределено;
Для Каждого ФайлКартинки Из СписокФайлов Цикл
СодержимоеКода = РаспознатьКод(ФайлКартинки);
Если ЗначениеЗаполнено(СодержимоеКода) Тогда
// Нашли новый QR - ищем документ в базе
ТекущийДокументСсылка = ПоискДокументаПоДаннымКода(СодержимоеКода);
КонецЕсли;
Если ТекущийДокументСсылка <> Неопределено Тогда
ПрикрепитьФайлКДокументу(ФайлКартинки, ТекущийДокументСсылка);
КонецЕсли;
КонецЦикла;
Выясним, какие факторы критически влияют на успех автоматизации:
Подводя итог, можно сказать, что выбор решения зависит от бюджета и масштаба задачи. Для простых внутренних нужд связки Zbar + ImageMagick будет достаточно. Для серьезных корпоративных систем лучше использовать специализированные внешние компоненты или официальный сервис распознавания от 1С.