Распознавание реквизитов контрагента из файлов сканов карточки компании или счета при помощи ИИ: внешняя обработка

11.09.26

Интеграция - Распознавание документов и образов

В современных условиях бухгалтеры и операторы регулярно сталкиваются с задачей ввода реквизитов новых контрагентов в информационную базу. Эта операция, на первый взгляд простая, на практике отнимает значительное время — необходимо вручную переносить данные из карточки организации, скана учредительного документа, счета-фактуры или договора. При этом ошибки при ручном вводе — явление распространенное, а каждая ошибка в ИНН, КПП или банковских реквизитах может привести к серьезным последствиям: от отказа в приеме платежа до проблем с налоговой отчетностью.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Распознавание реквизитов контрагента из файлов сканов карточки компании или счета при помощи ИИ: внешняя обработка:
.epf 24,73Kb ver:1.0.1
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

В данной статье я хочу поделиться опытом разработки внешней обработки, которая автоматизирует этот процесс с помощью технологий искусственного интеллекта. Обработка принимает на вход файл (изображение, скан или PDF) с реквизитами организации, отправляет его в сервис распознавания ИИ Сканер документов, получает структурированные данные и на их основе создает или обновляет элемент справочника «Контрагенты» с банковским счётом.

Ключевая особенность решения — оно спроектировано как внешняя обработка с полной интеграцией в типовые конфигурации на базе «1С:Библиотеки стандартных подсистем» (БСП) версии 3.1 и выше. Это означает, что обработку можно подключить к «1С:Бухгалтерии», «1С:ERP», «1С:Управлению торговлей» или любой другой конфигурации на БСП без изменения самой конфигурации и снятия её с поддержки.

Постановка задачи

Исходные требования к обработке формировались исходя из реальных потребностей пользователей:

Входные данные: файл произвольного формата — изображение (JPEG, PNG), скан в PDF или документ с реквизитами организации. Это может быть карточка предприятия, выписка из ЕГРЮЛ, счет на оплату, договор.

Сервис распознавания: HTTP API, который принимает файл в формате multipart/form-data и возвращает JSON-ответ со структурированными полями:

  • наименование организации,
  • ИНН, КПП, ОГРН,
  • юридический адрес,
  • банковские реквизиты (наименование банка, БИК, корреспондентский счёт, расчётный счёт),
  • контактные данные (телефон, email).

Результат работы: создание нового или обновление существующего элемента справочника «Контрагенты» с заполнением всех реквизитов и привязкой банковского счёта.

Среда выполнения: типовая конфигурация на БСП 3.1+, файловый или клиент-серверный вариант, тонкий клиент.

Ограничения: конфигурация находится на поддержке, поэтому вносить изменения в неё нельзя. Решение должно быть полностью автономным и подключаться через механизм дополнительных обработок.

Архитектура решения

Прежде чем переходить к коду, рассмотрим общую архитектуру. Она разделена на два логических слоя: клиентский и серверный.

Клиентский слой реализован в модуле формы обработки и отвечает за взаимодействие с сервисом распознавания. Это принципиальное решение: HTTP-запросы выполняются с клиента, а не с сервера «1С:Предприятия». Причин несколько:

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

В веб-клиенте серверные HTTP-вызовы требуют расширений безопасного режима и разрешений, что усложняет регистрацию обработки.

В клиент-серверном варианте при работе через HTTP-сервис проксирование на сервере «1С» добавляет лишний слой, на котором могут возникать таймауты и блокировки.

Серверный слой реализован в модуле объекта обработки и выполняет все операции с базой данных: поиск существующего контрагента, создание или обновление элемента справочника, запись банковского счёта и контактной информации. Эти операции требуют серверного контекста из-за объектных блокировок и доступа к регистрам сведений.

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

Реализация: HTTP-клиент для запросов к сервису распознавания

Начнем с клиентской части — формирования и отправки multipart-запроса к сервису распознавания. Это наиболее технически насыщенный участок кода.

Платформа «1С:Предприятие» начиная с версии 8.3.5 предоставляет объект HTTPСоединение для работы с HTTP-сервисами. Однако для передачи файлов в формате multipart/form-data необходимо вручную сформировать тело запроса с правильными разделителями — готового метода для этого нет.

Формирование тела запроса

Спецификация multipart/form-data (RFC 7578) определяет структуру тела запроса как последовательность частей, разделенных boundary-меткой. Каждая часть содержит заголовки и данные. Для файла это:

Реализация этой логики в модуле формы обработки:

&НаКлиенте
Функция СобратьТелоMultipart(ДвоичныеДанныеФайла, ИмяФайла, Разделитель)

    ПереводСтроки = Символы.ВК + Символы.ПС;
    Кодировка = КодировкаТекста.UTF8;

    ИмяФайлаБезПути = ИмяФайла;
    ПозицияРазделителя = СтрНайти(ИмяФайла, "\", НаправлениеПоиска.СКонца);
    Если ПозицияРазделителя > 0 Тогда
        ИмяФайлаБезПути = Сред(ИмяФайла, ПозицияРазделителя + 1);
    КонецЕсли;
    ПозицияРазделителя = СтрНайти(ИмяФайлаБезПути, "/", НаправлениеПоиска.СКонца);
    Если ПозицияРазделителя > 0 Тогда
        ИмяФайлаБезПути = Сред(ИмяФайлаБезПути, ПозицияРазделителя + 1);
    КонецЕсли;

    ЧастьЗаголовок = "--" + Разделитель + ПереводСтроки
        + "Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайлаБезПути + """"
        + ПереводСтроки
        + "Content-Type: application/octet-stream" + ПереводСтроки + ПереводСтроки;

    ЧастьРазделитель = "--" + Разделитель + "--" + ПереводСтроки;

    ЧастьЗаголовокДД = ПолучитьДвоичныеДанныеИзСтроки(ЧастьЗаголовок, Кодировка);
    ПереводСтрокиДД = ПолучитьДвоичныеДанныеИзСтроки(ПереводСтроки, Кодировка);
    ЧастьРазделительДД = ПолучитьДвоичныеДанныеИзСтроки(ЧастьРазделитель, Кодировка);

    Части = Новый Массив;
    Части.Добавить(ЧастьЗаголовокДД);
    Части.Добавить(ДвоичныеДанныеФайла);
    Части.Добавить(ПереводСтрокиДД);
    Части.Добавить(ЧастьРазделительДД);

    Возврат СоединитьДвоичныеДанные(Части);

КонецФункции

Обратите внимание на несколько технических деталей. Во-первых, имя файла в HTTP-заголовке не должно содержать путь — только имя с расширением. Поэтому код сначала выделяет имя файла из полного пути, обрабатывая и обратный слэш (для Windows), и прямой (для Linux и macOS). Во-вторых, разделитель (boundary) должен быть уникальным в рамках запроса. Я генерирую его как WmkBoundary плюс уникальный идентификатор — это гарантирует отсутствие коллизий при многократных вызовах.

Отправка запроса

Отправка запроса начинается с разбора адреса сервиса. Адрес может содержать протокол (HTTP или HTTPS), хост и порт. Эту информацию нужно корректно передать в конструктор HTTPСоединение:

Несколько моментов, на которые стоит обратить внимание. Таймаут установлен в 120 секунд — распознавание изображения может занимать значительное время, особенно при обработке многостраничных PDF. Использование ПрочитатьJSON(Чтение, Истина) с параметром ИменаСвойствСоЗначениямиДата = Истина не требуется, так как сервис возвращает строковые данные, но я предпочитаю явное указание параметров для читаемости.

Обработка ошибок разнесена на три уровня: сетевые ошибки (исключение при вызове ВызватьHTTPМетод), HTTP-ошибки (код состояния 300 и выше) и ошибки разбора ответа. Это позволяет пользователю получить понятное сообщение в каждом случае.

Реализация: серверная логика обработки данных

Когда данные распознавания получены, начинается серверная работа. Здесь важно обеспечить несколько вещей: поиск существующего контрагента по ИНН и КПП, корректное заполнение реквизитов с учетом особенностей разных конфигураций, атомарность операций через транзакции и работу с банковскими реквизитами.

Поиск контрагента

Поиск по ИНН и КПП — стандартная задача, но есть нюанс: для индивидуальных предпринимателей и физических лиц КПП может быть пустым. Запрос должен это учитывать:

Функция НайтиКонтрагентаПоИННКПП(ИНН, КПП) Экспорт

    ИНН = СокрЛП(ИНН);
    КПП = СокрЛП(КПП);

    Если НЕ ЗначениеЗаполнено(ИНН) Тогда
        Возврат Неопределено;
    КонецЕсли;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Контрагенты.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    Контрагенты.ИНН = &ИНН
    |    И ВЫБОР
    |            КОГДА &КПП = """"
    |                ТОГДА ИСТИНА
    |            ИНАЧЕ Контрагенты.КПП = &КПП
    |        КОНЕЦ
    |    И НЕ Контрагенты.ПометкаУдаления";
    Запрос.УстановитьПараметр("ИНН", ИНН);
    Запрос.УстановитьПараметр("КПП", КПП);

    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Возврат Неопределено;
    КонецЕсли;

    Выборка = РезультатЗапроса.Выполнить().Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Ссылка;

КонецФункции

Создание контрагента

Создание нового элемента справочника — операция, которая затрагивает несколько связанных сущностей: сам контрагент, его банковский счёт, контактная информация. Все они должны быть записаны атомарно — если на любом этапе произойдет ошибка, все изменения откатываются:

Адаптация к разным конфигурациям

Одна из главных сложностей при разработке для типовых конфигураций — различия в структуре справочника «Контрагенты» между «1С:Бухгалтерией», «1С:ERP» и «1С:Управлением торговлей». Например:

  • В «1С:Бухгалтерии 3.0» полное наименование хранится в реквизите ПолноеНаименование, а в «1С:ERP» и «1С:УТ» — в НаименованиеПолное.
  • Вид контрагента (юридическое лицо, физическое лицо, индивидуальный предприниматель) в разных конфигурациях называется по-разному: ЮридическоеФизическоеЛицо, ВидКонтрагента, ЮрФизЛицо.
  • Банковский счёт может храниться в реквизите КоррСчет или КоррСчетБанка в зависимости от конфигурации.

Чтобы обработка работала корректно во всех типовых конфигурациях, я использую паттерн «безопасной установки реквизита». Суть его в том, что перед записью значения мы проверяем наличие реквизита в метаданных объекта:

Вспомогательная функция ЕстьРеквизит проверяет наличие реквизита как среди обычных, так и среди стандартных реквизитов:

Работа с банковскими реквизитами

Банковские реквизиты — наиболее сложная часть обработки. Сервис распознавания возвращает БИК, наименование банка, корреспондентский счёт и расчётный счёт. Логика работы следующая:

  1. Найти банк в справочнике банков по БИК.
  2. Если банк не найден — создать новый элемент справочника банков.
  3. Найти существующий расчётный счёт у контрагента с указанным номером.
  4. Если счёт найден — обновить банк и корреспондентский счёт.
  5. Если счёт не найден — создать новый.

Для конфигураций на БСП 3.1+ критически важно правильно заполнить поле «Валюта денежных средств» у банковского счёта. Без него счёт может не отображаться в карточке контрагента:

 
ВалютаСчета = ПолучитьВалютуСчета(Данные);
Если ВалютаСчета <> Неопределено Тогда
    УстановитьРеквизитБезопасно(НовыйСчет, "ВалютаДенежныхСредств", ВалютаСчета);
КонецЕсли;

Работа с контактной информацией

Контактная информация в типовых конфигурациях на БСП хранится в регистре сведений «Контактная информация» или в табличной части справочника (в зависимости от версии БСП и конфигурации). В обработке я реализовал три стратегии записи контактной информации с автоматическим выбором доступной:

  1. Через API БСП (УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию) — предпочтительный вариант для современных конфигураций. Однако сигнатура метода менялась между версиями БСП, поэтому я перебираю несколько вариантов вызова в блоке Попытка/Исключение.

  2. Через регистр сведений — для конфигураций, где регистр «КонтактнаяИнформация» существует, но API БСП недоступно.

  3. Через табличную часть справочника — для конфигураций на старых версиях БСП или без неё (например, «1С:Управление торговлей» ранних версий).

Эту логику можно выразить следующей схемой:

После того как логика обработки данных готова, остаётся обеспечить её регистрацию в типовой конфигурации. Подсистема БСП «Дополнительные отчеты и обработки» предоставляет стандартный механизм для этого: каждая внешняя обработка должна содержать экспортную функцию СведенияОВнешнейОбработке(), которая возвращает структуру с описанием обработки, её команд и назначения.

Документация по формату этой функции доступна на ИТС: its.1c.ru/db/bsp321doc#content:994:hdoc. Для нашего сценария регистрация выглядит так:

Вид = «ЗаполнениеОбъекта» означает, что обработка будет доступна в карточках и списках объектов через подменю «Заполнить». Это именно тот сценарий, который нам нужен: пользователь открывает карточку контрагента и вызывает команду из меню «Заполнить».

Назначение ограничивает список объектов, в формах которых будет доступна команда. Указание «Справочник.Контрагенты» означает, что команда появится только в формах этого справочника.

Использование = «ОткрытиеФормы» говорит БСП о том, что команда должна открыть основную форму обработки. Альтернативные варианты — «ВызовКлиентскогоМетода», «ВызовСерверногоМетода», «ЗаполнениеФормы» — предполагают другие сценарии взаимодействия.

БезопасныйРежим = Ложь — осознанное решение. В безопасном режиме обработка не может выполнять HTTP-запросы к внешним сервисам, что делает её бесполезной для нашей задачи. Если в вашей организации требуется безопасный режим, в код обработки нужно добавить функцию РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса("http://адрес-сервиса") — тогда администратор сможет подтвердить разрешение при регистрации обработки.

Приём параметров от БСП в форме

Когда пользователь вызывает команду «Заполнить → Распознать реквизиты из файла» из карточки контрагента, БСП передает в форму обработки массив ссылок на выбранные объекты через параметр формы ОбъектыНазначения. Это позволяет нам сразу подставить контрагента в реквизит формы, чтобы при сохранении данных распознавания обновлять именно его, а не создавать нового:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если НЕ ЗначениеЗаполнено(АдресСервиса) Тогда
        АдресСервиса = "http://localhost:5000";
    КонецЕсли;

    Если Параметры.Свойство("ОбъектыНазначения")
            И ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив")
            И Параметры.ОбъектыНазначения.Количество() > 0 Тогда
        Контрагент = Параметры.ОбъектыНазначения[0];
    КонецЕсли;
КонецПроцедуры

Текущая версия поддерживает работу с программой ИИ Сканер документов, но ее можно адаптировать под любую другую систему. У программы есть возможность работы бесплатно 60 дней, и к тому же она умеет работать с локальными моделями через LM-Studio и Lama.cpp поэтому в качестве теста взяли именно ее.

Вопросы безопасности

При работе с внешними сервисами всегда возникают вопросы безопасности. Рассмотрим основные аспекты.

Передача данных. Файлы с реквизитами организаций содержат персональные данные и коммерческую тайну. При использовании облачного сервиса распознавания убедитесь, что он соответствует требованиям законодательства о персональных данных (152-ФЗ) и имеет серверы на территории РФ. Для крупных организаций может быть оправдано развёртывание сервиса распознавания на собственных мощностях.

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

Защита от ошибок сервиса. Если сервис распознавания недоступен, обработка показывает пользователю понятное сообщение об ошибке, но не выполняет никаких деструктивных действий с базой. Создание контрагента происходит только после успешного распознавания.

Привилегированный режим. В текущей версии обработка не использует привилегированный режим, что соответствует принципу минимальных привилегий. Если в будущем потребуется запись данных в защищённые регистры, привилегированный режим нужно включать точечно — только для конкретных операций, а не для всей обработки.

Безопасный режим. Как уже упоминалось, обработка работает вне безопасного режима из-за необходимости HTTP-обращений. Если ваша организация требует обязательного безопасного режима для внешних обработок, потребуется доработка кода с добавлением разрешений через API РаботаВБезопасномРежиме.

Тестирование и отладка

При разработке обработки я столкнулся с несколькими типичными проблемами, о которых полезно знать.

Проблема: HTTP-сервис на локальной машине разработчика. По умолчанию я устанавливаю адрес сервиса http://localhost:5000, но в клиент-серверном варианте «localhost» относится к серверу «1С:Предприятия», а не к машине пользователя. Для отладки приходится указывать полный адрес или организовывать проксирование.

Проблема: таймаут при распознавании. Большие файлы или многостраничные PDF могут обрабатываться сервисом более минуты. Стандартный таймаут HTTPСоединения (30 секунд) недостаточен. Увеличение таймаута до 120 секунд решает проблему, но в веб-клиенте длительные операции без обратной связи выглядят как зависание. Я добавил вызов Состояние() перед запросом, чтобы показать пользователю, что процесс идёт.

Разработка внешней обработки с интеграцией через БСП — это баланс между универсальностью и простотой. С одной стороны, обработка должна корректно работать в разных типовых конфигурациях с их особенностями структуры справочников и регистров. С другой стороны, код должен оставаться понятным и поддерживаемым.

Паттерн «безопасной установки реквизита» в сочетании с перебором вариантов имён через УстановитьРеквизитБезопасноЛюбоеИз — это, пожалуй, ключевое архитектурное решение, которое позволяет одной обработке работать в «1С:Бухгалтерии», «1С:ERP» и «1С:Управлении торговлей» без отдельных версий кода.

Разделение на клиентский (HTTP) и серверный (работа с базой) слои — второе важное решение. Оно продиктовано практическими ограничениями серверного контекста в типовых конфигурациях и упрощает регистрацию обработки.

В будущем обработку можно расширить в нескольких направлениях: пакетная обработка нескольких контрагентов, распознавание не только реквизитов, но и контактных лиц, интеграция с сервисами проверки контрагентов (ФНС, ФССП), автоматическое заполнение договоров на основе распознанных данных.

Полный исходный код обработки доступен в репозитории на GitHub. Буду рад обратной связи и предложениям по улучшению.

Проверено на следующих конфигурациях и релизах:

  • Бухгалтерия предприятия, редакция 3.0, релизы 3.0.205.22

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Учет документов Распознавание документов и образов Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

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

87108 руб.

23.12.2021    17319    35    25    

15

SALE! 35%

Распознавание документов и образов Периферийные устройства Программист Автомобили, автосервисы Россия Платные (руб)

Программа считывает кадры с ip-камер (http - запрос к камере), видео, фото (источники кадров (нет ограничения на их количество) настраивается в конфигурационном файле), находит и распознает номера автомашин и сохраняет в базу db, с сохранением фото номера и автомашины, а также времени детекции.

20740 руб.

31.05.2023    7562    5    5    

10

Учет документов Распознавание документов и образов Системный администратор Программист Руководитель проекта 1С:Документооборот Платные (руб)

Обработка многостраничных файлов PDF с разбиением на отдельные документы по штрих-коду и сохранение документов в отдельные файлы для. Не требуется интернет, внешние утилиты командной строки и т.д. Плюсы: скорость работы, независимость от внешних библиотек или утилит, достаточно большой перечень поддерживаемых типов ШК, возможность фильтрации по формату и данным ШК. Не требует установки (portable), может работать несколько экземпляров ПО на одном хосте с разными настройками.

12200 руб.

07.07.2026    543    2    0    

1

Распознавание документов и образов Нейросети Бухгалтер 1C:Бухгалтерия Россия Платные (руб)

Каждый бухгалтер знает: авансовые отчеты - это рутина, которая отнимает очень много времени. Сотрудники приносят чеки из командировок, хозяйственных покупок, представительских расходов. Всё это нужно вручную перепечатывать в Excel или 1С - дату, поставщика, ИНН, сумму, позиции товаров. Ошибки, опечатки, потеря времени. Работает с локальными провайдерами. Важно! Для распознавания сканов, фотографий и PDF без текстового слоя выбранная языковая модель обязательно должна поддерживать функцию Vision (визуальный анализ изображений). Без Vision обрабатываются только текстовые файлы. Запускайте используя локальные ИИ, без подписок и ограничений.

6100 руб.

26.08.2026    168    0    0    

0

Распознавание документов и образов 1С:Предприятие 8 Россия Бесплатно (free)

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

26.08.2026    727    user718500    0    

0

Распознавание документов и образов Нейросети 1С:Предприятие 8 1С 8.3 1С 8.5 1C:Бухгалтерия 1С:Зарплата и Управление Персоналом 3.x Беларусь Россия Казахстан Армения Платные (руб)

ИИ-сканер документов с REST API для интеграции с 1С и корпоративными системами. Извлекайте данные из счетов, паспортов, дипломов, патентов и трудовых книжек за секунды. Точность человека - скорость машины. Приложение поддерживает восемь типов документов, четырех провайдеров ИИ (имеется возможность использования локальных ИИ), локальный REST API и экспорт в JSON. Важно! модель должна поддерживать функцию Vision (распознавание файлов и картинок). Запускайте используя локальные ИИ, без подписок и ограничений

6100 руб.

24.08.2026    310    0    0    

0

Распознавание документов и образов Бесплатно (free)

Расчёт применимости видеонаблюдения к складским процессам. Разбор для тех, кто внедряет и сопровождает WMS на 1С.

14.08.2026    1072    Michael_Kurkin    17    

7
Для отправки сообщения требуется регистрация/авторизация