Учетная политика финансового учета / Настройка порядка оценки задолженности / Модуль формы

файл

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыПорядокОценкиЗадолженностиДерево

&НаКлиенте
Процедура ПорядокОценкиЗадолженностиДеревоПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр)
	
	ТекДанные = Элементы.ПорядокОценкиЗадолженностиДерево.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	// Запрещаем копировать вид задолженности.
	
	Если ТекДанные.ЭтоВидЗадолженности И Копирование Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	ВидЗадолженности_Данные = ?(ТекДанные.ЭтоВидЗадолженности, ТекДанные, ТекДанные.ПолучитьРодителя());
	ВидЗадолженности_ТекущаяСтрока = ВидЗадолженности_Данные.ПолучитьИдентификатор();
	
	Интервал_Данные = ?(ТекДанные.ЭтоВидЗадолженности, ТекДанные.ПолучитьЭлементы()[0], ТекДанные);
	
	Если Интервал_Данные.НижняяГраницаИнтервала = 0 Тогда
		
		// Если не добавлено ни одного интервала, то меняем текущую строку.
		
		Отказ = Истина;
		
		Интервал_Данные.НижняяГраницаИнтервала = 1;
		
		Элементы.ПорядокОценкиЗадолженностиДерево.ТекущаяСтрока = Интервал_Данные.ПолучитьИдентификатор();
		Элементы.ПорядокОценкиЗадолженностиДерево.ТекущийЭлемент = Элементы.ПорядокОценкиЗадолженностиДеревоОценка;
		Элементы.ПорядокОценкиЗадолженностиДерево.ИзменитьСтроку();
	ИначеЕсли Не ТекДанные.ЭтоВидЗадолженности Тогда
		
		// Не добавляем строки, подчиненные интервалам. Вместо этого добавляем новый интервал.
		
		Отказ = Истина;
		
		Элементы.ПорядокОценкиЗадолженностиДерево.ТекущаяСтрока = ВидЗадолженности_Данные.ПолучитьИдентификатор();
		Элементы.ПорядокОценкиЗадолженностиДерево.ДобавитьСтроку();
	КонецЕсли;
	
	СформироватьНаименованияГраниц();
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ПорядокОценкиЗадолженностиДеревоОценкаПриИзменении(Элемент)
	
	ТекДанные = Элементы.ПорядокОценкиЗадолженностиДерево.ТекущиеДанные;
	Если ТекДанные.Оценка > 100 Тогда
		ТекДанные.Оценка = 100;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОК(Команда)
	
	ЗаполнитьТаблицуПорядкаОценкиЗадолженности();
	СохранитьВХранилищеНаСервере();
	Закрыть(Модифицированность);
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура СохранитьВХранилищеНаСервере()
	ПоместитьВоВременноеХранилище(ПорядокОценкиЗадолженности.Выгрузить(), АдресОценкиЗадолженностиТекущий)
КонецПроцедуры

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

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

&НаСервере
Процедура ЗаполнитьДеревоПорядкаОценкиЗадолженности()
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ПорядокОценкиЗадолженностиТекущий.ВидЗадолженности,
	|	ПорядокОценкиЗадолженностиТекущий.НаименованиеИнтервала,
	|	ПорядокОценкиЗадолженностиТекущий.НижняяГраницаИнтервала,
	|	ПорядокОценкиЗадолженностиТекущий.ВерхняяГраницаИнтервала,
	|	ПорядокОценкиЗадолженностиТекущий.Оценка
	|ПОМЕСТИТЬ вт_ПорядокОценкиЗадолженностиТекущий
	|ИЗ
	|	&ПорядокОценкиЗадолженностиТекущий КАК ПорядокОценкиЗадолженностиТекущий
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВидыЗадолженности.Ссылка КАК ВидЗадолженности,
	|	ЕСТЬNULL(вт_ПорядокОценкиЗадолженностиТекущий.НаименованиеИнтервала, """") КАК НаименованиеИнтервала,
	|	ЕСТЬNULL(вт_ПорядокОценкиЗадолженностиТекущий.НижняяГраницаИнтервала, 0) КАК НижняяГраницаИнтервала,
	|	ЕСТЬNULL(вт_ПорядокОценкиЗадолженностиТекущий.ВерхняяГраницаИнтервала, 0) КАК ВерхняяГраницаИнтервала,
	|	ЕСТЬNULL(вт_ПорядокОценкиЗадолженностиТекущий.Оценка, 0) КАК Оценка
	|ИЗ
	|	Перечисление.ВидыЗадолженности КАК ВидыЗадолженности
	|		ЛЕВОЕ СОЕДИНЕНИЕ вт_ПорядокОценкиЗадолженностиТекущий КАК вт_ПорядокОценкиЗадолженностиТекущий
	|		ПО ВидыЗадолженности.Ссылка = вт_ПорядокОценкиЗадолженностиТекущий.ВидЗадолженности
	|ГДЕ
	|	НЕ ВидыЗадолженности.Ссылка = ЗНАЧЕНИЕ(Перечисление.ВидыЗадолженности.Прочее)
	|	И (&ИспользоватьДоговорыКредитовИДепозитов ИЛИ НЕ ВидыЗадолженности.Ссылка = ЗНАЧЕНИЕ(Перечисление.ВидыЗадолженности.ЗаймыВыданные))
	|	И (&ИспользоватьНесколькоВалют ИЛИ НЕ ВидыЗадолженности.Ссылка = ЗНАЧЕНИЕ(Перечисление.ВидыЗадолженности.ЗадолженностьКонтрагентовВал))
	|УПОРЯДОЧИТЬ ПО
	|	ВидЗадолженности,
	|	НижняяГраницаИнтервала
	|АВТОУПОРЯДОЧИВАНИЕ
	|ИТОГИ
	|ПО
	|	ВидЗадолженности";
	
	Запрос.УстановитьПараметр("ПорядокОценкиЗадолженностиТекущий", ПорядокОценкиЗадолженности.Выгрузить());
	Запрос.УстановитьПараметр("ИспользоватьДоговорыКредитовИДепозитов", ПолучитьФункциональнуюОпцию("ИспользоватьДоговорыКредитовИДепозитов"));
	Запрос.УстановитьПараметр("ИспользоватьНесколькоВалют", ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВалют"));
	
	Дерево = РеквизитФормыВЗначение("ПорядокОценкиЗадолженностиДерево");
	Дерево.Строки.Очистить();
	
	ВыборкаВидЗадолженности = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока ВыборкаВидЗадолженности.Следующий() Цикл
		НоваяСтрока = Дерево.Строки.Добавить();
		НоваяСтрока.ВидЗадолженности = ВыборкаВидЗадолженности.ВидЗадолженности;
		НоваяСтрока.ЭтоВидЗадолженности = Истина;
		
		ВыборкаИнтервалы = ВыборкаВидЗадолженности.Выбрать();
		Пока ВыборкаИнтервалы.Следующий() Цикл
			НоваяСтрокаИнтервалы = НоваяСтрока.Строки.Добавить();
			НоваяСтрокаИнтервалы.ВидЗадолженности = ВыборкаИнтервалы.НаименованиеИнтервала;
			
			ЗаполнитьЗначенияСвойств(НоваяСтрокаИнтервалы, ВыборкаИнтервалы,, "ВидЗадолженности");
		КонецЦикла;
	КонецЦикла;
	
	ЗначениеВРеквизитФормы(Дерево, "ПорядокОценкиЗадолженностиДерево");
	
КонецПроцедуры

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

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

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

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