Page cover image

Бухгалтерская первичка

Извлекаем данные из первичных документов

Классифицируем и распознаём 16 видов официальных документов, которые используются в бухгалтерском учете и налогообложении. Дальше — больше.

Типы первичных документов, с которыми работает сервис

Вид документа
Название в API
Извлечение
Классификация

Акт приёма-передачи нематериальных активов

rus_act_completition

Счёт на оплату / Счёт

rus_bill

Счёт-фактура

rus_invoice

Универсальный передаточный документ (УПД)

rus_upd

Договор

rus_contract

Товарная накладная — ТОРГ-12

rus_torg_12

Акт сверки взаиморасчётов

rus_act_reconciliation

Акт приёма-передачи основных средств ОС-1

rus_os_1

Счёт-договор (оферта)

rus_contract_invoice

Банковский платёжный ордер

rus_bank_order

ОС-6

rus_os_6

Акт списания нематериальных активов

rus_act_retirement

ОС-15

rus_os_15

ОС-1Б

rus_os_1b

Доверенность

rus_power_of_attorney

Посторонний документ

other

Перечень извлекаемых полей

Поле в документе
Название в API

Основание передачи

basis

Покупатель: адрес

buyer_address

Покупатель: название компании

buyer_company

Покупатель: ФИО

buyer_fio

Покупатель: ИНН

buyer_inn

Покупатель: КПП

buyer_kpp

Покупатель: ОКПО

buyer_okpo

Валюта

currency

Дата документа

date

Руководитель организации: ФИО

lead_name

Сумма НДС

nds_sum

Номер документа

number

Номер связанного документа

related_document

Продавец: адрес

seller_address

Продавец: номер банковского счёта

seller_bank_account_number

Продавец: БИК

seller_bank_bic

Продавец: название банка

seller_bank_name

Продавец: название компании

seller_company

Продавец: ФИО

seller_fio

Продавец: ИНН

seller_inn

Продавец: КПП

seller_kpp

Продавец: ОКПО

seller_okpo

Продавец: ОКУД

seller_okud

Главный бухгалтер: ФИО

senior_accountant_name

Груз принял: ФИО

shipment_acceptor_name

Груз принял: должность

shipment_acceptor_position

Получатель груза: адрес

shipment_recepient_address

Получатель груза: компания

shipment_recepient_company

Получатель груза: ИНН

shipment_recepient_inn

Получатель груза: КПП

shipment_recepient_kpp

Получатель груза: ОКДП

shipment_recepient_okdp

Получатель груза: ОКПО

shipment_recepient_okpo

Отпуск груза разрешил: ФИО

shipment_release_authorised_by_name

Отпуск груза разрешил: должность

shipment_release_authorised_by_position

Груз отпустил: ФИО

shipment_released_by_name

Груз отпустил: должность

shipment_released_by_position

Поставщик: адрес

shipment_supplier_address

Поставщик: название компании

shipment_supplier_company

Поставщик: ИНН

shipment_supplier_inn

Поставщик: КПП

shipment_supplier_kpp

Поставщик: ОКПО

shipment_supplier_okpo

Поставщик: главный бухгалтер: ФИО

shipment_supplier_senior_accountant_name

Поставщик: должность

shipment_supplier_senior_accountant_position

Сторона А: название компании

side_a_company

Сторона А: ФИО

side_a_name

Сторона А: должность

side_a_position

Сторона Б: название компании

side_b_company

Сторона Б: ФИО

side_b_name

Сторона Б: должность

side_b_position

Сумма

total_sum

Как начать работать с сервисом извлечения данных

Описали 5 популярных способов взаимодействия с сервисом. Для любого вам нужен ключ лицензии. Чтобы получить ключ, напишите нам в телеграм или на [email protected].

Подготовьте изображение документа для теста.

Через веб-демо
  1. Откройте demo.dbrain.io

  2. Введите ключ лицензии в поле «Токен» и нажмите «Применить»

  3. Выберите «Бухгалтерская первичка»

  4. Нажмите кнопку «Выберите файл для распознавания»

  5. Укажите изображение, которое нужно распознать

  6. Нажмите кнопку «Распознать»

Через терминал

Обратитесь к методу /rus_invoices по адресу latest.dbrain.io. В этом способе только два обязательных параметра:

  • token — ваш ключ лицензии

  • image — файл с изображением документа

Запрос curl должен выглядеть так:

curl -X 'POST' \
  'https://latest.dbrain.io/rus_invoices?token=xxx' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F '[email protected];type=image/jpeg'
Через Swagger
  • Подготовьте ключ лицензии

  • Откройте Swagger и нажмите кнопку Authorize в правом верхнем углу

  • Введите свой токен в любое поле и нажмите Authorize

  • Прокрутите вниз до раздела pipelines/run/rus_invoices, нажмите на него

  • В открывшемся разделе нажмите на кнопку Try it out

  • Прокрутите страницу вниз до раздела Request body

  • Нажмите на кнопку Choose file пункта image

  • Укажите изображение, которое нужно распознать

  • Нажмите кнопку Execute

  • Ответ сервиса появится в пункте Response body раздела Responses

  • Полученный на этом этапе Curl мы рекомендуем использовать как основу для написания интеграции с API сервиса Dbrain

Через Python
import requests

url = 'https://latest.dbrain.io/rus_invoices?token=xxx'
files = {'image': open('image.jpg', 'rb')}
headers = {'accept': 'application/json'}

response = requests.post(url, headers=headers, files=files)

Код использует библиотеку requests для отправки POST-запроса с файлом изображения. Функция open() используется для открытия файла изображения в двоичном режиме и передачи его в параметр files. Параметр headers используется для установки заголовка accept в значение application/json. Ответ от сервера сохраняется в переменной response.

Тело запроса передавайте в кодировке UTF-8.

Через 1С
Функция РаспознатьДокумент(ПакетДвоичныеДанные, ИмяФайла) Экспорт
	// готовит HTTP-запрос, включая заголовки и тело, и отправляет его на сервер.
	ПараметрыЗапроса ="?token=B000000000000000000000"; // токен необходимо получить собственный!
	РазделительМультисообщения = "----MessageBoundary1C";

	HTTPЗапрос = Новый HTTPЗапрос("/rus_invoices"+ПараметрыЗапроса);
	HTTPЗапрос.Заголовки.Вставить("accept", "application/json");
	HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + РазделительМультисообщения);

	ТелоПоток = Новый ПотокВПамяти();
	
	ЗаписьДанных = Новый ЗаписьДанных(ТелоПоток); 
	ЗаписьДанных.ЗаписатьСтроку("--" + РазделительМультисообщения);
	ЗаписьДанных.Записать(СоздатьСообщение_XML("image", ИмяФайла, ПакетДвоичныеДанные)); 
	ЗаписьДанных.ЗаписатьСимволы(Символы.ВК); 
	ЗаписьДанных.ЗаписатьСимволы(Символы.ПС);
	ЗаписьДанных.ЗаписатьСтроку("--" + РазделительМультисообщения + "--");
	ЗаписьДанных.Закрыть();
	
	ТелоДвоичныеДанные = ТелоПоток.ЗакрытьИПолучитьДвоичныеДанные();
	
	Попытка
		Соединение = Новый HTTPСоединение("latest.dbrain.io",
										443,
										,
										,
										,
										60,	
										ЗащищенноеСоединение());
	Исключение
		Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));	
	КонецПопытки;

	HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ТелоДвоичныеДанные);
	Возврат Соединение.ОтправитьДляОбработки(HTTPЗапрос);
	
КонецФункции	

Функция ЗащищенноеСоединение() 
	
	ЗащищенноеСоединение = Неопределено;
	
	СистемнаяИнфо = Новый СистемнаяИнформация;
	ТипПлатформыСервера = СистемнаяИнфо.ТипПлатформы;

	Если ТипПлатформыСервера = ТипПлатформы.Windows_x86
		Или ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда
		ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
		Новый СертификатКлиентаWindows(),
		Новый СертификатыУдостоверяющихЦентровWindows());
	Иначе
		ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
	КонецЕсли;
	
	Возврат ЗащищенноеСоединение;
	
КонецФункции

Функция СоздатьСообщение_XML(ИмяСообщения, ИмяФайла, СообщениеДвоичныеДанные)   
	
	Поток = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(Поток);
	// Заголовки
	ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + ИмяСообщения + """; filename=""" + ИмяФайла + """");
	Если Прав(ИмяФайла, 4) = ".xml" Тогда
		ТипMIME = "text/xml";
	ИначеЕсли Прав(ИмяФайла, 4) = ".pdf" Тогда
		ТипMIME = "application/pdf";
	Иначе
		ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФайла, ".");
		Если ЧастиИмени.Количество() > 1 Тогда
			ТипMIME = "image/" + ЧастиИмени[ЧастиИмени.ВГраница()];	
		КонецЕсли;
	КонецЕсли;                                
	ЗаписьДанных.ЗаписатьСтроку("Content-Type: " + ТипMIME);
	ЗаписьДанных.ЗаписатьСтроку("");
	// Тело
	ЗаписьДанных.Записать(СообщениеДвоичныеДанные);
	ЗаписьДанных.Закрыть();

	Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();
		

Параметры запроса к API

Асинхронный запрос

Возврат найденных областей изображения

Тегирование запроса

Нормализация адресов по ФИАС

Верификация результатов извлечения полей

Тело запроса к API

Изображение

В ответе на запрос к API:

Перед началом работы с сервисами изучите раздел «Общая информация о сервисах». Там мы рассказываем про допустимые форматы файлов, виды запросов и ответов, набор HTTP-статусов и даём рекомендации по устранению ошибок

task_id

string

Идентификатор запроса, формат: 32 символа, 16-ричная строка

error

string

Текстовое описание ошибки

task_tags

array[string]

Теги, если они переданы в параметре task_tags

success

boolean

Статус запроса

status_code

integer

HTTP-код статуса запроса

result.images

array[$string]

Массив data URL с MIME-типом JPEG в формате base64 — изображения найденных документов. Возвращается, если в запросе передать return_crops=true

result.doc_type

string

Тип документа из списка документов, поддерживаемых сервисом

result.confidence

number

Уровень уверенности сервиса от 0 до 1 в корректности определения типа документа. Чем ближе к 1, тем выше уверенность

result.page_num

integer

Номер страницы в оригинальном файле, на котором найден документ

result.fields

array

Массив, содержащий поля, которые сервис извлёк из документа

result.fields.name

string

Название поля в документе из перечня извлекаемых полей

result.fields.value

string

Текстовое содержимое поля, которое извлёк сервис

result.fields.confidence

number

Уровень уверенности сервиса от 0 до 1 в корректности содержимого, извлечённого из поля

result.fields.page_num

integer

Номер страницы в оригинальном файле, на которой найдено поле

result.fields.coords

array[integer]

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

result.fields.crops

array[$string]

Массив data URL с MIME-типом JPEG в формате base64 — изображения найденных частей поля. Возвращается, если в запросе передать return_crops=true

result.fields.is_found

boolean

  • true — поле найдено в документе

  • false — поле в документе не найдено

result.tables

array[array]]

Массив, содержащий найденные в документе таблицы

result.tables.name

string

Название ячейки таблицы по схеме

table_id-X_row-Y_col-Z, где: • X — порядковый номер таблицы (сверху внизу) • Y — порядковый номер строки в таблице, начиная с 0 • Z — порядковый номер столбца в таблице, начиная с 0

result.tables.value

string

Текстовое содержимое ячейки таблицы

result.tables.confidence

number

Уровень уверенности сервиса от 0 до 1 в корректности содержимого, извлечённого из ячейки

result.tables.page_num

integer

Номер страницы в оригинальном файле, на котором найдена ячейка

result.tables.coords

array[integer]

Массив с координатами ячейки по четырём точкам: верхний левый угол, верхний правый, нижний левый, нижний правый

result.tables.crops

array[$string]

Массив data URL с MIME-типом JPEG в формате base64 — изображение ячейки. Возвращается, если в запросе передать return_crops=true

result.tables.is_found

boolean

  • true — ячейка найдена в документе

  • false — ячейка в документе не найдена