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