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

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

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

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ИдентификаторКлиента = Параметры.ИдентификаторКлиента;
	НастройкиСканированияПользователя = РаботаСФайлами.ПолучитьНастройкиСканированияПользователя(ИдентификаторКлиента);
	ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиСканированияПользователя);
	Если ИмяУстройства <> "" Тогда
		Элементы.ИмяУстройства.СписокВыбора.Добавить(ИмяУстройства);
	КонецЕсли;
	Элементы.КаталогЖурналаСканирования.Доступность = ИспользоватьКаталогЖурналаСканирования;
			
	СпособПреобразованияВPDF = ?(ИспользоватьImageMagickДляПреобразованияВPDF, 1, 0);
		
	ФорматJPG = Перечисления.ФорматыСканированногоИзображения.JPG;
	ФорматTIF = Перечисления.ФорматыСканированногоИзображения.TIF;
	
	ФорматМногостраничныйTIF = Перечисления.ФорматыХраненияМногостраничныхФайлов.TIF;
	
	Элементы.ГруппаКачествоJPG.Видимость = (ФорматСканированногоИзображения = ФорматJPG);
	Элементы.СжатиеTIFF.Видимость = (ФорматСканированногоИзображения = ФорматTIF);
	
	Элементы.ПутьКПрограммеКонвертации.Доступность = ИспользоватьImageMagickДляПреобразованияВPDF;
	
	УстановитьПодсказки();
	
	ПовторноеСканирование = Параметры.ПовторноеСканирование;
	
	Если Параметры.ПовторноеСканирование Тогда
		Элементы.ОК.Заголовок = НСтр("ru='Сканировать'");
	КонецЕсли;
	
	ПараметрыЗаданияСканирования = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("КомпонентаСканирования", "ПараметрыЗаданияСканирования", Неопределено);
	
	Элементы.ОшибкаСканирования.Видимость = ПараметрыЗаданияСканирования <> Неопределено;
	
	// СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку") Тогда
		
		МодульОбращенияВТехническуюПоддержкуСлужебный = ОбщегоНазначения.ОбщийМодуль(
			"ОбращенияВТехническуюПоддержкуСлужебный");
		
		МодульОбращенияВТехническуюПоддержкуСлужебный.ПриСозданииНаСервере(ЭтотОбъект);
		
	Иначе
		Элементы.ГруппаОбращенияВТехническуюПоддержку.Видимость = Ложь;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
	
КонецПроцедуры

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

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ИмяУстройстваПриИзменении(Элемент)
	ПрочитатьНастройкиСканера();
КонецПроцедуры

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

&НаКлиенте
Процедура ФорматСканированногоИзображенияПриИзменении(Элемент)
	
	Элементы.ГруппаКачествоJPG.Видимость = (ФорматСканированногоИзображения = ФорматJPG);
	Элементы.СжатиеTIFF.Видимость = (ФорматСканированногоИзображения = ФорматTIF);
	УстановитьПодсказки();
	
КонецПроцедуры

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

&НаКлиенте
Процедура СпособПреобразованияВPDFПриИзменении(Элемент)
	
	ИспользоватьImageMagickДляПреобразованияВPDF = СпособПреобразованияВPDF = 1;
	ОтработатьИзмененияИспользоватьImageMagick();
	
КонецПроцедуры

&НаКлиенте
Процедура КачествоJPGПриИзменении(Элемент)
	Элементы.КачествоJPG.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Качество (%1)'"), КачествоJPG);
КонецПроцедуры

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

&НаКлиенте
Процедура ПоказыватьДиалогСканераПриИзменении(Элемент)
	
	ОбработатьИспользованиеДиалогаСканирования();
	
КонецПроцедуры

&НаКлиенте
Процедура КаталогЖурналаСканированияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

&НаКлиенте
Процедура ИспользоватьКаталогЖурналаСканированияПриИзменении(Элемент)
	Элементы.КаталогЖурналаСканирования.Доступность = ИспользоватьКаталогЖурналаСканирования;
КонецПроцедуры

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

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

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

#Область ОбработчикиКомандФормы

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

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

&НаКлиенте
Процедура ОткрытьНомераОтсканированныхФайлов(Команда)
	ОткрытьФорму("РегистрСведений.НомераОтсканированныхФайлов.ФормаСписка");
КонецПроцедуры

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

#Область СлужебныеПроцедурыИФункции

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

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

&НаКлиенте
Процедура УстановитьТекстРекомендации()
	
	Рекомендации = Новый Массив;
	
	Рекомендации.Добавить(НСтр("ru = 'Попробуйте следующие варианты:'"));
	Рекомендации.Добавить(" • " + НСтр("ru = 'Проверьте подключение сканера и повторите попытку сканирования.'"));
	
	Если Не ПоказыватьДиалогСканера И Не ОбщегоНазначенияКлиент.Это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=" + СистемнаяИнформация.ВерсияПриложения);
	КонецЕсли;
	
#КонецЕсли
	
КонецПроцедуры

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

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

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

	ПрочитатьНастройкиСканераИОбновитьЗначения(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьНастройкиСканераИОбновитьЗначения(ОбновлятьЗначения)

	Элементы.ФорматСканированногоИзображения.Доступность = Истина;
	Элементы.Разрешение.Доступность = Истина;
	Элементы.Цветность.Доступность = Истина;
	Элементы.УстановитьСтандартныеНастройки.Доступность = Истина;
	Элементы.ПреобразоватьВPDF.Доступность = Истина;
	Элементы.КачествоJPG.Доступность = Истина;
	Элементы.СжатиеTIFF.Доступность = Истина;
	Элементы.ФорматХраненияМногостраничный.Доступность = Истина;
	Элементы.СпособПреобразованияВPDF.Доступность = Истина;
	Элементы.ПоказыватьДиалогСканера.Доступность = Истина;
	
	РазрешениеЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
		ИмяУстройства, "XRESOLUTION");
	ЦветностьЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
		ИмяУстройства, "PIXELTYPE");
	ПоворотЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
		ИмяУстройства, "ROTATION");
	РазмерБумагиЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
		ИмяУстройства, "SUPPORTEDSIZES");
	ДвустороннееСканированиеЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
		ИмяУстройства, "DUPLEX");
	АвтоматическаяПодачаДокументовЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль, 
		ИмяУстройства, "FEEDER");
	
	Элементы.Поворот.Доступность = (ПоворотЧисло <> -1);
	Элементы.РазмерБумаги.Доступность = (РазмерБумагиЧисло <> -1);
	
	Элементы.ДвустороннееСканирование.Доступность = (ДвустороннееСканированиеЧисло <> -1);
	Если ОбновлятьЗначения Тогда
		ОбновитьЗначение(ДвустороннееСканирование, ?((ДвустороннееСканированиеЧисло = 1), Истина, Ложь), Модифицированность);
	КонецЕсли;
	Элементы.АвтоматическаяПодачаДокументов.Доступность = (АвтоматическаяПодачаДокументовЧисло <> -1);
	Если ОбновлятьЗначения Тогда
		ОбновитьЗначение(АвтоматическаяПодачаДокументов, ?((АвтоматическаяПодачаДокументовЧисло = 1), Истина, Ложь), Модифицированность);
		ПреобразоватьПараметрыСканераВПеречисления(
			РазрешениеЧисло, ЦветностьЧисло, ПоворотЧисло, РазмерБумагиЧисло);
		
		ОбработатьИспользованиеДиалогаСканирования();
	КонецЕсли;

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

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

&НаКлиенте
Процедура ОтработатьИзмененияИспользоватьImageMagick()
	
	Элементы.ПутьКПрограммеКонвертации.Доступность = ИспользоватьImageMagickДляПреобразованияВPDF;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОКЗавершение(НастройкиСканированияПользователя)
	РаботаСФайламиКлиент.СохранитьНастройкиСканированияПользователя(НастройкиСканированияПользователя);
	Результат = Новый Структура("ПовторноеСканирование", ПовторноеСканирование);
	Закрыть(Результат);
КонецПроцедуры

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

&НаКлиенте
Процедура ОбработатьИспользованиеДиалогаСканирования()
	
	Элементы.ГруппаПараметрыСканирования.Доступность = Не ПоказыватьДиалогСканера;
	Элементы.ФорматСканированногоИзображения.Доступность = Не ПоказыватьДиалогСканера;
	Элементы.КачествоJPG.Доступность = Не ПоказыватьДиалогСканера;
	Элементы.СжатиеTIFF.Доступность = Не ПоказыватьДиалогСканера;
	Элементы.Разрешение.ОтметкаНезаполненного = Не ПоказыватьДиалогСканера;
	Элементы.Цветность.ОтметкаНезаполненного = Не ПоказыватьДиалогСканера;

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

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьЗначение(Приемник, Источник, Модифицированность)
	Модифицированность = Модифицированность Или Приемник <> Источник;
	Приемник = ?(ЗначениеЗаполнено(Источник), Источник, Приемник);
КонецПроцедуры

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

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

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

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

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