Odin | База знаний 1С

Как реализовать рас...
 

Как реализовать распознавание документов в 1С через API?


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

// Модуль формы обработки распознавания документов

#Область ОбработчикиСобытийФормы

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИнициализироватьОбработку();
СтатусРаспознавания = "Готов к работе";
Прогресс = 0;
КонецПроцедуры

#КонецОбласти

#Область КомандыКлиента

&НаКлиенте
Процедура КомандаВыбратьФайл(Команда)

ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Фильтр =
"Документы (*.pdf;*.doc;*.docx;*.xlsx;*.xls)|*.pdf;*.doc;*.docx;*.xlsx;*.xls|" +
"Изображения (*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp|" +
"Все файлы (*.*)|*.*";

ДиалогВыбораФайла.Заголовок = "Выберите документ для распознавания";

Если ДиалогВыбораФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогВыбораФайла.ПолноеИмяФайла;
ИмяФайла = Файлы.ИмяФайла(ПутьКФайлу);
ПолеИмяФайла.Заголовок = "Выбран файл: " + ИмяФайла;
КнопкаРаспознать.Доступность = Истина;
ДобавитьВЛог("Выбран файл: " + ИмяФайла);
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаРаспознать(Команда)

Если ПустаяСтрока(ПутьКФайлу) Тогда
Сообщить("Выберите файл для распознавания");
Возврат;
КонецЕсли;

Если ПустаяСтрока(APIКлючDeepSeek) Тогда
Сообщить("Укажите API ключ DeepSeek");
Возврат;
КонецЕсли;

Если НЕ Файлы.Существует(ПутьКФайлу) Тогда
Сообщить("Файл не существует: " + ПутьКФайлу);
Возврат;
КонецЕсли;

Прогресс = 0;
ЛогПроцесса = "";
СтатусРаспознавания = "Подготовка к распознаванию...";
КнопкаРаспознать.Доступность = Ложь;

РаспознатьНаСервере();

КонецПроцедуры

&НаКлиенте
Процедура КомандаНайтиВНоменклатуре(Команда)

Если ТаблицаРезультатов.Количество() = 0 Тогда
Сообщить("Нет данных для поиска. Сначала выполните распознавание документа.");
Возврат;
КонецЕсли;

НайтиСоответствияНаСервере();

КонецПроцедуры

&НаКлиенте
Процедура КомандаСформироватьКП(Команда)

Если ТаблицаРезультатов.Количество() = 0 Тогда
Сообщить("Нет данных для формирования коммерческого предложения.");
Возврат;
КонецЕсли;

СформироватьКПНаСервере();

КонецПроцедуры

#КонецОбласти

#Область СерверныеПроцедуры

&НаСервере
Процедура ИнициализироватьОбработку()

ТаблицаРезультатов = Новый ТаблицаЗначений;
ТаблицаРезультатов.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
ТаблицаРезультатов.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаРезультатов.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("Строка"));
ТаблицаРезультатов.Колонки.Добавить("Уверенность", Новый ОписаниеТипов("Число"));
ТаблицаРезультатов.Колонки.Добавить("НайдоВСправочнике", Новый ОписаниеТипов("Булево"));
ТаблицаРезультатов.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблицаРезультатов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
ТаблицаРезультатов.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

APIКлючDeepSeek = "";
ПутьКФайлу = "";

КонецПроцедуры

&НаСервере
Процедура РаспознатьНаСервере()

Попытка
ТаблицаРезультатов = РаспознатьДокументЧерезDeepSeek(ПутьКФайлу);

Если ТаблицаРезультатов = Неопределено Тогда
ВызватьИсключение "Не удалось распознать документ";
КонецЕсли;

Прогресс = 100;
СтатусРаспознавания = "Распознавание завершено успешно";
КнопкаНайтиВНоменклатуре.Доступность = Истина;
Сообщить("Успешно распознано " + ТаблицаРезультатов.Количество() + " позиций");

Исключение
Ошибка = ОписаниеОшибки();
СтатусРаспознавания = "Ошибка распознавания";
КнопкаРаспознать.Доступность = Истина;
Сообщить("Ошибка распознавания: " + Ошибка);
КонецПопытки;

КонецПроцедуры



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

Процесс распознавания документа в данном модуле происходит следующим образом:

1. **Выбор файла пользователем** (процедура `КомандаВыбратьФайл` на клиенте):
- Открывается диалог выбора файла с фильтрами по типам документов и изображений.
- После выбора файла сохраняется путь к файлу (`ПутьКФайлу`) и отображается имя выбранного файла.
- Активируется кнопка запуска распознавания (`КнопкаРаспознать.Доступность = Истина`).
- В лог добавляется запись о выбранном файле.

2. **Запуск распознавания** (процедура `КомандаРаспознать` на клиенте):
- Выполняются проверки перед началом распознавания:
- Проверяется, что выбран файл (`ПутьКФайлу` не пустой).
- Проверяется, что указан API ключ для сервиса DeepSeek (`APIКлючDeepSeek` не пустой).
- Проверяется существование файла по указанному пути.
- Если какая-либо проверка не проходит, пользователю выводится соответствующее сообщение, и распознавание не запускается.
- Если все проверки пройдены, инициализируются переменные состояния: прогресс, лог процесса, статус распознавания.
- Кнопка распознавания блокируется (`КнопкаРаспознать.Доступность = Ложь`), чтобы предотвратить повторный запуск.
- Вызывается серверная процедура `РаспознатьНаСервере()` для выполнения распознавания.

3. **Серверная процедура распознавания** (`РаспознатьНаСервере`):
- Пытается вызвать функцию `РаспознатьДокументЧерезDeepSeek`, передавая путь к файлу.
- Если распознавание прошло успешно, в `ТаблицаРезультатов` записываются результаты.
- Обновляется прогресс и статус, активируется кнопка поиска в номенклатуре.
- Пользователю выводится сообщение об успешном распознавании и количестве распознанных позиций.
- В случае ошибки распознавания:
- Обрабатывается исключение.
- Обновляется статус на "Ошибка распознавания".
- Кнопка распознавания разблокируется.
- Пользователю выводится сообщение с текстом ошибки.

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

Рекомендую посмотреть здесь: https://infostart.ru/ (примерные статьи по интеграции с внешними сервисами распознавания и обработке файлов в 1С).



   
ОтветитьЦитата