Итак, что нам понадобится:
Про ОСень:
//infostart.ru/1c/articles/1980026/
Про Вино:
https://github.com/autumn-library/winow
Про коннектор:
https://github.com/vbondarevsky/1connector/tree/master
Про tesseract:
https://tesseract-ocr.github.io/tessdoc/Installation.html#windows
Про deepseek:
//infostart.ru/1c/tools/2366670/
На этих китах и держится весь этот сервис (пока что).
В планах мобилу Ленке из продуктового, с мобильным приложением и 1 кнопкой сфоткать накладную, после чего накладная уже в 1С :) )
Суть: мини сервер winow принимает картинку, распознает ее с помощью tesseract, и полученный текст скармливает deepseek, который производит пост обработку и корректировку накладной, сглаживая ошибки tesseract и выдает ответ в виде json или html(можно deepseek сказать чтобы оформил как реальную накладную). Что с этим делать дальше?
Думаю вы разберетесь.
За основу я взял example из winow.
Вы не поверите(если не знакомы с ОСенью), но код основного модуля в итоге выглядит вот так:
Ну и собственно основная логика у меня уместилась в 1 процедуру:
&ТочкаМаршрута("parseimage")
Процедура ОбработкаФормы(ДанныеФормы, Ответ) Экспорт
Ответ.Модель = Новый Структура("Имя, ДатаРождения, Фото");
ДанныеФайла = ДанныеФормы.НайтиЗначениеПоМетаданным(Новый Структура("name", "file"));
ИмяФайла = ПолучитьИмяВременногоФайла("raw");
ИмяФайлаТекст = ПолучитьИмяВременногоФайла();
Сообщить(ИмяФайлаТекст);
ДанныеФайла.Записать(ИмяФайла);
Приостановить(300);
ЗапуститьПриложение("""C:\Program Files\Tesseract-OCR\Tesseract.exe"""+ " " + ИмяФайла + " " + ИмяФайлаТекст + " -l rus --oem 1", КаталогВременныхФайлов(), Истина);
Приостановить(300);
Ответ.УстановитьТипКонтента("json");
Аутентификация = "Bearer <Token deepseek>"; // здесь вставить токен
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", Аутентификация);
Заголовки.Вставить("Content-Type", "application/json");
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("model", "deepseek-chat");
Сообщения = Новый Массив;
СообщениеПользователя = Новый Структура;
СообщениеПользователя.Вставить("role", "system");
СообщениеПользователя.Вставить("content", "Ты профессиональный бухгалтер. Пользователь дает текст, ты его проверяешь, корректируешь на наличие ошибок и преобразуешь в json документ. Выведи только json без описания своих действий.");
Сообщения.Добавить(СообщениеПользователя);
СообщениеПользователя = Новый Структура;
СообщениеПользователя.Вставить("role", "user");
ИмяФайлаТекст = ИмяФайлаТекст + ".txt";
ФайлТекст = Новый Файл(ИмяФайлаТекст);
Сч = 100;
Пока Не ФайлТекст.Существует() И Сч > 0 Цикл
Сообщить(ИмяФайлаТекст);
Cч = Сч - 1;
КонецЦикла;
ТФ = Новый ТекстовыйДокумент;
ТФ.Прочитать(ИмяФайлаТекст);
СообщениеПользователя.Вставить("content", "текст: " + ТФ.ПолучитьТекст());
ТФ = Неопределено;
Сообщения.Добавить(СообщениеПользователя);
СтруктураДанных.Вставить("messages", Сообщения);
СтруктураДанных.Вставить("stream", false);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Заголовки", Заголовки);
Результат = КоннекторHTTP.Post("https://api.deepseek.com/chat/completions", Неопределено, СтруктураДанных, ДополнительныеПараметры).Json();
ОтветТекст = Результат["choices"][0]["message"]["content"];
Ответ.ТелоТекст = ОтветТекст;
КонецПроцедуры
Проверить у себя на практике, как все это работает, можно скачав архив с примером, в который достаточно вставить токен дипсик, выполнить oscript ocr.os и у вас на localhost:3333 свой сервис по распознаванию первички.
Разработка актуальна для логистических центров, и можно ее модифицировать под свои нужды.
Самое интересное, что это намного дешевле сервиса от вендора, в котором 3 руб./документ.
Здесь себестоимость запроса к обычной модели deepseek для 1 документа меньше 1 цента.
Спасибо за внимание!
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.11.189