// Модуль формы обработки распознавания документов
#Область ОбработчикиСобытийФормы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИнициализироватьОбработку();
СтатусРаспознавания = "Готов к работе";
Прогресс = 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;
СтатусРаспознавания = "Распознавание завершено успешно";
КнопкаНайтиВНоменклатуре.Доступность = Истина;
Сообщить("Успешно распознано " + ТаблицаРезультатов.Количество() + " позиций");
Исключение
Ошибка = ОписаниеОшибки();
СтатусРаспознавания = "Ошибка распознавания";
КнопкаРаспознать.Доступность = Истина;
Сообщить("Ошибка распознавания: " + Ошибка);
КонецПопытки;
КонецПроцедуры
Процесс распознавания документа в данном модуле происходит следующим образом:
1. **Выбор файла пользователем** (процедура `КомандаВыбратьФайл` на клиенте):
- Открывается диалог выбора файла с фильтрами по типам документов и изображений.
- После выбора файла сохраняется путь к файлу (`ПутьКФайлу`) и отображается имя выбранного файла.
- Активируется кнопка запуска распознавания (`КнопкаРаспознать.Доступность = Истина`).
- В лог добавляется запись о выбранном файле.
2. **Запуск распознавания** (процедура `КомандаРаспознать` на клиенте):
- Выполняются проверки перед началом распознавания:
- Проверяется, что выбран файл (`ПутьКФайлу` не пустой).
- Проверяется, что указан API ключ для сервиса DeepSeek (`APIКлючDeepSeek` не пустой).
- Проверяется существование файла по указанному пути.
- Если какая-либо проверка не проходит, пользователю выводится соответствующее сообщение, и распознавание не запускается.
- Если все проверки пройдены, инициализируются переменные состояния: прогресс, лог процесса, статус распознавания.
- Кнопка распознавания блокируется (`КнопкаРаспознать.Доступность = Ложь`), чтобы предотвратить повторный запуск.
- Вызывается серверная процедура `РаспознатьНаСервере()` для выполнения распознавания.
3. **Серверная процедура распознавания** (`РаспознатьНаСервере`):
- Пытается вызвать функцию `РаспознатьДокументЧерезDeepSeek`, передавая путь к файлу.
- Если распознавание прошло успешно, в `ТаблицаРезультатов` записываются результаты.
- Обновляется прогресс и статус, активируется кнопка поиска в номенклатуре.
- Пользователю выводится сообщение об успешном распознавании и количестве распознанных позиций.
- В случае ошибки распознавания:
- Обрабатывается исключение.
- Обновляется статус на "Ошибка распознавания".
- Кнопка распознавания разблокируется.
- Пользователю выводится сообщение с текстом ошибки.
**Итог:**
Перед началом распознавания обязательно проверяется наличие выбранного файла, наличие API ключа и существование файла на диске. Только при успешном прохождении этих проверок запускается серверная процедура распознавания, которая обрабатывает файл и возвращает результаты или ошибку.
Рекомендую посмотреть здесь: https://infostart.ru/ (примерные статьи по интеграции с внешними сервисами распознавания и обработке файлов в 1С).