Имя: Пароль:
1C
1С v8
Нужна помощь с потоковым сканированием
0 soopchik
 
13.09.19
23:42
Всем доброго времени суток.
Нужна помощь с потоковым сканированием через компоненту TWAIN.
Основная проблема пока что проявляется в том что
Если использовать метод .НачатьСканирование(
с параметром ПоказыватьДиалог = Ложь,
то сканирует исключительно в режиме планшет.
Лоток заполнен, на стекле пусто. в результате прогоняет пустое стекло, а лоток по прежнему полон.  
Если ПоказыватьДиалог = Истина,
и в открывшемся диалоге выбрать режим подачи, ни каких внешних событий в 1с не входит.
В режиме планшета все отлично в не зависимости от режима диалога.
Картинка сохраняется в темп, в 1с идет два внешних события: ImageAcquired (с адресом картинки в темпе); EndBatch.
Буду рад любой помощи по теме 1с и потокового сканирования с автоподатчика

Спасибо.
1 soopchik
 
13.09.19
23:43
Подробнее:
Сканер HP LaserJet Pro M426fdn
Конфигурация самописная, обычные формы (хотя здесь наверное это и не важно)
Есть общий макет с компонентой TWAIN, скопированный с документооборота
версия компоненты 1.9

Есть внешняя обработка в которой основных момента два:
1) сам запуск диалога сканера

ПоказыватьДиалог = Истина;
РасширениеКартинки = "JPG";
Разрешение = 300;
Цветность = 1;
Поворот = 90;
РазмерБумаги = 1;
ПараметрСжатие = 10;

мКомпонентаTwain.НачатьСканирование(ПоказыватьДиалог
, ИмяДрайвера //Выбранный на форме
, РасширениеКартинки
, Разрешение
, Цветность
, Поворот
, РазмерБумаги
, ПараметрСжатие,
ДвустороннееСканирование //Флажок на форме. значение сути не меняет
);

2) обработка внешних событий от сканера
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    Если Источник = "TWAIN" И Событие = "ImageAcquired" Тогда
        ВыбФайл=Новый Файл(Данные);
        нов = тз.Добавить();
        нов.Файл = Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss") + ВыбФайл.Расширение;
        ДвоичныеДанные = Новый ДвоичныеДанные(Данные);
        АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор);
        нов.АдресКартинки = АдресКартинки;
        ЭлементыФормы.ПолеКартинки.Картинка = Новый Картинка(ДвоичныеДанные);
        ЭлементыФормы.тз.ТекущаяСтрока = нов;
        УдалитьФайлы(Данные);    
    ИначеЕсли Источник = "TWAIN" И Событие = "EndBatch" Тогда
        //Ни чего не делаю
    ИначеЕсли Источник = "TWAIN" И Событие = "UserPressedCancel" Тогда    
        //Ни чего не делаю
    КонецЕсли;
    
КонецПроцедуры

(все остальное в обработке это бантики по проверке компоненты,
ее если что установки, формированию самого списка сканеров,
сохранение картинки из текущей строки уже в свою папку и т.д. Все работает корректно)
https://yadi.sk/d/YpLTS1DGA2efmA
В обработке нет ни какой зависимости от метаданных, кроме самой компоненты в общих макета
подойдет для любой в обычном приложении где есть эта компонента

И если в диалоге выбрать режим планшета, то все отлично работает
проходит сканирование
отрабатывает событие "ImageAcquired"
закрывается автоматом диалог
отрабатывает событие "EndBatch"

И если в диалоге выбрать режим податчик, то
происходит сканирование всех листов из лотка податчика
ни каких внешних событий в 1с не входит
и во временном каталоге почему то только файл скана первого листа из лотка
2 Сияющий в темноте
 
14.09.19
18:41
у сканера должно быть приложение для сканирования,которое запускать из командной строки с параметрами.
3 ILM
 
гуру
14.09.19
20:01
СНачала спросите ГБ готов ли он заплатить за это. У нас отказались от такого проекта.
4 soopchik
 
16.09.19
18:10
(2) Приложение запускается без проблем.
но при потоковом сканировании ни какой инфы от приложения в 1с нету

я так подозреваю что если в режиме планшета
в 1с приходит два внешних события:
Данные)
Источник = "TWAIN" Событие = "ImageAcquired" Данные - строка с адресом картинки в папке temp
Источник = "TWAIN" Событие = "EndBatch" Данные = Неопределено

То в режиме автоподачи к примеру для трех листов в лотке должно быть примерно так:
Источник = "TWAIN" Событие = "ImageAcquired" Данные - строка с адресом картинки листа 1
Источник = "TWAIN" Событие = "ImageAcquired" Данные - строка с адресом картинки листа 2
Источник = "TWAIN" Событие = "ImageAcquired" Данные - строка с адресом картинки листа 3
Источник = "TWAIN" Событие = "EndBatch" Данные = Неопределено.

Но вот в режиме автоподачи в 1с вообще ни чего не приходит

Если запустить приложение без компоненты 1с
к примеру через
КомандаСистемы(<СтрокаКоманды>, <ТекущийКаталог>)
или
ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>, <КодВозврата>)

То в 1с не приходит ни каких внешних событий даже в режиме планшета
в коде возврата для ЗапуститьПриложение просто = 1

Уже думал об идее отлавливать новые изображения в нужной папке
но это уже на самый-самый крайний случай
т.к. теряется вся универсальность
5 soopchik
 
16.09.19
18:33
(3)Возможно не совсем понял,
но суть в том что каким либо способом но все равно нужно решить эту проблему.
Не принципиально чтоб через типовую 1с компоненту.
Через
COMОбъект("WIA.DeviceManager")
уже пробовал. Там вообще чудеса чудесатые начинаются с этим сканером.

Возможно и здесь проблема кроется в самом сканере, но нет возможности проверить еще на чем-либо.

Об еще одном из обходных путей писал на комментарий выше,
но повторюсь что у него есть один значимый в моем случае минус, это универсальность

За различные варианты других путей, или модификацию этих буду тоже очень признателен.
Можно просто на этапе идеи.
6 Chum
 
16.09.19
18:36
(0) предложу поискать другую компоненту для сканирования. К дефолтной было много претензий.

Вообще, твайн используется для предварительного сканирования и настройки получения изображения. 1с просто потом забирает готовый файл и все.
7 soopchik
 
17.10.19
16:04
В моей ситуации помог другой драйвер
с ним компонента вела себя нормально и в режиме подачи и планшета
Причем драйвер который послужил причиной создания темы оказалось был не родной
а с родным все ок.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан