#Область ОписаниеПеременных
&НаКлиенте
Перем НарастающийНомерИзображения;
&НаКлиенте
Перем ПозицияДляВставки;
&НаКлиенте
Перем ПодключаемыйМодуль;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.ТаблицаФайлов.Видимость = Ложь;
Элементы.ФормаПринятьВсеКакОдинФайл.Видимость = Ложь;
Элементы.ФормаПринятьВсеКакОтдельныеФайлы.Видимость = Ложь;
ТипРезультата = Параметры.ТипРезультата;
ВладелецФайла = Параметры.ВладелецФайла;
ТолькоОдинФайл = Параметры.ТолькоОдинФайл;
ЭтоФайл = Параметры.ЭтоФайл;
НеОткрыватьКарточкуПослеСозданияИзФайла = Параметры.НеОткрыватьКарточкуПослеСозданияИзФайла;
ИдентификаторКлиента = Параметры.ИдентификаторКлиента;
НомерФайла = РаботаСФайламиСлужебный.ПолучитьНовыйНомерДляСканирования(ВладелецФайла);
ИмяФайла = РаботаСФайламиСлужебныйКлиентСервер.ИмяСканированногоФайла(НомерФайла, "");
ПрочитатьНастройки();
Элементы.ФормаНастройка.Видимость = Не ПоказыватьДиалогСканера;
Если ЗначениеЗаполнено(Параметры.ПараметрыСканирования) Тогда
ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры.ПараметрыСканирования);
КонецЕсли;
Если СохранятьВPDF Тогда
ФорматКартинки = "PDF";
Иначе
ФорматКартинки = Строка(ФорматСканированногоИзображения);
КонецЕсли;
ФорматJPG = Перечисления.ФорматыСканированногоИзображения.JPG;
ФорматTIF = Перечисления.ФорматыСканированногоИзображения.TIF;
ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление();
ПараметрыЗаданияСканирования = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("КомпонентаСканирования", "ПараметрыЗаданияСканирования", Неопределено);
Элементы.ОшибкаСканирования.Видимость = ПараметрыЗаданияСканирования <> Неопределено;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку") Тогда
МодульОбращенияВТехническуюПоддержкуСлужебный = ОбщегоНазначения.ОбщийМодуль(
"ОбращенияВТехническуюПоддержкуСлужебный");
МодульОбращенияВТехническуюПоддержкуСлужебный.ПриСозданииНаСервере(ЭтотОбъект);
Иначе
Элементы.ГруппаОбращенияВТехническуюПоддержку.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Не ЗначениеЗаполнено(ТипРезультата) Тогда
ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл();
КонецЕсли;
Если Не ПроверкиПриОткрытииВыполнены Тогда
Отказ = Истина;
СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина);
ПодключитьОбработчикОжидания("ПередОткрытием", 0.1, Истина);
КонецЕсли;
ПозицияДляВставки = Неопределено;
УстановитьТекстРекомендации();
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.Сканирование.Форма.НастройкаСканированияНаСеанс") Тогда
Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
РазрешениеПеречисление = ВыбранноеЗначение.Разрешение;
ЦветностьПеречисление = ВыбранноеЗначение.Цветность;
ПоворотПеречисление = ВыбранноеЗначение.Поворот;
РазмерБумагиПеречисление = ВыбранноеЗначение.РазмерБумаги;
ДвустороннееСканирование = ВыбранноеЗначение.ДвустороннееСканирование;
ИспользоватьImageMagickДляПреобразованияВPDF = ВыбранноеЗначение.ИспользоватьImageMagickДляПреобразованияВPDF;
ПоказыватьДиалогСканера = ВыбранноеЗначение.ПоказыватьДиалогСканера;
ФорматСканированногоИзображения = ВыбранноеЗначение.ФорматСканированногоИзображения;
КачествоJPG = ВыбранноеЗначение.КачествоJPG;
СжатиеTIFFПеречисление = ВыбранноеЗначение.СжатиеTIFF;
СохранятьВPDF = ВыбранноеЗначение.СохранятьВPDF;
ФорматХраненияМногостраничный = ВыбранноеЗначение.ФорматХраненияМногостраничный;
ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление();
ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.Сканирование.Форма.ОшибкаСканирования") Тогда
Элементы.ОшибкаСканирования.Видимость = РаботаСФайламиСлужебныйКлиент.БылаОшибкаСканирования();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
УдалитьВременныеФайлы(ТаблицаФайлов);
Если Не РаботаСФайламиСлужебныйКлиент.БылаОшибкаСканирования() Тогда
РаботаСФайламиСлужебныйКлиент.УдалитьОшибкуСканирования(ПодключаемыйМодуль);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура РекомендацииОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
Если НавигационнаяСсылка = "ОткрытьНастройки" Тогда
СтандартнаяОбработка = Ложь;
РаботаСФайламиКлиент.ОткрытьФормуНастройкиСканирования();
ИначеЕсли НавигационнаяСсылка = "Запустить32БитныйКлиент" Тогда
СтандартнаяОбработка = Ложь;
Запустить32БитныйКлиент();
Иначе
Выражение = НСтр("ru = 'Действие для навигационной ссылки не определено.'");
ВызватьИсключение(Выражение, КатегорияОшибки.ОшибкаПереходаПоНавигационнойСсылке);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОписаниеОбращенияВПоддержкуОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку") Тогда
СтандартнаяОбработка = Ложь;
Если НавигационнаяСсылка = "ВопросВПоддержку" Тогда
ОбработчикЗавершения = Новый ОписаниеОповещения(
"ПродолжитьОтправкуВопросаВПоддержку",
ЭтотОбъект);
Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
ПредставлениеОшибки = НСтр("ru='Вызвана помощь из окна сканирования.'");
КонецЕсли;
РаботаСФайламиСлужебныйКлиент.СформироватьИнформациюДляПоддержки(
ПредставлениеОшибки,
ОбработчикЗавершения);
ИначеЕсли НавигационнаяСсылка = "ИнформацияДляОтправкиВПоддержку" Тогда
ОбработчикЗавершения = Новый ОписаниеОповещения(
"ПродолжитьСкачиваниеИнформацииДляОтправкиВПоддержку",
ЭтотОбъект);
Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
ПредставлениеОшибки = НСтр("ru='Вызвана помощь из окна сканирования.'");
КонецЕсли;
РаботаСФайламиСлужебныйКлиент.СформироватьИнформациюДляПоддержки(
ПредставлениеОшибки,
ОбработчикЗавершения);
Иначе
Выражение = НСтр("ru = 'Действие для навигационной ссылки не определено.'");
ВызватьИсключение(Выражение, КатегорияОшибки.ОшибкаПереходаПоНавигационнойСсылке);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаФайлов
&НаКлиенте
Процедура ТаблицаФайловПриАктивизацииСтроки(Элемент)
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
Если Элементы.ТаблицаФайлов.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
НомерТекущейСтроки = Элементы.ТаблицаФайлов.ТекущаяСтрока;
СтрокаТаблицы = Элементы.ТаблицаФайлов.ДанныеСтроки(НомерТекущейСтроки);
Если ПутьКВыбранномуФайлу <> СтрокаТаблицы.ПутьКФайлу Тогда
ПутьКВыбранномуФайлу = СтрокаТаблицы.ПутьКФайлу;
Если ПустаяСтрока(СтрокаТаблицы.АдресКартинки) Тогда
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКВыбранномуФайлу);
СтрокаТаблицы.АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецЕсли;
АдресКартинки = СтрокаТаблицы.АдресКартинки;
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаФайловПередУдалением(Элемент, Отказ)
Если ТаблицаФайлов.Количество() < 2 Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
НомерТекущейСтроки = Элементы.ТаблицаФайлов.ТекущаяСтрока;
СтрокаТаблицы = Элементы.ТаблицаФайлов.ДанныеСтроки(НомерТекущейСтроки);
УдалитьФайлы(СтрокаТаблицы.ПутьКФайлу);
Если ТаблицаФайлов.Количество() = 2 Тогда
Элементы.ТаблицаФайловКонтекстноеМенюУдалить.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Пересканировать(Команда)
УстановитьДоступностьКоманднойПанели(Ложь);
Пересканирование = Истина;
НачатьСканирование();
КонецПроцедуры
&НаКлиенте
Процедура Сохранить(Команда)
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("МассивФайловКопия", Новый Массив);
ПараметрыВыполнения.Вставить("ФайлРезультата", "");
Для Каждого Строка Из ТаблицаФайлов Цикл
ПараметрыВыполнения.МассивФайловКопия.Добавить(Новый Структура("ПутьКФайлу", Строка.ПутьКФайлу));
КонецЦикла;
СтрокаТаблицы = ТаблицаФайлов.Получить(0);
ПутьКФайлуЛокальный = СтрокаТаблицы.ПутьКФайлу;
ТаблицаФайлов.Очистить();
РасширениеРезультата = Строка(ФорматСканированногоИзображения);
РасширениеРезультата = НРег(РасширениеРезультата);
Контекст = Новый Структура;
Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
Контекст.Вставить("ПутьКФайлуЛокальный", ПутьКФайлуЛокальный);
Контекст.Вставить("ДвоичныеДанныеРезультата", "");
Если СохранятьВPDF Тогда
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла("pdf");
#КонецЕсли
ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = ПараметрыВыполнения.ФайлРезультата;
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("СохранитьПослеОбъединения", ЭтотОбъект, Контекст);
РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПутьКФайлуЛокальный),
ПараметрыКонвертацииГрафическогоДокумента);
Иначе
СохранитьПослеОбъединенияЗавершение(Контекст);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Настройка(Команда)
ДвустороннееСканированиеЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
ИмяУстройстваСканирования, "DUPLEX");
ДоступностьДвустороннееСканирование = (ДвустороннееСканированиеЧисло <> -1);
АвтоматическаяПодачаДокументовЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
АвтоматическаяПодачаДокументов, "FEEDER");
ДоступностьАвтоматическаяПодачаДокументов = (АвтоматическаяПодачаДокументовЧисло <> -1);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПоказыватьДиалогСканера", ПоказыватьДиалогСканера);
ПараметрыФормы.Вставить("Разрешение", РазрешениеПеречисление);
ПараметрыФормы.Вставить("Цветность", ЦветностьПеречисление);
ПараметрыФормы.Вставить("Поворот", ПоворотПеречисление);
ПараметрыФормы.Вставить("РазмерБумаги", РазмерБумагиПеречисление);
ПараметрыФормы.Вставить("ДвустороннееСканирование", ДвустороннееСканирование);
ПараметрыФормы.Вставить("АвтоматическаяПодачаДокументов", АвтоматическаяПодачаДокументов);
ПараметрыФормы.Вставить("ИспользоватьImageMagickДляПреобразованияВPDF", ИспользоватьImageMagickДляПреобразованияВPDF);
ПараметрыФормы.Вставить("ДоступностьПоворот", ДоступностьПоворот);
ПараметрыФормы.Вставить("ДоступностьРазмерБумаги", ДоступностьРазмерБумаги);
ПараметрыФормы.Вставить("ДоступностьДвустороннееСканирование", ДоступностьДвустороннееСканирование);
ПараметрыФормы.Вставить("ДоступностьАвтоматическаяПодачаДокументов", ДоступностьАвтоматическаяПодачаДокументов);
ПараметрыФормы.Вставить("ФорматСканированногоИзображения", ФорматСканированногоИзображения);
ПараметрыФормы.Вставить("КачествоJPG", КачествоJPG);
ПараметрыФормы.Вставить("СжатиеTIFF", СжатиеTIFFПеречисление);
ПараметрыФормы.Вставить("СохранятьВPDF", СохранятьВPDF);
ПараметрыФормы.Вставить("ФорматХраненияМногостраничный", ФорматХраненияМногостраничный);
ОткрытьФорму("Обработка.Сканирование.Форма.НастройкаСканированияНаСеанс", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура СохранитьВсеКакОдинФайл(Команда)
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("МассивФайловКопия", Новый Массив);
ПараметрыВыполнения.Вставить("ФайлРезультата", "");
Для Каждого Строка Из ТаблицаФайлов Цикл
ПараметрыВыполнения.МассивФайловКопия.Добавить(Новый Структура("ПутьКФайлу", Строка.ПутьКФайлу));
КонецЦикла;
ТаблицаФайлов.Очистить();
ПутиКФайлам = Новый Массив;
Для Каждого Строка Из ПараметрыВыполнения.МассивФайловКопия Цикл
ПутиКФайлам.Добавить(Строка.ПутьКФайлу);
КонецЦикла;
ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = ПараметрыВыполнения.ФайлРезультата;
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
КонецЕсли;
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
РасширениеРезультата = Строка(ФорматХраненияМногостраничный);
РасширениеРезультата = НРег(РасширениеРезультата);
ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла(РасширениеРезультата);
ПараметрыКонвертацииГрафическогоДокумента.ФорматРезультата = РасширениеРезультата;
#КонецЕсли
Контекст = Новый Структура;
Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
Контекст.Вставить("ДвоичныеДанныеРезультата", "");
Оповещение = Новый ОписаниеОповещения("СохранитьВсеКакОдинФайлЗавершение", ЭтотОбъект, Контекст);
РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ПутиКФайлам, ПараметрыКонвертацииГрафическогоДокумента);
КонецПроцедуры
&НаКлиенте
Процедура СохранитьВсеКакОтдельныеФайлы(Команда)
МассивФайловКопия = Новый Массив;
Для Каждого Строка Из ТаблицаФайлов Цикл
МассивФайловКопия.Добавить(Новый Структура("ПутьКФайлу", Строка.ПутьКФайлу));
КонецЦикла;
ТаблицаФайлов.Очистить();
Если СохранятьВPDF Тогда
РасширениеРезультата = "pdf";
Иначе
РасширениеРезультата = Строка(ФорматСканированногоИзображения);
РасширениеРезультата = НРег(РасширениеРезультата);
КонецЕсли;
ПараметрыДобавления = Новый Структура;
ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла);
ПараметрыДобавления.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыДобавления.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект);
ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина);
ПараметрыДобавления.Вставить("ПолноеИмяФайла", "");
ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", "");
ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл);
Контекст = Новый Структура;
Контекст.Вставить("РасширениеРезультата", РасширениеРезультата);
Контекст.Вставить("ПараметрыДобавления", ПараметрыДобавления);
Контекст.Вставить("ОтсканированныеФайлы", Новый Массив);
Контекст.Вставить("ПолныйТекстВсехОшибок", "");
Контекст.Вставить("КоличествоОшибок", 0);
Контекст.Вставить("МассивФайлов", МассивФайловКопия);
Контекст.Вставить("ИндексФайла", 0);
СохранитьКакОтдельныеФайлыРекурсивно(Контекст);
КонецПроцедуры
&НаКлиенте
Процедура Сканировать(Команда)
ПозицияДляВставки = Неопределено;
УстановитьДоступностьКоманднойПанели(Ложь);
НачатьСканирование();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ПродолжитьОтправкуВопросаВПоддержку(Результат, ДополнительныеПараметры) Экспорт
МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
"ОбращенияВТехническуюПоддержкуСлужебныйКлиент");
ПараметрыОбращения = МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент.ПараметрыОбращения();
ПараметрыОбращения.ТехнологическаяИнформация = Результат.ТехнологическаяИнформация;
ПараметрыОбращения.ДополнительныеФайлы = Результат.ДополнительныеФайлы;
ПараметрыОбращения.Тема = НСтр("ru = 'Проблема при сканировании файла'");
МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент.ОтправитьВопросВПоддержку(
ЭтотОбъект,
ПараметрыОбращения);
КонецПроцедуры
&НаКлиенте
Процедура ПродолжитьСкачиваниеИнформацииДляОтправкиВПоддержку(Результат, ДополнительныеПараметры) Экспорт
МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
"ОбращенияВТехническуюПоддержкуСлужебныйКлиент");
ПараметрыОбращения = МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент.ПараметрыОбращения();
ПараметрыОбращения.ТехнологическаяИнформация = Результат.ТехнологическаяИнформация;
ПараметрыОбращения.ДополнительныеФайлы = Результат.ДополнительныеФайлы;
МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент.СкачатьИнформациюДляОтправкиВПоддержку(
ЭтотОбъект,
ПараметрыОбращения);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьТекстРекомендации()
Рекомендации = Новый Массив;
Шаблон = НСтр("ru = 'Сканирование выполняется с помощью %1.'");
Рекомендация = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, ИмяУстройстваСканирования);
Рекомендации.Добавить(Рекомендация);
Рекомендации.Добавить("");
Рекомендации.Добавить(НСтр("ru = 'Попробуйте следующие варианты:'"));
Рекомендации.Добавить(" • " + НСтр("ru = 'Проверьте подключение сканера и повторите попытку сканирования.'"));
Шаблон = " • " + НСтр("ru = 'Укажите в <a href = ""%1"">настройках сканирования</a> доступный сканер.'");
Рекомендация = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, "ОткрытьНастройки");
Рекомендации.Добавить(Рекомендация);
Если Не ПоказыватьДиалогСканера И Не ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() Тогда
Рекомендация = " • " + НСтр("ru = 'Смените способ задания настроек на <b>Расширенные в диалоге сканера</b>.'");
Рекомендации.Добавить(Рекомендация);
КонецЕсли;
РазрешениеИзображения = ПредопределенноеЗначение("Перечисление.РазрешенияСканированногоИзображения.dpi1200");
Если ПоказыватьДиалогСканера Или РазрешениеПеречисление = РазрешениеИзображения Тогда
Рекомендации.Добавить(" • " + НСтр("ru = 'Снизьте разрешение сканирования до <b>600 dpi</b>.'"));
КонецЕсли;
СистемнаяИнформация = Новый СистемнаяИнформация();
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
Шаблон = " • " + НСтр(
"ru = 'Установите и запустите <a href = ""%1"">тонкий клиент 1С:Предприятия для Windows (32-bit)</a>,
| в котором доступно больше устройств и настроек сканирования.'");
Рекомендация = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, "Запустить32БитныйКлиент");
Рекомендации.Добавить(Рекомендация);
КонецЕсли;
Элементы.Рекомендации.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока(
СтрСоединить(Рекомендации, Символы.ПС));
КонецПроцедуры
&НаКлиенте
Процедура Запустить32БитныйКлиент()
#Если Не ВебКлиент Тогда
КаталогПрограммы32 = СтрЗаменить(КаталогПрограммы(), "\Program Files\", "\Program Files (x86)\");
ИмяПриложения = КаталогПрограммы32 + "1cv8.exe";
ФайлПриложения = Новый Файл(ИмяПриложения);
Если ФайлПриложения.Существует() Тогда
ФайловаяСистемаКлиент.ЗапуститьПрограмму(ИмяПриложения);
Иначе
СистемнаяИнформация = Новый СистемнаяИнформация();
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(
"https://releases.1c.ru/version_files?nick=Platform83&ver=" + СистемнаяИнформация.ВерсияПриложения);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПередОткрытием()
СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ТекущийШаг", 1);
ПараметрыОткрытия.Вставить("ПоказыватьДиалог", Неопределено);
ПараметрыОткрытия.Вставить("ВыбранноеУстройство", Неопределено);
ПодготовкаКСканированию(Неопределено, ПараметрыОткрытия);
КонецПроцедуры
&НаКлиенте
Процедура ПодготовкаКСканированию(Результат, ПараметрыОткрытия) Экспорт
Если ПараметрыОткрытия.ТекущийШаг = 2 Тогда
ПовторноеСканирование = Неопределено;
Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("ПовторноеСканирование", ПовторноеСканирование)
И ПовторноеСканирование = Истина Тогда
ПрочитатьНастройки();
ПараметрыОткрытия.ВыбранноеУстройство = ИмяУстройстваСканирования;
КонецЕсли;
ПараметрыОткрытия.ТекущийШаг = 3;
КонецЕсли;
Если ПараметрыОткрытия.ТекущийШаг = 1 Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ПодготовкаКСканированиюПослеИнициализации", ЭтотОбъект, ПараметрыОткрытия);
РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту(ОписаниеОповещения, Истина);
Возврат;
КонецЕсли;
ПередОткрытиемАвтоматПродолжение(ПараметрыОткрытия);
КонецПроцедуры
&НаКлиенте
Процедура ПодготовкаКСканированиюПослеИнициализации(РезультатПроверкиИнициализации, ПараметрыОткрытия) Экспорт
КомпонентаПроинициализирована = РезультатПроверкиИнициализации.Подключено;
Если Не КомпонентаПроинициализирована Тогда
Возврат;
КонецЕсли;
ПодключаемыйМодуль = РезультатПроверкиИнициализации.ПодключаемыйМодуль;
ОповещениеПродолжения = Новый ОписаниеОповещения("ПодготовкаКСканированиюПослеВключенияЖурнала",
ЭтотОбъект, ПараметрыОткрытия);
РаботаСФайламиСлужебныйКлиент.ВключитьЖурналСканирования(ПодключаемыйМодуль, ОповещениеПродолжения, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПодготовкаКСканированиюПослеВключенияЖурнала(Результат, ПараметрыОткрытия) Экспорт
ПараметрыОткрытия.ТекущийШаг = 2;
ПередОткрытиемАвтоматПродолжение(ПараметрыОткрытия);
КонецПроцедуры
&НаКлиенте
Процедура ПередОткрытиемАвтоматПродолжение(ПараметрыОткрытия)
Если ПараметрыОткрытия.ТекущийШаг = 2 Тогда
ПараметрыОткрытия.ПоказыватьДиалог = ПоказыватьДиалогСканера;
ПараметрыОткрытия.ВыбранноеУстройство = ИмяУстройстваСканирования;
Если ПараметрыОткрытия.ВыбранноеУстройство = "" Тогда
Обработчик = Новый ОписаниеОповещения("ПодготовкаКСканированию", ЭтотОбъект, ПараметрыОткрытия);
ПараметрыОткрытияФормы = Новый Структура("ПовторноеСканирование", Истина);
ОткрытьФорму("Обработка.Сканирование.Форма.НастройкаСканирования", ПараметрыОткрытияФормы , ЭтотОбъект, , , ,
Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
Возврат;
КонецЕсли;
ПараметрыОткрытия.ТекущийШаг = 3;
КонецЕсли;
Если ПараметрыОткрытия.ТекущийШаг = 3 Тогда
Если ПараметрыОткрытия.ВыбранноеУстройство = "" Тогда
Возврат;
КонецЕсли;
ПоворотЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
ПараметрыОткрытия.ВыбранноеУстройство, "ROTATION");
РазмерБумагиЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
ПараметрыОткрытия.ВыбранноеУстройство, "SUPPORTEDSIZES");
ДвустороннееСканированиеЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
ПараметрыОткрытия.ВыбранноеУстройство, "DUPLEX");
АвтоматическаяПодачаДокументовЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
ПараметрыОткрытия.ВыбранноеУстройство, "FEEDER");
ДоступностьПоворот = (ПоворотЧисло <> -1);
ДоступностьРазмерБумаги = (РазмерБумагиЧисло <> -1);
ДоступностьДвустороннееСканирование = (ДвустороннееСканированиеЧисло <> -1);
ДоступностьАвтоматическаяПодачаДокументов = (АвтоматическаяПодачаДокументовЧисло <> -1);
УстановитьДоступностьКоманднойПанели(Ложь);
ПараметрСжатие = ?(ВРег(ФорматКартинки) = "JPG", КачествоJPG, СжатиеTIFF);
Если Не Открыта() Тогда
ПроверкиПриОткрытииВыполнены = Истина;
Открыть();
ПроверкиПриОткрытииВыполнены = Ложь;
КонецЕсли;
НачатьСканирование();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПринятьЗавершение(Результат, ПараметрыВыполнения) Экспорт
УдалитьВременныеФайлы(ПараметрыВыполнения.МассивФайловКопия);
Если НЕ ПустаяСтрока(ПараметрыВыполнения.ФайлРезультата) Тогда
УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
КонецЕсли;
Закрыть(Результат);
КонецПроцедуры
&НаКлиенте
Процедура ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт
УдалитьВременныеФайлы(ПараметрыВыполнения.МассивФайловКопия);
Если ЗначениеЗаполнено(ПараметрыВыполнения.ФайлРезультата) Тогда
УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
КонецЕсли;
Закрыть(Результат);
КонецПроцедуры
&НаСервере
Процедура ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление()
Представление = "";
Если Не ПоказыватьДиалогСканера Тогда
НастройкиСканирования = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыСканирования();
НастройкиСканирования.Разрешение = РазрешениеПеречисление;
НастройкиСканирования.Цветность = ЦветностьПеречисление;
НастройкиСканирования.Поворот = ПоворотПеречисление;
НастройкиСканирования.РазмерБумаги = РазмерБумагиПеречисление;
НастройкиСканирования.СжатиеTIFF = СжатиеTIFFПеречисление;
ПримитивныеНастройкиСканирования = РаботаСФайламиСлужебный.КонвертироватьНастройкиСканирования(НастройкиСканирования);
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПримитивныеНастройкиСканирования,
"Разрешение, Цветность, Поворот, РазмерБумаги, СжатиеTIFF");
Если СохранятьВPDF Тогда
ФорматКартинки = Строка(ФорматСканированногоИзображения);
Представление = Представление + НСтр("ru = 'Сохранить как:'") + " ";
Представление = Представление + "PDF";
Представление = Представление + ". ";
Представление = Представление + НСтр("ru = 'Формат сканирования:'") + " ";
Представление = Представление + ФорматКартинки;
Представление = Представление + ". ";
Иначе
ФорматКартинки = Строка(ФорматСканированногоИзображения);
Представление = Представление + НСтр("ru = 'Сохранить как:'") + " ";
Представление = Представление + ФорматКартинки;
Представление = Представление + ". ";
КонецЕсли;
Если ВРег(ФорматКартинки) = "JPG" Тогда
Представление = Представление + НСтр("ru = 'Качество:'") + " " + Строка(КачествоJPG) + ". ";
КонецЕсли;
Если ВРег(ФорматКартинки) = "TIF" Тогда
Представление = Представление + НСтр("ru = 'Сжатие:'") + " " + Строка(СжатиеTIFFПеречисление) + ". ";
КонецЕсли;
Представление = Представление + НСтр("ru = 'Сохранить как многостраничный:'") + " ";
Представление = Представление + Строка(ФорматХраненияМногостраничный);
Представление = Представление + ". ";
Если Разрешение <> -1 Тогда
Представление = Представление + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Разрешение: %1 dpi. %2.'") + " ",
Строка(Разрешение), Строка(ЦветностьПеречисление));
Иначе
Представление = Представление + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Разрешение: Не задано. Цветность: %2.'") + " ",
Строка(ЦветностьПеречисление));
КонецЕсли;
Если НЕ ПоворотПеречисление.Пустая() Тогда
Представление = Представление + НСтр("ru = 'Поворот:'")+ " " + Строка(ПоворотПеречисление) + ". ";
КонецЕсли;
Если НЕ РазмерБумагиПеречисление.Пустая() Тогда
Представление = Представление + НСтр("ru = 'Размер бумаги:'") + " " + Строка(РазмерБумагиПеречисление) + ". ";
КонецЕсли;
Если ДвустороннееСканирование Тогда
Представление = Представление + НСтр("ru = 'Двустороннее сканирование'") + ". ";
КонецЕсли;
Если АвтоматическаяПодачаДокументов Тогда
Представление = Представление + НСтр("ru = 'Автоподача документов'") + ". ";
КонецЕсли;
Иначе
Если СохранятьВPDF Тогда
ФорматКартинки = Строка(ФорматСканированногоИзображения);
Представление = Представление + НСтр("ru = 'Сохранить как:'") + " ";
Представление = Представление + "PDF";
Представление = Представление + ". ";
КонецЕсли;
Представление = Представление + НСтр("ru = 'Сохранить как многостраничный:'") + " ";
Представление = Представление + Строка(ФорматХраненияМногостраничный);
Представление = Представление + ". ";
Представление = Представление + НСтр("ru = 'Настройки сканирования были установлены в диалоге сканера.'");
КонецЕсли;
ТекстНастроек = Представление;
Элементы.ТекстНастроекИзменить.Заголовок = ТекстНастроек + "Изменить";
КонецПроцедуры
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
Если Источник = "TWAIN" Тогда
РаботаСФайламиСлужебныйКлиент.ЗаписатьЖурналСканирования("СобытиеСканера",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Событие %1, данные %2'"), Событие, Данные));
КонецЕсли;
Если Источник = "TWAIN" И Событие = "ImageAcquired" Тогда
Если Пересканирование Тогда
Если ТаблицаФайлов.Количество() = 1 Тогда
УдалитьВременныеФайлы(ТаблицаФайлов);
ПозицияДляВставки = 0;
ИначеЕсли ТаблицаФайлов.Количество() > 1 Тогда
НомерТекущейСтроки = Элементы.ТаблицаФайлов.ТекущаяСтрока;
СтрокаТаблицы = Элементы.ТаблицаФайлов.ДанныеСтроки(НомерТекущейСтроки);
ПозицияДляВставки = ТаблицаФайлов.Индекс(СтрокаТаблицы);
УдалитьФайлы(СтрокаТаблицы.ПутьКФайлу);
ТаблицаФайлов.Удалить(СтрокаТаблицы);
КонецЕсли;
Если АдресКартинки <> "" Тогда
УдалитьИзВременногоХранилища(АдресКартинки);
КонецЕсли;
АдресКартинки = "";
ПутьКВыбранномуФайлу = "";
Пересканирование = Ложь;
КонецЕсли;
ИмяФайлаКартинки = Данные;
УстановитьДоступностьКоманднойПанели(Истина);
КоличествоСтрокДоДобавления = ТаблицаФайлов.Количество();
СтрокаТаблицы = Неопределено;
Если ПозицияДляВставки = Неопределено Тогда
СтрокаТаблицы = ТаблицаФайлов.Добавить();
Иначе
СтрокаТаблицы = ТаблицаФайлов.Вставить(ПозицияДляВставки);
ПозицияДляВставки = ПозицияДляВставки + 1;
КонецЕсли;
СтрокаТаблицы.ПутьКФайлу = ИмяФайлаКартинки;
Если НарастающийНомерИзображения = Неопределено Тогда
НарастающийНомерИзображения = 1;
КонецЕсли;
СтрокаТаблицы.Представление = НСтр("ru='Изображение'") + Строка(НарастающийНомерИзображения);
НарастающийНомерИзображения = НарастающийНомерИзображения + 1;
Если КоличествоСтрокДоДобавления = 0 Тогда
ПутьКВыбранномуФайлу = СтрокаТаблицы.ПутьКФайлу;
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКВыбранномуФайлу);
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
СтрокаТаблицы.АдресКартинки = АдресКартинки;
КонецЕсли;
Если ТаблицаФайлов.Количество() > 1 И Элементы.ТаблицаФайлов.Видимость = Ложь Тогда
Элементы.ТаблицаФайлов.Видимость = Истина;
Элементы.ФормаПринятьВсеКакОдинФайл.Видимость = Истина;
Элементы.ФормаПринятьВсеКакОдинФайл.КнопкаПоУмолчанию = Истина;
Элементы.ФормаПринятьВсеКакОтдельныеФайлы.Видимость = Не ТолькоОдинФайл;
Элементы.Сохранить.Видимость = Ложь;
КонецЕсли;
Если ТаблицаФайлов.Количество() > 1 Тогда
Элементы.ТаблицаФайловКонтекстноеМенюУдалить.Доступность = Истина;
КонецЕсли;
ИначеЕсли Источник = "TWAIN" И Событие = "EndBatch" Тогда
Если ТаблицаФайлов.Количество() <> 0 Тогда
ИдентификаторСтроки = ТаблицаФайлов[ТаблицаФайлов.Количество() - 1].ПолучитьИдентификатор();
Элементы.ТаблицаФайлов.ТекущаяСтрока = ИдентификаторСтроки;
КонецЕсли;
Контекст = Новый Структура;
Контекст.Вставить("ЗакрытьФорму", Ложь);
ОповещениеЗавершения = Новый ОписаниеОповещения("ПослеУдаленияОшибки", ЭтотОбъект, Контекст);
РаботаСФайламиСлужебныйКлиент.УдалитьОшибкуСканирования(ПодключаемыйМодуль, ОповещениеЗавершения, Ложь);
ИначеЕсли Источник = "TWAIN" И Событие = "UserPressedCancel" Тогда
Если Открыта() Тогда
ТекущаяДата = ТекущаяДата();
Если ТекущаяДата < НачалоСканирования + 3 И ТаблицаФайлов.Количество() = 0 Тогда
ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Сканирование отменено (событие %1) через %2 сек. См. %3'"), Событие,
ТекущаяДата - НачалоСканирования, "ImageScan.log");
РаботаСФайламиСлужебныйКлиент.ЗаписатьЖурналСканирования("СобытиеСканера" + "." + Событие,
ПредставлениеОшибки, Истина);
Иначе
Контекст = Новый Структура;
Контекст.Вставить("ЗакрытьФорму", ТаблицаФайлов.Количество() = 0);
Если ТаблицаФайлов.Количество() <> 0 Тогда
СтрокаТаблицы = ТаблицаФайлов[ТаблицаФайлов.Количество() - 1];
ПутьКВыбранномуФайлу = СтрокаТаблицы.ПутьКФайлу;
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКВыбранномуФайлу);
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
СтрокаТаблицы.АдресКартинки = АдресКартинки;
КонецЕсли;
ОповещениеЗавершения = Новый ОписаниеОповещения("ПослеУдаленияОшибки", ЭтотОбъект, Контекст);
РаботаСФайламиСлужебныйКлиент.УдалитьОшибкуСканирования(ПодключаемыйМодуль, ОповещениеЗавершения, Ложь);
КонецЕсли;
КонецЕсли;
Элементы.ОшибкаСканирования.Видимость = РаботаСФайламиСлужебныйКлиент.БылаОшибкаСканирования();
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПослеУдаленияОшибки(Результат, Контекст) Экспорт
Если Контекст.ЗакрытьФорму Тогда
Закрыть();
Иначе
УстановитьДоступностьКоманднойПанели(Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьВременныеФайлы(ТаблицаЗначенийФайлов)
Для Каждого Строка Из ТаблицаЗначенийФайлов Цикл
УдалитьФайлы(Строка.ПутьКФайлу);
КонецЦикла;
ТаблицаЗначенийФайлов.Очистить();
ПозицияДляВставки = Неопределено;
КонецПроцедуры
&НаКлиенте
Функция ТекстСообщенияОшибкиПреобразованияВPDF(ФайлРезультата)
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не существует ""%1"".
|Проверьте, что установлено приложение ImageMagick и указан правильный путь к нему в настройках сканирования.'"),
ФайлРезультата);
Возврат ТекстСообщения;
КонецФункции
&НаСервере
Процедура ПрочитатьНастройки()
НастройкиСканированияПользователя = РаботаСФайлами.ПолучитьНастройкиСканированияПользователя(ИдентификаторКлиента);
ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиСканированияПользователя);
РазрешениеПеречисление = НастройкиСканированияПользователя.Разрешение;
ЦветностьПеречисление = НастройкиСканированияПользователя.Цветность;
ПоворотПеречисление = НастройкиСканированияПользователя.Поворот;
СжатиеTIFFПеречисление = НастройкиСканированияПользователя.СжатиеTIFF;
ИмяУстройстваСканирования = НастройкиСканированияПользователя.ИмяУстройства;
РазмерБумагиПеречисление = НастройкиСканированияПользователя.РазмерБумаги;
ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление();
КонецПроцедуры
&НаКлиенте
Процедура СохранитьПослеОбъединенияЗавершение(Контекст)
ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
ПутьКФайлуЛокальный = Контекст.ПутьКФайлуЛокальный;
Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
Результат.ДвоичныеДанные = ?(ЗначениеЗаполнено(Контекст.ДвоичныеДанныеРезультата),
Контекст.ДвоичныеДанныеРезультата, Новый ДвоичныеДанные(Контекст.ПутьКФайлуЛокальный));
ПринятьЗавершение(Результат, ПараметрыВыполнения);
Возврат;
ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
Результат.ИмяФайла = Контекст.ПутьКФайлуЛокальный;
Для ИндексФайла = -ПараметрыВыполнения.МассивФайловКопия.ВГраница() По 0 Цикл
Если ПараметрыВыполнения.МассивФайловКопия[-ИндексФайла].ПутьКФайлу = Контекст.ПутьКФайлуЛокальный Тогда
ПараметрыВыполнения.МассивФайловКопия.Удалить(-ИндексФайла);
КонецЕсли;
КонецЦикла;
ПараметрыВыполнения.ФайлРезультата = "";
ПринятьЗавершение(Результат, ПараметрыВыполнения);
Возврат;
Иначе
Если НЕ ПустаяСтрока(ПутьКФайлуЛокальный) Тогда
Обработчик = Новый ОписаниеОповещения("ПринятьЗавершение", ЭтотОбъект, ПараметрыВыполнения);
ПараметрыДобавления = Новый Структура;
ПараметрыДобавления.Вставить("ОбработчикРезультата", Обработчик);
ПараметрыДобавления.Вставить("ПолноеИмяФайла", ПутьКФайлуЛокальный);
ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла);
ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект);
ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", ИмяФайла);
ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточкуПослеСозданияИзФайла);
ПараметрыДобавления.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл);
РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления);
Возврат;
КонецЕсли;
КонецЕсли;
Результат.ТекстОшибки = НСтр("ru = 'Не удалось сохранить отсканированный файл.'");
ПринятьЗавершение(Результат, ПараметрыВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура СохранитьПослеОбъединения(РезультатОбъединения, Контекст) Экспорт
Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
Если РезультатОбъединения.Успешно = Ложь Тогда
ТекстСообщения = РезультатОбъединения.ОписаниеОшибки;
ПоказатьПредупреждение(, ТекстСообщения);
УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
Результат.ТекстОшибки = ТекстСообщения;
ПринятьЗавершение(Результат, ПараметрыВыполнения);
Возврат;
КонецЕсли;
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
Результат.ИмяФайла = РезультатОбъединения.ИмяФайлаРезультата;
Иначе
ОбъектФайлРезультата = Новый Файл(ПараметрыВыполнения.ФайлРезультата);
Если НЕ ОбъектФайлРезультата.Существует() Тогда
ТекстСообщения = ТекстСообщенияОшибкиПреобразованияВPDF(ПараметрыВыполнения.ФайлРезультата);
ПоказатьПредупреждение(, ТекстСообщения);
УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
Результат.ТекстОшибки = ТекстСообщения;
ПринятьЗавершение(Результат, ПараметрыВыполнения);
Возврат;
КонецЕсли;
УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
Контекст.ПутьКФайлуЛокальный = ПараметрыВыполнения.ФайлРезультата;
КонецЕсли;
СохранитьПослеОбъединенияЗавершение(Контекст);
КонецПроцедуры
&НаКлиенте
Процедура СохранитьВсеКакОдинФайлЗавершение(РезультатОбъединения, Контекст) Экспорт
Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
ПараметрыВыполнения.ФайлРезультата = РезультатОбъединения.ИмяФайлаРезультата;
Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
Если РезультатОбъединения.Успешно = Ложь Тогда
ТекстСообщения = РезультатОбъединения.ОписаниеОшибки;
Если ЗначениеЗаполнено(ПараметрыВыполнения.ФайлРезультата) Тогда
УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
КонецЕсли;
ПараметрыВыполнения.ФайлРезультата = "";
Результат.ТекстОшибки = ТекстСообщения;
ПоказатьПредупреждение(, ТекстСообщения);
ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
Возврат;
КонецЕсли;
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
Результат.ИмяФайла = ПараметрыВыполнения.ФайлРезультата;
Иначе
ОбъектФайлРезультата = Новый Файл(ПараметрыВыполнения.ФайлРезультата);
Если НЕ ОбъектФайлРезультата.Существует() Тогда
ТекстСообщения = ТекстСообщенияОшибкиПреобразованияВPDF(ПараметрыВыполнения.ФайлРезультата);
УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
ПараметрыВыполнения.ФайлРезультата = "";
Результат.ТекстОшибки = ТекстСообщения;
ПоказатьПредупреждение(, ТекстСообщения);
ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
Возврат;
КонецЕсли;
Если НЕ ПустаяСтрока(ПараметрыВыполнения.ФайлРезультата) Тогда
Обработчик = Новый ОписаниеОповещения("ПринятьВсеКакОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения);
ПараметрыДобавления = Новый Структура;
ПараметрыДобавления.Вставить("ОбработчикРезультата", Обработчик);
ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла);
ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект);
ПараметрыДобавления.Вставить("ПолноеИмяФайла", ПараметрыВыполнения.ФайлРезультата);
ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", ИмяФайла);
ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточкуПослеСозданияИзФайла);
ПараметрыДобавления.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
ПараметрыДобавления.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл);
РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления);
Возврат;
КонецЕсли;
КонецЕсли;
ПараметрыВыполнения.ФайлРезультата = "";
ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивно(Контекст)
РасширениеРезультата = Контекст.РасширениеРезультата;
ПараметрыДобавления = Контекст.ПараметрыДобавления;
ОтсканированныеФайлы = Контекст.ОтсканированныеФайлы;
Если Контекст.ИндексФайла <= Контекст.МассивФайлов.ВГраница() Тогда
Строка = Контекст.МассивФайлов[Контекст.ИндексФайла];
ПутьКФайлуЛокальный = Строка.ПутьКФайлу;
Контекст.Вставить("ПутьКФайлуЛокальный", ПутьКФайлуЛокальный);
Контекст.Вставить("ФайлРезультата", "");
Контекст.Вставить("ДвоичныеДанныеРезультата", "");
Если РасширениеРезультата = "pdf" Тогда
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
Контекст.ФайлРезультата = ПолучитьИмяВременногоФайла("pdf");
#КонецЕсли
ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = Контекст.ФайлРезультата;
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноПослеОбъединения", ЭтотОбъект, Контекст);
РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПутьКФайлуЛокальный),
ПараметрыКонвертацииГрафическогоДокумента);
Иначе
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
Контекст.ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(Контекст.ПутьКФайлуЛокальный);
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноЗавершение", ЭтотОбъект, Контекст);
ВыполнитьОбработкуОповещения(Оповещение);
КонецЕсли;
Иначе
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
РаботаСФайламиСлужебныйВызовСервера.ЗанестиМаксимальныйНомерДляСканирования(
ВладелецФайла, НомерФайла - 1);
КонецЕсли;
УдалитьВременныеФайлы(Контекст.МассивФайлов);
Если Контекст.КоличествоОшибок > 0 Тогда
Если Контекст.КоличествоОшибок = 1 Тогда
ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось сохранить файл по причине:
|%1'"),
Контекст.ПолныйТекстВсехОшибок);
Иначе
ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось сохранить некоторые файлы (%1):
|%2'"),
Строка(Контекст.КоличествоОшибок), Контекст.ПолныйТекстВсехОшибок);
КонецЕсли;
СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено, ТекстПредупреждения, РежимДиалогаВопрос.ОК);
КонецЕсли;
Закрыть(ОтсканированныеФайлы);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивноЗавершение(РезультатОповещения, Контекст) Экспорт
Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
Контекст.ОтсканированныеФайлы.Добавить(Результат);
ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
Результат.ИмяФайла = Контекст.ФайлРезультата;
Контекст.ОтсканированныеФайлы.Добавить(Результат);
Иначе
Если НЕ ПустаяСтрока(Контекст.ПутьКФайлуЛокальный) Тогда
Контекст.ПараметрыДобавления.ПолноеИмяФайла = Контекст.ПутьКФайлуЛокальный;
Контекст.ПараметрыДобавления.ИмяСоздаваемогоФайла = ИмяФайла;
Результат = РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширениемСинхронно(Контекст.ПараметрыДобавления);
Если Не Результат.ФайлДобавлен Тогда
Если ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда
ПоказатьПредупреждение(, Результат.ТекстОшибки);
Возврат;
КонецЕсли;
Иначе
Контекст.ОтсканированныеФайлы.Добавить(Результат);
КонецЕсли;
КонецЕсли;
Если НЕ ПустаяСтрока(Контекст.ФайлРезультата) Тогда
УдалитьФайлы(Контекст.ФайлРезультата);
КонецЕсли;
КонецЕсли;
НомерФайла = НомерФайла + 1;
ИмяФайла = РаботаСФайламиСлужебныйКлиентСервер.ИмяСканированногоФайла(НомерФайла, "");
Контекст.ИндексФайла = Контекст.ИндексФайла + 1;
СохранитьКакОтдельныеФайлыРекурсивно(Контекст);
КонецПроцедуры
&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивноПослеОбъединения(РезультатОбъединения, Контекст) Экспорт
Контекст.ФайлРезультата = РезультатОбъединения.ИмяФайлаРезультата;
Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
Если РезультатОбъединения.Успешно = Ложь Тогда
ТекстОшибки = РезультатОбъединения.ОписаниеОшибки;
Если Контекст.ПолныйТекстВсехОшибок <> "" Тогда
Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + Символы.ПС + Символы.ПС + "---" + Символы.ПС + Символы.ПС;
КонецЕсли;
Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + ТекстОшибки;
Контекст.КоличествоОшибок = Контекст.КоличествоОшибок + 1;
Контекст.ФайлРезультата = "";
КонецЕсли;
Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
ОбъектФайлРезультата = Новый Файл(Контекст.ФайлРезультата);
Если НЕ ОбъектФайлРезультата.Существует() Тогда
ТекстОшибки = ТекстСообщенияОшибкиПреобразованияВPDF(Контекст.ФайлРезультата);
Если Контекст.ПолныйТекстВсехОшибок <> "" Тогда
Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + Символы.ПС + Символы.ПС + "---" + Символы.ПС + Символы.ПС;
КонецЕсли;
Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + ТекстОшибки;
Контекст.КоличествоОшибок = Контекст.КоличествоОшибок + 1;
Контекст.ФайлРезультата = "";
КонецЕсли;
Контекст.ПутьКФайлуЛокальный = Контекст.ФайлРезультата;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноЗавершение", ЭтотОбъект, Контекст);
ВыполнитьОбработкуОповещения(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура НачатьСканированиеПослеПолученияКомпоненты(РезультатИнициализации, Контекст) Экспорт
Если РезультатИнициализации.Подключено Тогда
ПодключаемыйМодуль = РезультатИнициализации.ПодключаемыйМодуль;
НачатьСканирование();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НачатьСканирование()
Если ПодключаемыйМодуль = Неопределено Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("НачатьСканированиеПослеПолученияКомпоненты", ЭтотОбъект);
РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту(ОписаниеОповещения, Истина);
Возврат;
КонецЕсли;
ПодключитьОбработчикОжидания("НачатьНепосредственноеСканирование", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура НачатьНепосредственноеСканирование()
ПараметрыСканирования = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыСканирования();
ПараметрыСканирования.ПоказыватьДиалог = ПоказыватьДиалогСканера;
ПараметрыСканирования.ВыбранноеУстройство = ИмяУстройстваСканирования;
ПараметрыСканирования.ФорматКартинки = ФорматКартинки;
ПараметрыСканирования.Разрешение = Разрешение;
ПараметрыСканирования.Цветность = Цветность;
ПараметрыСканирования.Поворот = Поворот;
ПараметрыСканирования.РазмерБумаги = РазмерБумаги;
ПараметрыСканирования.КачествоJPG = КачествоJPG;
ПараметрыСканирования.СжатиеTIFF = СжатиеTIFF;
ПараметрыСканирования.ДвустороннееСканирование = ДвустороннееСканирование;
ПараметрыСканирования.АвтоматическаяПодачаДокументов = АвтоматическаяПодачаДокументов;
НачалоСканирования = ТекущаяДата();
ПараметрыЗаданияСканирования = Новый Структура();
ПараметрыЗаданияСканирования.Вставить("НачалоСканирования", НачалоСканирования);
ПараметрыЗаданияСканирования.Вставить("ПараметрыСканирования", ПараметрыСканирования);
#Если Не ВебКлиент Тогда
АдресКартинки = ПоместитьВоВременноеХранилище(БиблиотекаКартинок.ДлительнаяОперация48.ПолучитьДвоичныеДанные(),
УникальныйИдентификатор);
#КонецЕсли
ОбщегоНазначенияКлиент.ХранилищеОбщихНастроекСохранить("КомпонентаСканирования", "ПараметрыЗаданияСканирования",
ПараметрыЗаданияСканирования,,,Истина);
РаботаСФайламиСлужебныйКлиент.НачатьСканирование(ЭтотОбъект, ПодключаемыйМодуль, ПараметрыСканирования);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияФормыОшибки(РезультатЗакрытия, Контекст) Экспорт
Если РезультатЗакрытия = "ПовторитьСканирование" Тогда
ПрочитатьНастройки();
Пересканировать(Неопределено);
ИначеЕсли РезультатЗакрытия = КодВозвратаДиалога.Отмена И Не Контекст.РежимТребуетсяПомощь Тогда
Если Открыта() Тогда
Закрыть();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеПолученияТехническойИнформации(Результат, Контекст) Экспорт
Элементы.ОшибкаСканирования.Видимость = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКоманднойПанели(Доступность)
Элементы.ФормаКоманднаяПанель.Доступность = Доступность;
КонецПроцедуры
#КонецОбласти