Документооборот с контролирующими органами / Форма выбора КБК / Модуль формы

файл
&НаКлиенте
Перем СтрокаПоискаВрем;

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

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

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

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

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

&НаКлиенте
Процедура ВидОтображенияПриИзменении(Элемент)
	
	ЗапомнитьВидОтображения();
	
	ЗаполнитьДеревоНалогов(ВидОтображения <> "ТолькоНалог");
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура КБКВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ВернутьРезультат();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура Выбрать(Команда)
	
	ВернутьРезультат();
	
КонецПроцедуры

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ФорматированныйКБК(КБК)
	
	// 123 4 56 78901 23 4567 890 - номер символов КБК
	// 182 1 01 01011 01 1000 110 - маска КБК
	ФорматированныйКБК = 
		Лев(КБК, 3) + " " + 
		Сред(КБК, 4, 1) + " " + 
		Сред(КБК, 5, 2) + " " + 
		Сред(КБК, 7, 5) + " " + 
		Сред(КБК, 12, 2) + " " + 
		Сред(КБК, 14, 4) + " " + 
		Сред(КБК, 18, 3) + " " + 
		Сред(КБК, 21);
		
	Возврат СокрЛП(ФорматированныйКБК);

КонецФункции

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

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

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

		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

	ИскомыйИдентификатор = -1;
	ИдентификаторСтрокиДерева(КБК, Параметры.ТекущееЗначение, ИскомыйИдентификатор);
	
	Если ИскомыйИдентификатор <> -1 Тогда
		Элементы.КБК.ТекущаяСтрока = ИскомыйИдентификатор;
	КонецЕсли;

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

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

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

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

&НаСервере
Процедура ЗапомнитьВидОтображения()
	
	ХранилищеОбщихНастроек.Сохранить(
		"ДокументооборотСКонтролирующимиОрганами_ФормаВыбораКБК_ВидОтображения",
		,
		ВидОтображения);

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

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




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