При автоматизации документооборота в среде 1С часто возникает необходимость сканирования документов напрямую в информационную базу. Для этого разработчики обычно используют стандартную компоненту сканирования TWAIN, входящую в состав Библиотеки стандартных подсистем (БСП). Однако при работе с сетевыми многофункциональными устройствами (МФУ), в частности популярной моделью Kyocera ECOSYS M2040dn, программисты сталкиваются с неприятной особенностью: параметр двустороннего сканирования полностью игнорируется системой. Вне зависимости от того, передаем ли мы в метод значение Истина или Ложь, устройство сканирует документы только в одном режиме, жестко заданном в настройках самого драйвера.
В этой статье мы подробно проанализируем причины этой проблемы, разберем по шагам диагностику и реализуем надежный обходной путь (костыль), который позволит разделять одностороннее и двустороннее сканирование прямо в коде 1С. Также мы рассмотрим дополнительные системные методы настройки драйверов Kyocera для исправления этой ошибки на уровне операционной системы.
Для начала проанализируем поведение компоненты TWAIN. При инициализации процесса сканирования 1С опрашивает драйвер устройства на предмет поддерживаемых возможностей. За двустороннее сканирование отвечает стандартная TWAIN-команда CAP_DUPLEXENABLED. В проблемных конфигурациях драйвер Kyocera TWAIN возвращает некорректный ответ либо вовсе блокирует динамическое управление этим свойством из внешних приложений.
Чтобы убедиться, что проблема именно в этом, мы можем воспользоваться методом диагностики возможностей устройства. Вызовем функцию получения настройки:
РезультатНастройки = ПолучитьНастройку(ИмяУстройства, "DUPLEX");
Если данная функция возвращает значение 0, это означает, что компонента 1С не может программно переключить дуплекс на данном драйвере. Драйвер Kyocera сообщает системе, что устройство якобы не поддерживает двусторонний режим в текущем контексте, хотя физически МФУ оснащено реверсивным автоподатчиком (ADF).
Если нам необходимо решить задачу оперативно и без глубокого вмешательства в настройки операционной системы на каждом клиентском компьютере, мы можем применить изящный программный обходной путь. Идея заключается в следующем:
РежимОдностороннегоСканирования = Истина).ImageAcquired, куда поочередно поступают файлы отсканированных страниц, мы осуществляем фильтрацию. Если активен односторонний режим, мы сохраняем только самую первую полученную страницу (первый файл), а последующие события и файлы просто игнорируем.Рассмотрим подробнее реализацию этого алгоритма на встроенном языке 1С. Для начала настроим команду запуска сканирования в модуле формы документа:
&НаКлиенте
Перем РежимОдностороннегоСканирования;
Перем ФайловПринято;
&НаКлиенте
Процедура КомандаСканироватьОдносторонне(Команда)
РежимОдностороннегоСканирования = Истина;
ФайловПринято = 0;
ЗапуститьПроцессСканирования();
КонецПроцедуры
&НаКлиенте
Процедура КомандаСканироватьДвусторонне(Команда)
РежимОдностороннегоСканирования = Ложь;
ФайловПринято = 0;
ЗапуститьПроцессСканирования();
КонецПроцедуры
&НаКлиенте
Процедура ЗапуститьПроцессСканирования()
Если РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту() Тогда
// Передаем параметры инициализации сканирования.
// Обратите внимание, что параметр ДвухстороннееСканирование (последний в методе)
// здесь может быть передан как Истина, но из-за бага драйвера мы подстраховываемся.
ПараметрыПриложения["СтандартныеПодсистемы.КомпонентаTwain"].НачатьСканирование(
Ложь,
ИмяУстройстваСканирования,
"JPG",
200, // Разрешение dpi
2, // Цветность (цветное)
0, // Поворот
1, // Сжатие
100, // Качество JPG
Истина // Всегда запрашиваем двухстороннее на уровне вызова
);
КонецЕсли;
КонецПроцедуры
Теперь настроим обработку внешнего события, которое генерирует TWAIN-компонента по мере сканирования листов автоподатчиком. Проанализируем код обработчика:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверяем, что событие пришло от компоненты сканирования
Если Источник = "Twain" ИЛИ Источник = "КомпонентаСканирования" Тогда
Если Событие = "ImageAcquired" Тогда
ФайловПринято = ФайловПринято + 1;
// Если включен режим одностороннего сканирования,
// и это уже второй лист (оборотная сторона), мы его просто игнорируем.
Если РежимОдностороннегоСканирования И ФайловПринято > 1 Тогда
// Пропускаем обработку файла, не добавляя его в документ
Возврат;
КонецЕсли;
// Обрабатываем полученный файл (Данные содержат путь к временному файлу изображения)
ОбработатьПолученныйСкан(Данные);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует, что пользователь, положив документ в автоподатчик и выбрав односторонний режим, получит в 1С ровно одну страницу (лицевую), даже если сканер физически прогнал лист с двух сторон. Способ чрезвычайно прост, не требует прав администратора и работает стабильно на любых версиях операционных систем.
Более продвинутый способ заключается в управлении настройками самого драйвера Kyocera "на лету". Драйвер Kyocera TWAIN хранит параметры текущего профиля сканирования в XML-файле, расположенном в профиле пользователя Windows. Мы можем программно редактировать этот файл перед вызовом метода НачатьСканирование.
Разберем этот процесс по шагам:
C:\Users\<Имя_Пользователя>\AppData\Roaming\Kyocera\KM_TWAIN\KMSCNTOOL\N_LSTSCN1.xml (имя файла может незначительно отличаться в зависимости от версии утилиты Kyocera, например, lstscn.xml).ЧтениеXML.Посмотрим на пример кода, реализующий эту схему:
&НаКлиенте
Процедура ИзменитьРежимВНастройкахДрайвера(ВключитьДуплекс)
// Получаем путь к AppData текущего пользователя Windows
ИмяПользователяОС = СистемнаяИнформация.ИмяПользователяОС;
ПутьКФайлу = "C:\Users\" + ИмяПользователяОС + "\AppData\Roaming\Kyocera\KM_TWAIN\KMSCNTOOL\N_LSTSCN1.xml";
ФайлКонфига = Новый Файл(ПутьКФайлу);
Если Не ФайлКонфига.Существует() Тогда
Возврат; // Файл настроек не найден, выходим
КонецЕсли;
// Считываем текст файла конфигурации драйвера
ТекстФайла = Новый ТекстовыйДокумент;
ТекстФайла.Прочитать(ПутьКФайлу);
ПолныйТекст = ТекстФайла.ПолучитьТекст();
// В зависимости от требуемого режима производим контекстную замену узла.
// Параметры узлов могут отличаться в зависимости от версии Kyocera TWAIN.
// Обычно это теги <Duplex> или <Source>.
Если ВключитьДуплекс Тогда
НовыйТекст = СтрЗаменить(ПолныйТекст, "<Duplex>0</Duplex>", "<Duplex>1</Duplex>");
НовыйТекст = СтрЗаменить(НовыйТекст, "<Source>0</Source>", "<Source>2</Source>"); // 2 - автоподатчик с дуплексом
Иначе
НовыйТекст = СтрЗаменить(ПолныйТекст, "<Duplex>1</Duplex>", "<Duplex>0</Duplex>");
НовыйТекст = СтрЗаменить(НовыйТекст, "<Source>2</Source>", "<Source>1</Source>"); // 1 - обычный автоподатчик
КонецЕсли;
ТекстФайла.УстановитьТекст(НовыйТекст);
ТекстФайла.Записать(ПутьКФайлу);
КонецПроцедуры
Этот метод полностью решает проблему "игнорирования" параметров, так как мы физически меняем конфигурацию драйвера перед его инициализацией в операционной системе. Единственный минус — необходимость точечной настройки путей к файлам под конкретную версию драйвера Kyocera на рабочих станциях.
Если мы не хотим писать дополнительный код фильтрации, нам следует убедиться, что драйвер TWAIN настроен в Windows корректно. Часто администраторы устанавливают универсальный драйвер или допускают ошибки при конфигурации сетевого порта. Проверим следующие важные моменты:
Таким образом, комбинируя системные настройки оборудования и программные механизмы фильтрации страниц во внешнем событии 1С, мы можем полностью нивелировать аппаратные ограничения драйверов Kyocera и добиться стабильного, бесперебойного процесса сканирования документов в любых режимах.