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

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

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

	ОбъектыПрикрепления = ОбъектыДляПрикрепления(Параметры.ОбъектыПечати);
	
	ЕстьВозможностьСохранения = Параметры.ОбъектыПечати.Количество() > 0;
	Если Параметры.ОбъектыПечати.Количество() = 1 Тогда
		ЕстьВозможностьПрисоединения = ОбъектыПрикрепления[0].Пометка;
	ИначеЕсли ЕстьВозможностьСохранения Тогда
		ЕстьВозможностьПрисоединения = Ложь;
		Для Каждого ОбъектДляПрикрепления Из ОбъектыПрикрепления Цикл
			ЕстьВозможностьПрисоединения = ЕстьВозможностьПрисоединения Или ОбъектДляПрикрепления.Пометка;
		КонецЦикла;
	Иначе
		ЕстьВозможностьПрисоединения = Ложь;
	КонецЕсли;
	
	Элементы.ВыборМестаСохраненияФайла.Видимость = Параметры.РасширениеДляРаботыСФайламиПодключено 
		Или ЕстьВозможностьПрисоединения;
		
	Элементы.ВариантСохранения.Видимость = ЕстьВозможностьПрисоединения;

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

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

&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
	Если ВыбранныеФорматыСохранения.Количество() = 1 Тогда
		Настройки.Удалить("ВыбранныеФорматыСохранения");
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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