Операции закрытия месяца / Параметры операций / Модуль формы

файл

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

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

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

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

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

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

&НаКлиенте
Процедура СохранитьИЗакрыть(Команда)
	
	Сохранить(Команда);
	Закрыть();
	
КонецПроцедуры

&НаКлиенте
Процедура Сохранить(Команда)
	
	СохранитьПараметры();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОперацияОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ОперацияПриИзменении(Элемент)
	
	ЗаполнитьПараметрыОперации();
	
КонецПроцедуры


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


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

&НаКлиенте
Процедура ДеревоПараметровРасчетаЗначениеПараметраПриИзменении(Элемент)
	
	ДанныеСтроки = Элементы.ДеревоПараметровРасчета.ТекущиеДанные;
	Если ДанныеСтроки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеСтроки.ЗначениеИзменено = (ДанныеСтроки.Значение <> ДанныеСтроки.ЗначениеПоУмолчанию);
	
	ЗаполнитьПризнакИзмененияУГруппыПараметров(ДанныеСтроки.ПолучитьРодителя());
	
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаСервере
Процедура СохранитьПараметры()
	
	ВсеПараметры = ПолучитьХранилищеДанных();
	
	ЗапомнитьИзмененныеПараметры(ВсеПараметры);
	
	Константы.НастройкиЗакрытияМесяца.СоздатьМенеджерЗначения().СохранитьВсеПараметры(ВсеПараметры);
	
КонецПроцедуры

&НаСервере
Функция ПолучитьХранилищеДанных()
	
	ХранилищеДанныхТипизированное = ОписаниеПараметров; // ХранилищеЗначения
	Возврат ХранилищеДанныхТипизированное.Получить();
		
КонецФункции

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

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