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

// Если подсистема "Работа с файлами" не внедрена в конфигурацию,
// то эту форму также необходимо удалить из конфигурации.

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

&НаКлиенте
Перем ОбновитьИнтерфейс;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	МаксимальныйРазмерФайла = РаботаСФайлами.МаксимальныйРазмерФайлаОбщий() / (1024*1024);

	МассивИменМетаданных = Новый Массив();
	МассивИменМетаданных.Добавить("РегистрСведений.УдалитьДвоичныеДанныеФайлов");
	РазмерТаблицыУдалитьДвоичныеДанныеФайлов = 
		ПолучитьРазмерДанныхБазыДанных(Неопределено, МассивИменМетаданных) / (1024*1024);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Если Не ЗавершениеРаботы Тогда
		ОбновитьИнтерфейсПрограммы();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура СписокЗапрещенныхРасширенийПриИзменении(Элемент)
	
	Подключаемый_ПриИзмененииРеквизита(Элемент);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийФайловOpenDocumentПриИзменении(Элемент)
	
	Подключаемый_ПриИзмененииРеквизита(Элемент);
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПослеИзмененияРеквизита(КонстантаИмя, ОбновлятьИнтерфейс = Истина)
	
	Если ОбновлятьИнтерфейс Тогда
		ОбновитьИнтерфейс = Истина;
		ПодключитьОбработчикОжидания("ОбновитьИнтерфейсПрограммы", 2, Истина);
	КонецЕсли;
	
	Если КонстантаИмя <> "" Тогда
		Оповестить("Запись_НаборКонстант", Новый Структура, КонстантаИмя);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИнтерфейсПрограммы()
	
	Если ОбновитьИнтерфейс = Истина Тогда
		ОбновитьИнтерфейс = Ложь;
		ОбщегоНазначенияКлиент.ОбновитьИнтерфейсПрограммы();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ПриИзмененииРеквизитаСервер(ИмяЭлемента)
	
	РеквизитПутьКДанным = Элементы[ИмяЭлемента].ПутьКДанным;
	
	КонстантаИмя = СохранитьЗначениеРеквизита(РеквизитПутьКДанным);
	
	ОбновитьПовторноИспользуемыеЗначения();
	
	Возврат КонстантаИмя;
	
КонецФункции

&НаСервере
Функция СохранитьЗначениеРеквизита(РеквизитПутьКДанным)
	
	ЧастиИмени = СтрРазделить(РеквизитПутьКДанным, ".");
	Если ЧастиИмени.Количество() <> 2 Тогда
		
		Если РеквизитПутьКДанным = "МаксимальныйРазмерФайла" Тогда
			НаборКонстант.МаксимальныйРазмерФайла = МаксимальныйРазмерФайла * (1024*1024);
			КонстантаИмя = "МаксимальныйРазмерФайла";
		КонецЕсли;
		
	Иначе
		КонстантаИмя = ЧастиИмени[1];
	КонецЕсли;
	
	Если ПустаяСтрока(КонстантаИмя) Тогда
		Возврат "";
	КонецЕсли;
	
	КонстантаМенеджер = Константы[КонстантаИмя];
	КонстантаЗначение = НаборКонстант[КонстантаИмя];
	
	Если КонстантаМенеджер.Получить() <> КонстантаЗначение Тогда
		КонстантаМенеджер.Установить(КонстантаЗначение);
	КонецЕсли;
	
	Возврат КонстантаИмя;
	
КонецФункции

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

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