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

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем НарастающийНомерИзображения;

&НаКлиенте
Перем ПозицияДляВставки;

&НаКлиенте
Перем ПодключаемыйМодуль;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Элементы.ТаблицаФайлов.Видимость = Ложь;
	Элементы.ФормаПринятьВсеКакОдинФайл.Видимость = Ложь;
	Элементы.ФормаПринятьВсеКакОтдельныеФайлы.Видимость = Ложь;
	
	ТипРезультата = Параметры.ТипРезультата;
	ВладелецФайла = Параметры.ВладелецФайла;
	ТолькоОдинФайл = Параметры.ТолькоОдинФайл;
	ЭтоФайл = Параметры.ЭтоФайл;
	НеОткрыватьКарточкуПослеСозданияИзФайла = Параметры.НеОткрыватьКарточкуПослеСозданияИзФайла;
	
	ИдентификаторКлиента = Параметры.ИдентификаторКлиента;
	
	НомерФайла = РаботаСФайламиСлужебный.ПолучитьНовыйНомерДляСканирования(ВладелецФайла);
	ИмяФайла = РаботаСФайламиСлужебныйКлиентСервер.ИмяСканированногоФайла(НомерФайла, "");

	ПрочитатьНастройки();
	
	Элементы.ФормаНастройка.Видимость = Не ПоказыватьДиалогСканера;
	
	Если ЗначениеЗаполнено(Параметры.ПараметрыСканирования) Тогда
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры.ПараметрыСканирования);
	КонецЕсли;
	
	Если СохранятьВ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"); // АПК:441 Удаление временного файла см. ПринятьЗавершение.
#КонецЕсли
		
		ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
		ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = ПараметрыВыполнения.ФайлРезультата;
		Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
			ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
		ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
			ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
		КонецЕсли;
		Оповещение = Новый ОписаниеОповещения("СохранитьПослеОбъединения", ЭтотОбъект, Контекст); 
		РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПутьКФайлуЛокальный), 
			ПараметрыКонвертацииГрафическогоДокумента);
	Иначе
		СохранитьПослеОбъединенияЗавершение(Контекст);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Настройка(Команда)
	
	ДвустороннееСканированиеЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
		ИмяУстройстваСканирования, "DUPLEX");
	ДоступностьДвустороннееСканирование = (ДвустороннееСканированиеЧисло <> -1);
	
	АвтоматическаяПодачаДокументовЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
		АвтоматическаяПодачаДокументов, "FEEDER");
	ДоступностьАвтоматическаяПодачаДокументов = (АвтоматическаяПодачаДокументовЧисло <> -1);

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПоказыватьДиалогСканера",  ПоказыватьДиалогСканера);
	ПараметрыФормы.Вставить("Разрешение",               РазрешениеПеречисление);
	ПараметрыФормы.Вставить("Цветность",                ЦветностьПеречисление);
	ПараметрыФормы.Вставить("Поворот",                  ПоворотПеречисление);
	ПараметрыФормы.Вставить("РазмерБумаги",             РазмерБумагиПеречисление);
	ПараметрыФормы.Вставить("ДвустороннееСканирование", ДвустороннееСканирование);
	ПараметрыФормы.Вставить("АвтоматическаяПодачаДокументов", АвтоматическаяПодачаДокументов);
	
	ПараметрыФормы.Вставить("ИспользоватьImageMagickДляПреобразованияВPDF", ИспользоватьImageMagickДляПреобразованияВPDF);
	
	ПараметрыФормы.Вставить("ДоступностьПоворот",       ДоступностьПоворот);
	ПараметрыФормы.Вставить("ДоступностьРазмерБумаги",  ДоступностьРазмерБумаги);
	ПараметрыФормы.Вставить("ДоступностьДвустороннееСканирование", ДоступностьДвустороннееСканирование);
	ПараметрыФормы.Вставить("ДоступностьАвтоматическаяПодачаДокументов", ДоступностьАвтоматическаяПодачаДокументов);
	
	ПараметрыФормы.Вставить("ФорматСканированногоИзображения",     ФорматСканированногоИзображения);
	ПараметрыФормы.Вставить("КачествоJPG",                         КачествоJPG);
	ПараметрыФормы.Вставить("СжатиеTIFF",                          СжатиеTIFFПеречисление);
	ПараметрыФормы.Вставить("СохранятьВPDF",        СохранятьВPDF);
	ПараметрыФормы.Вставить("ФорматХраненияМногостраничный",       ФорматХраненияМногостраничный);
	
	ОткрытьФорму("Обработка.Сканирование.Форма.НастройкаСканированияНаСеанс", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВсеКакОдинФайл(Команда)
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("МассивФайловКопия", Новый Массив);
	ПараметрыВыполнения.Вставить("ФайлРезультата", "");
	
	Для Каждого Строка Из ТаблицаФайлов Цикл
		ПараметрыВыполнения.МассивФайловКопия.Добавить(Новый Структура("ПутьКФайлу", Строка.ПутьКФайлу));
	КонецЦикла;
	
	ТаблицаФайлов.Очистить(); // Чтобы не удалились файлы в ПриЗакрытии.
	
	// Здесь работаем со всеми картинками - объединяем их в один многостраничный файл.
	
	ПутиКФайлам = Новый Массив;
	
	Для Каждого Строка Из ПараметрыВыполнения.МассивФайловКопия Цикл
		ПутиКФайлам.Добавить(Строка.ПутьКФайлу);
	КонецЦикла;
	
	ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
	ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = ПараметрыВыполнения.ФайлРезультата;
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
		ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
	ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
		ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
	КонецЕсли;	
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
	РасширениеРезультата = Строка(ФорматХраненияМногостраничный);
	РасширениеРезультата = НРег(РасширениеРезультата); 
	ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла(РасширениеРезультата); // АПК:441 Удаление временного файла см. ПринятьВсеКакОдинФайлЗавершение
	ПараметрыКонвертацииГрафическогоДокумента.ФорматРезультата = РасширениеРезультата;
#КонецЕсли
		
	Контекст = Новый Структура;
	Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
	Контекст.Вставить("ДвоичныеДанныеРезультата", "");
	
	Оповещение = Новый ОписаниеОповещения("СохранитьВсеКакОдинФайлЗавершение", ЭтотОбъект, Контекст); 
	
	РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ПутиКФайлам, ПараметрыКонвертацииГрафическогоДокумента);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВсеКакОтдельныеФайлы(Команда)
	
	МассивФайловКопия = Новый Массив;
	Для Каждого Строка Из ТаблицаФайлов Цикл
		МассивФайловКопия.Добавить(Новый Структура("ПутьКФайлу", Строка.ПутьКФайлу));
	КонецЦикла;
	
	ТаблицаФайлов.Очистить(); // Чтобы не удалились файлы в ПриЗакрытии.
	
	Если СохранятьВ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);
		
		Если Не Открыта() Тогда
			ПроверкиПриОткрытииВыполнены = Истина;
			Открыть();
			ПроверкиПриОткрытииВыполнены = Ложь;
		КонецЕсли;

		НачатьСканирование();	
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПринятьЗавершение(Результат, ПараметрыВыполнения) Экспорт
	
	УдалитьВременныеФайлы(ПараметрыВыполнения.МассивФайловКопия);
	Если НЕ ПустаяСтрока(ПараметрыВыполнения.ФайлРезультата) Тогда
		УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
	КонецЕсли;
	
	Закрыть(Результат);
	
КонецПроцедуры

&НаКлиенте
Процедура ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт
	
	УдалитьВременныеФайлы(ПараметрыВыполнения.МассивФайловКопия);
	Если ЗначениеЗаполнено(ПараметрыВыполнения.ФайлРезультата) Тогда
		УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
	КонецЕсли;
	
	Закрыть(Результат);
	
КонецПроцедуры

&НаСервере
Процедура ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление()
	
	Представление = "";
		// Информационная надпись вида:
		// "Формат хранения: PDF. Формат сканирования: JPG. Качество: 75. Формат хранения многостраничный: PDF. Разрешение:
		// 200. Цветное";
	
	Если Не ПоказыватьДиалогСканера Тогда
	
		НастройкиСканирования = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыСканирования();
		НастройкиСканирования.Разрешение 	= РазрешениеПеречисление;
		НастройкиСканирования.Цветность		= ЦветностьПеречисление;
		НастройкиСканирования.Поворот		= ПоворотПеречисление;
		НастройкиСканирования.РазмерБумаги	= РазмерБумагиПеречисление;
		НастройкиСканирования.Сжатие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" Тогда
		Если Открыта() Тогда
			ТекущаяДата = ТекущаяДата(); // АПК:143 ТекущаяДата для расчета интервала времени
			Если ТекущаяДата < НачалоСканирования + 3 И ТаблицаФайлов.Количество() = 0 Тогда
				ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru='Сканирование отменено (событие %1) через %2 сек. См. %3'"), Событие, 
					ТекущаяДата - НачалоСканирования, "ImageScan.log");
				РаботаСФайламиСлужебныйКлиент.ЗаписатьЖурналСканирования("СобытиеСканера" + "." + Событие, 
					ПредставлениеОшибки, Истина);
			Иначе
				Контекст = Новый Структура;
				Контекст.Вставить("ЗакрытьФорму", ТаблицаФайлов.Количество() = 0);
				Если ТаблицаФайлов.Количество() <> 0 Тогда
					СтрокаТаблицы = ТаблицаФайлов[ТаблицаФайлов.Количество() - 1];
					ПутьКВыбранномуФайлу = СтрокаТаблицы.ПутьКФайлу;
					ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКВыбранномуФайлу);
					АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
					СтрокаТаблицы.АдресКартинки = АдресКартинки;
				КонецЕсли;
				ОповещениеЗавершения = Новый ОписаниеОповещения("ПослеУдаленияОшибки", ЭтотОбъект, Контекст);
				РаботаСФайламиСлужебныйКлиент.УдалитьОшибкуСканирования(ПодключаемыйМодуль, ОповещениеЗавершения, Ложь);
			КонецЕсли;
		КонецЕсли;
		Элементы.ОшибкаСканирования.Видимость = РаботаСФайламиСлужебныйКлиент.БылаОшибкаСканирования();
	КонецЕсли;
	
#КонецЕсли

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

&НаКлиенте
Процедура ПослеУдаленияОшибки(Результат, Контекст) Экспорт
	Если Контекст.ЗакрытьФорму Тогда
		Закрыть();
	Иначе
		УстановитьДоступностьКоманднойПанели(Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьВременныеФайлы(ТаблицаЗначенийФайлов)
	
	Для Каждого Строка Из ТаблицаЗначенийФайлов Цикл
		УдалитьФайлы(Строка.ПутьКФайлу);
	КонецЦикла;
	
	ТаблицаЗначенийФайлов.Очистить();
	ПозицияДляВставки = Неопределено;
	
КонецПроцедуры

&НаКлиенте
Функция ТекстСообщенияОшибкиПреобразованияВPDF(ФайлРезультата)
	
	ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Не существует ""%1"".
		           |Проверьте, что установлено приложение ImageMagick и указан правильный путь к нему в настройках сканирования.'"),
		ФайлРезультата);
		
	Возврат ТекстСообщения;
	
КонецФункции

&НаСервере
Процедура ПрочитатьНастройки()
	НастройкиСканированияПользователя = РаботаСФайлами.ПолучитьНастройкиСканированияПользователя(ИдентификаторКлиента);
	ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиСканированияПользователя);
	РазрешениеПеречисление = НастройкиСканированияПользователя.Разрешение;
	ЦветностьПеречисление = НастройкиСканированияПользователя.Цветность;
	ПоворотПеречисление  = НастройкиСканированияПользователя.Поворот;
	СжатиеTIFFПеречисление = НастройкиСканированияПользователя.СжатиеTIFF;
	ИмяУстройстваСканирования = НастройкиСканированияПользователя.ИмяУстройства;	
	РазмерБумагиПеречисление = НастройкиСканированияПользователя.РазмерБумаги;
	ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление();
КонецПроцедуры

&НаКлиенте
Процедура СохранитьПослеОбъединенияЗавершение(Контекст)
	ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
	ПутьКФайлуЛокальный = Контекст.ПутьКФайлуЛокальный;
	
	Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
		
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
		Результат.ДвоичныеДанные = ?(ЗначениеЗаполнено(Контекст.ДвоичныеДанныеРезультата), 
			Контекст.ДвоичныеДанныеРезультата, Новый ДвоичныеДанные(Контекст.ПутьКФайлуЛокальный));
		ПринятьЗавершение(Результат, ПараметрыВыполнения);
		Возврат;
	ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
		Результат.ИмяФайла = Контекст.ПутьКФайлуЛокальный;
		Для ИндексФайла = -ПараметрыВыполнения.МассивФайловКопия.ВГраница() По 0 Цикл
			Если ПараметрыВыполнения.МассивФайловКопия[-ИндексФайла].ПутьКФайлу = Контекст.ПутьКФайлуЛокальный Тогда
				ПараметрыВыполнения.МассивФайловКопия.Удалить(-ИндексФайла);
			КонецЕсли;
		КонецЦикла;	
		
		ПараметрыВыполнения.ФайлРезультата = "";
		ПринятьЗавершение(Результат, ПараметрыВыполнения);
		Возврат;
	Иначе
		Если НЕ ПустаяСтрока(ПутьКФайлуЛокальный) Тогда
			Обработчик = Новый ОписаниеОповещения("ПринятьЗавершение", ЭтотОбъект, ПараметрыВыполнения);
			
			ПараметрыДобавления = Новый Структура;
			ПараметрыДобавления.Вставить("ОбработчикРезультата", Обработчик);
			ПараметрыДобавления.Вставить("ПолноеИмяФайла", ПутьКФайлуЛокальный);
			ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла);
			ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект);
			ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", ИмяФайла);
			ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточкуПослеСозданияИзФайла);
			ПараметрыДобавления.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
			ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл);
			
			РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления);
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	
	Результат.ТекстОшибки = НСтр("ru = 'Не удалось сохранить отсканированный файл.'");
	
	ПринятьЗавершение(Результат, ПараметрыВыполнения);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьПослеОбъединения(РезультатОбъединения, Контекст) Экспорт
	
	Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
	ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
	
	Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
	
	Если РезультатОбъединения.Успешно = Ложь Тогда
		ТекстСообщения = РезультатОбъединения.ОписаниеОшибки;
		ПоказатьПредупреждение(, ТекстСообщения);
		УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
		УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
		Результат.ТекстОшибки = ТекстСообщения;
		ПринятьЗавершение(Результат, ПараметрыВыполнения);
		Возврат;
	КонецЕсли;
		
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
		Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
	ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
		Результат.ИмяФайла = РезультатОбъединения.ИмяФайлаРезультата;
	Иначе
		ОбъектФайлРезультата = Новый Файл(ПараметрыВыполнения.ФайлРезультата);
		Если НЕ ОбъектФайлРезультата.Существует() Тогда
			ТекстСообщения = ТекстСообщенияОшибкиПреобразованияВPDF(ПараметрыВыполнения.ФайлРезультата);
			ПоказатьПредупреждение(, ТекстСообщения);
			УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
			УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
			Результат.ТекстОшибки = ТекстСообщения;
			ПринятьЗавершение(Результат, ПараметрыВыполнения);
			Возврат;
		КонецЕсли;
		
		УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
		Контекст.ПутьКФайлуЛокальный = ПараметрыВыполнения.ФайлРезультата;
	КонецЕсли;
	
	СохранитьПослеОбъединенияЗавершение(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВсеКакОдинФайлЗавершение(РезультатОбъединения, Контекст) Экспорт
	
	Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
	
	ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
	ПараметрыВыполнения.ФайлРезультата = РезультатОбъединения.ИмяФайлаРезультата;
	Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
	
	Если РезультатОбъединения.Успешно = Ложь Тогда
		ТекстСообщения = РезультатОбъединения.ОписаниеОшибки;
		Если ЗначениеЗаполнено(ПараметрыВыполнения.ФайлРезультата) Тогда
			УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
		КонецЕсли;
		ПараметрыВыполнения.ФайлРезультата = "";
		Результат.ТекстОшибки = ТекстСообщения;
		ПоказатьПредупреждение(, ТекстСообщения);
		ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
		Возврат;
	КонецЕсли;
		
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
		Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
	ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
		Результат.ИмяФайла = ПараметрыВыполнения.ФайлРезультата;
	Иначе
		ОбъектФайлРезультата = Новый Файл(ПараметрыВыполнения.ФайлРезультата);
		Если НЕ ОбъектФайлРезультата.Существует() Тогда
			ТекстСообщения = ТекстСообщенияОшибкиПреобразованияВPDF(ПараметрыВыполнения.ФайлРезультата);
			УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
			ПараметрыВыполнения.ФайлРезультата = "";
			Результат.ТекстОшибки = ТекстСообщения;
			ПоказатьПредупреждение(, ТекстСообщения);
			ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
			Возврат;
		КонецЕсли;
		
		Если НЕ ПустаяСтрока(ПараметрыВыполнения.ФайлРезультата) Тогда
			
			Обработчик = Новый ОписаниеОповещения("ПринятьВсеКакОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения);
			
			ПараметрыДобавления = Новый Структура;
			ПараметрыДобавления.Вставить("ОбработчикРезультата", Обработчик);
			ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла);
			ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект);
			ПараметрыДобавления.Вставить("ПолноеИмяФайла", ПараметрыВыполнения.ФайлРезультата);
			ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", ИмяФайла);
			ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточкуПослеСозданияИзФайла);
			ПараметрыДобавления.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
			ПараметрыДобавления.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
			ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл);
			
			РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления);
			Возврат;
		КонецЕсли;
		
	КонецЕсли;
	ПараметрыВыполнения.ФайлРезультата = "";
	ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивно(Контекст)
	
	РасширениеРезультата = Контекст.РасширениеРезультата;
	ПараметрыДобавления = Контекст.ПараметрыДобавления;
	ОтсканированныеФайлы = Контекст.ОтсканированныеФайлы;
	
	// Здесь работаем со всеми картинками -каждую как отдельный файл принимаем.
	Если Контекст.ИндексФайла <= Контекст.МассивФайлов.ВГраница() Тогда
		Строка = Контекст.МассивФайлов[Контекст.ИндексФайла];
		
		ПутьКФайлуЛокальный = Строка.ПутьКФайлу;
		Контекст.Вставить("ПутьКФайлуЛокальный", ПутьКФайлуЛокальный);
		Контекст.Вставить("ФайлРезультата", "");
		Контекст.Вставить("ДвоичныеДанныеРезультата", "");
		Если РасширениеРезультата = "pdf" Тогда
			
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
		// АПК:441-выкл Временный файл не удаляется, если от функции РаботаСФайламиКлиент.ДобавитьСоСканера
		// требуется вернуть путь к файлу.
		Контекст.ФайлРезультата = ПолучитьИмяВременногоФайла("pdf");
		// АПК:441-вкл
#КонецЕсли
			ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
			ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = Контекст.ФайлРезультата;
			Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
				ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
			ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
				ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
			КонецЕсли;
			
			Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноПослеОбъединения", ЭтотОбъект, Контекст); 
			РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПутьКФайлуЛокальный), 
			ПараметрыКонвертацииГрафическогоДокумента);
		Иначе
			Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
				Контекст.ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(Контекст.ПутьКФайлуЛокальный);
			КонецЕсли;

			Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноЗавершение", ЭтотОбъект, Контекст);
			ВыполнитьОбработкуОповещения(Оповещение);
		КонецЕсли;
						
	Иначе
		Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
			РаботаСФайламиСлужебныйВызовСервера.ЗанестиМаксимальныйНомерДляСканирования(
				ВладелецФайла, НомерФайла - 1);
		КонецЕсли;
		
		УдалитьВременныеФайлы(Контекст.МассивФайлов);
		
		Если Контекст.КоличествоОшибок > 0 Тогда
			Если Контекст.КоличествоОшибок = 1 Тогда
				ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не удалось сохранить файл по причине:
						|%1'"),
					Контекст.ПолныйТекстВсехОшибок);
			Иначе
				ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не удалось сохранить некоторые файлы (%1):
						|%2'"),
					Строка(Контекст.КоличествоОшибок), Контекст.ПолныйТекстВсехОшибок);
			КонецЕсли;
			СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено, ТекстПредупреждения, РежимДиалогаВопрос.ОК);
		КонецЕсли;
		
		Закрыть(ОтсканированныеФайлы);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивноЗавершение(РезультатОповещения, Контекст) Экспорт
	
	Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
		Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
		Контекст.ОтсканированныеФайлы.Добавить(Результат);
	ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
		Результат.ИмяФайла = Контекст.ФайлРезультата;
		Контекст.ОтсканированныеФайлы.Добавить(Результат);
	Иначе
		Если НЕ ПустаяСтрока(Контекст.ПутьКФайлуЛокальный) Тогда
			Контекст.ПараметрыДобавления.ПолноеИмяФайла = Контекст.ПутьКФайлуЛокальный;
			Контекст.ПараметрыДобавления.ИмяСоздаваемогоФайла = ИмяФайла;
			Результат = РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширениемСинхронно(Контекст.ПараметрыДобавления);
			Если Не Результат.ФайлДобавлен Тогда
				Если ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда
					ПоказатьПредупреждение(, Результат.ТекстОшибки);
					Возврат;
				КонецЕсли;
			Иначе
				Контекст.ОтсканированныеФайлы.Добавить(Результат);
			КонецЕсли;
		КонецЕсли;
		
		Если НЕ ПустаяСтрока(Контекст.ФайлРезультата) Тогда
			УдалитьФайлы(Контекст.ФайлРезультата);
		КонецЕсли;
	КонецЕсли;
	
	НомерФайла = НомерФайла + 1;
	ИмяФайла = РаботаСФайламиСлужебныйКлиентСервер.ИмяСканированногоФайла(НомерФайла, "");
	Контекст.ИндексФайла = Контекст.ИндексФайла + 1;
	СохранитьКакОтдельныеФайлыРекурсивно(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивноПослеОбъединения(РезультатОбъединения, Контекст) Экспорт
	Контекст.ФайлРезультата = РезультатОбъединения.ИмяФайлаРезультата;
	Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
	
	Если РезультатОбъединения.Успешно = Ложь Тогда
		ТекстОшибки = РезультатОбъединения.ОписаниеОшибки;
		Если Контекст.ПолныйТекстВсехОшибок <> "" Тогда
			Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + Символы.ПС + Символы.ПС + "---" + Символы.ПС + Символы.ПС;
		КонецЕсли;
		Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + ТекстОшибки;
		Контекст.КоличествоОшибок = Контекст.КоличествоОшибок + 1;
		Контекст.ФайлРезультата = "";
	КонецЕсли;
	
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
		ОбъектФайлРезультата = Новый Файл(Контекст.ФайлРезультата);
		Если НЕ ОбъектФайлРезультата.Существует() Тогда
			ТекстОшибки = ТекстСообщенияОшибкиПреобразованияВPDF(Контекст.ФайлРезультата);
			Если Контекст.ПолныйТекстВсехОшибок <> "" Тогда
				Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + Символы.ПС + Символы.ПС + "---" + Символы.ПС + Символы.ПС;
			КонецЕсли;
			Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + ТекстОшибки;
			Контекст.КоличествоОшибок = Контекст.КоличествоОшибок + 1;
			Контекст.ФайлРезультата = "";
		КонецЕсли;
		
		Контекст.ПутьКФайлуЛокальный = Контекст.ФайлРезультата;
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноЗавершение", ЭтотОбъект, Контекст);
	ВыполнитьОбработкуОповещения(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура НачатьСканированиеПослеПолученияКомпоненты(РезультатИнициализации, Контекст) Экспорт
	Если РезультатИнициализации.Подключено Тогда
		ПодключаемыйМодуль = РезультатИнициализации.ПодключаемыйМодуль;
		НачатьСканирование();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НачатьСканирование()
	
	Если ПодключаемыйМодуль = Неопределено Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("НачатьСканированиеПослеПолученияКомпоненты", ЭтотОбъект);
		РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту(ОписаниеОповещения, Истина);
		Возврат;
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("НачатьНепосредственноеСканирование", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура НачатьНепосредственноеСканирование()

	ПараметрыСканирования = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыСканирования();
	ПараметрыСканирования.ПоказыватьДиалог = ПоказыватьДиалогСканера;
	ПараметрыСканирования.ВыбранноеУстройство = ИмяУстройстваСканирования;
	ПараметрыСканирования.ФорматКартинки = ФорматКартинки;
	ПараметрыСканирования.Разрешение = Разрешение;
	ПараметрыСканирования.Цветность = Цветность;
	ПараметрыСканирования.Поворот = Поворот;
	ПараметрыСканирования.РазмерБумаги = РазмерБумаги;
	ПараметрыСканирования.КачествоJPG = КачествоJPG;
	ПараметрыСканирования.СжатиеTIFF = СжатиеTIFF;
	ПараметрыСканирования.ДвустороннееСканирование = ДвустороннееСканирование;
	ПараметрыСканирования.АвтоматическаяПодачаДокументов = АвтоматическаяПодачаДокументов;

	НачалоСканирования = ТекущаяДата();// АПК:143 Используется для расчета интервала времени
	ПараметрыЗаданияСканирования = Новый Структура();
	ПараметрыЗаданияСканирования.Вставить("НачалоСканирования", НачалоСканирования);
	ПараметрыЗаданияСканирования.Вставить("ПараметрыСканирования", ПараметрыСканирования);
		
#Если Не ВебКлиент Тогда
	АдресКартинки = ПоместитьВоВременноеХранилище(БиблиотекаКартинок.ДлительнаяОперация48.ПолучитьДвоичныеДанные(), 
		УникальныйИдентификатор);
#КонецЕсли
	ОбщегоНазначенияКлиент.ХранилищеОбщихНастроекСохранить("КомпонентаСканирования", "ПараметрыЗаданияСканирования", 
		ПараметрыЗаданияСканирования,,,Истина);
	РаботаСФайламиСлужебныйКлиент.НачатьСканирование(ЭтотОбъект, ПодключаемыйМодуль, ПараметрыСканирования);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормыОшибки(РезультатЗакрытия, Контекст) Экспорт
	Если РезультатЗакрытия = "ПовторитьСканирование" Тогда
		ПрочитатьНастройки();
		Пересканировать(Неопределено);
	ИначеЕсли РезультатЗакрытия = КодВозвратаДиалога.Отмена И Не Контекст.РежимТребуетсяПомощь Тогда
		Если Открыта() Тогда
			Закрыть();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеПолученияТехническойИнформации(Результат, Контекст) Экспорт
	Элементы.ОшибкаСканирования.Видимость = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьКоманднойПанели(Доступность)
	Элементы.ФормаКоманднаяПанель.Доступность = Доступность;
КонецПроцедуры

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

Связанные материалы