Аналитики статей бюджетов / Настройка типа аналитики / Модуль формы

файл

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

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

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

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

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

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

	Элементы.ДеревоТиповКонтекстноеМенюСоздатьСвойство.Видимость = Ложь;
	Элементы.ДеревоТиповКонтекстноеМенюСоздатьДополнительныйРеквизит.Видимость = Ложь;

	Если СтрокаДляПроверки.ПредставлениеТипа = СтрокаДополнительныеРеквизиты Тогда
		Элементы.ДеревоТиповКонтекстноеМенюСоздатьДополнительныйРеквизит.Видимость = Истина;	
	ИначеЕсли СтрокаДляПроверки.ПредставлениеТипа = СтрокаДополнительныеСведения Тогда
		Элементы.ДеревоТиповКонтекстноеМенюСоздатьСвойство.Видимость = Истина;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура СоздатьДополнительноеСведение(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ЭтоДополнительноеСведение", Истина);
	
	Оповещение = Новый ОписаниеОповещения("СозданиеДополнительногоСвойства", ЭтаФорма);
	ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.ФормаЭлемента", 
		ПараметрыФормы, ЭтаФорма, , , , Оповещение);
	
КонецПроцедуры

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьДеревоТипов()
	
	ДеревоТипов.ПолучитьЭлементы().Очистить();
	
	ДобавитьПредопределенныеТипы();
	ДобавитьДополнительныеСвойства();
	
КонецПроцедуры

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

&НаСервере
Процедура ДобавитьДополнительныеСвойства()
	
	СтрокаДополнительныеРеквизиты = ДеревоТипов.ПолучитьЭлементы().Добавить();
	СтрокаДополнительныеРеквизиты.ПредставлениеТипа = НСтр("ru = 'Дополнительные реквизиты'");
	
	СтрокаДополнительныеСведения = ДеревоТипов.ПолучитьЭлементы().Добавить();
	СтрокаДополнительныеСведения.ПредставлениеТипа = НСтр("ru = 'Дополнительные сведения'");
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Свойства.Ссылка КАК ДополнительноеСвойство,
	|	Свойства.Представление КАК Представление,
	|	Свойства.ТипЗначения,
	|	Свойства.ЭтоДополнительноеСведение
	|ИЗ
	|	ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства
	|
	|УПОРЯДОЧИТЬ ПО
	|	Свойства.Ссылка";
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		
		Типы = Выборка.ТипЗначения.Типы();
		Если Типы.Количество() > 1 Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ДоступныеТипы.СодержитТип(Типы[0]) Тогда
			Продолжить;
		КонецЕсли;
		
		Если Выборка.ЭтоДополнительноеСведение Тогда
			НоваяСтрока = СтрокаДополнительныеСведения.ПолучитьЭлементы().Добавить();
		Иначе
			НоваяСтрока = СтрокаДополнительныеРеквизиты.ПолучитьЭлементы().Добавить();
		КонецЕсли;
		НоваяСтрока.ДополнительноеСвойство = Выборка.ДополнительноеСвойство; 
		НоваяСтрока.Пометка = (Выборка.ДополнительноеСвойство = ДополнительноеСвойство);
		НоваяСтрока.Тип = Выборка.ТипЗначения;
		НоваяСтрока.ПредставлениеТипа = Выборка.Представление;
		 
		НоваяСтрока.Ссылка = Новый (Типы[0]);
		
		Если НоваяСтрока.Пометка Тогда
			Элементы.ДеревоТипов.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ИмяФормыСпискаПоТипу(ОписаниеТипов)
	
	ОбъектМетаданных = Метаданные.НайтиПоТипу(ОписаниеТипов.Типы()[0]);
	Возврат ОбъектМетаданных.ПолноеИмя() + ".ФормаСписка";
	
КонецФункции

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

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

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

&НаКлиенте
Процедура СозданиеДополнительногоСвойства(Результат, ДополнительныеПараметры) Экспорт
	
	ЗаполнитьДеревоТипов();
	
КонецПроцедуры

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

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