&НаКлиенте
Перем СтрокаПоискаВрем;
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
РазобратьВходныеПараметры(Параметры);
ОпределитьВидОтображенияПриСозданииНаСервере();
ЗаполнитьДеревоНалогов(ВидОтображения <> "ТолькоНалог");
Элементы.ВидОтображения.Видимость =
НЕ ЗапретитьВыборКБК
И ТипСверки <> Перечисления.ТипыСверокИОН.ВЦеломПоОрганизации;
Элементы.ОчиститьПоле.Видимость = Параметры.Свойство("ВыборИзФормыУведомления");
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ВидОтображенияПриИзменении(Элемент)
ЗапомнитьВидОтображения();
ЗаполнитьДеревоНалогов(ВидОтображения <> "ТолькоНалог");
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыКБК
&НаКлиенте
Процедура КБКВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ВернутьРезультат();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Выбрать(Команда)
ВернутьРезультат();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьПоле(Команда)
Закрыть(Новый Структура("Значение, Наименование"));
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиентеНаСервереБезКонтекста
Функция ФорматированныйКБК(КБК)
ФорматированныйКБК =
Лев(КБК, 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 Тогда
Элементы.КБК.ТекущаяСтрока = ИскомыйИдентификатор;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ИдентификаторСтрокиДерева(Узел, ИскомоеЗначение, ИскомыйИдентификатор)
ЭлементыУзла = Узел.ПолучитьЭлементы();
Для каждого ЭлементУзла Из ЭлементыУзла Цикл
Если ЭлементУзла.Значение = ИскомоеЗначение Тогда
ИскомыйИдентификатор = ЭлементУзла.ПолучитьИдентификатор();
Иначе
ИдентификаторСтрокиДерева(ЭлементУзла, ИскомоеЗначение, ИскомыйИдентификатор);
КонецЕСли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОпределитьВидОтображенияПриСозданииНаСервере()
Если ЗапретитьВыборКБК Тогда
ВидОтображения = "ТолькоНалог";
ЗапомнитьВидОтображения();
ИначеЕсли ТипСверки = Перечисления.ТипыСверокИОН.ВЦеломПоОрганизации Тогда
ВидОтображения = "НалогИКБК";
ЗапомнитьВидОтображения();
Иначе
СохраненныйВидОтображения = ХранилищеОбщихНастроек.Загрузить(
"ДокументооборотСКонтролирующимиОрганами_ФормаВыбораКБК_ВидОтображения");
Если СохраненныйВидОтображения = Неопределено Тогда
ВидОтображения = "ТолькоНалог";
ЗапомнитьВидОтображения();
Иначе
ВидОтображения = СохраненныйВидОтображения;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗапомнитьВидОтображения()
ХранилищеОбщихНастроек.Сохранить(
"ДокументооборотСКонтролирующимиОрганами_ФормаВыбораКБК_ВидОтображения",
,
ВидОтображения);
КонецПроцедуры
#КонецОбласти