Нематериальные активы и расходы на НИОКР / Форма выбора / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем ТекущиеЗначенияРеквизитов;

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ВыбратьЭлементы(Неопределено);
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьБыстрыйОтбор(ИмяОтбора, ОтборСписка, ИмяЭлементаОтбора, ИмяЭлементаСписка = "", ЭлементыСписка = Неопределено)

	// Заполняет быстрые отборы и скрывает колонки в списке
	
	ЗначениеОтбора = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ОтборСписка, ИмяОтбора, Неопределено);
	
	ЭтоСписок = Ложь;

	Если ТипЗнч(ЗначениеОтбора) = Тип("ФиксированныйМассив") 
		ИЛИ ТипЗнч(ЗначениеОтбора) = Тип("Массив") Тогда
		
		Если ЗначениеОтбора.Количество() > 1 Тогда
			ЭтоСписок = Истина;
			Элементы[ИмяЭлементаОтбора].Видимость = Ложь;
			ЗначениеОтбора = ВнеоборотныеАктивыСлужебный.ФиксированныйМассивВСписок(ЗначениеОтбора);
		Иначе
			ЗначениеОтбора = ЗначениеОтбора.Получить(0);
			Элементы[ИмяЭлементаСписка].Видимость = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Если ЭтоСписок Тогда
		ИмяЗаполняемогоЭлемента = ИмяЭлементаСписка;
	Иначе
		ИмяЗаполняемогоЭлемента = ИмяЭлементаОтбора;
	КонецЕсли;

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

&НаКлиенте
Функция ПроверитьВыбор(ДанныеСтроки, ПроверитьРеквизиты, ТекущиеЗначенияРеквизитов)

	ТекстПредупреждения = Неопределено;
	МестонахождениеНеСовпадает = Ложь;
	ПрочиеРеквизитыНеСовпадают = Ложь;
	
	Для каждого ИмяРеквизита Из ПроверитьРеквизиты Цикл
		
		Если ДанныеСтроки[ИмяРеквизита] <> ТекущиеЗначенияРеквизитов[ИмяРеквизита] 
			И (ЗначениеЗаполнено(ТекущиеЗначенияРеквизитов[ИмяРеквизита])
				ИЛИ ЗначениеЗаполнено(ДанныеСтроки[ИмяРеквизита])) Тогда
			
			Если ИмяРеквизита = "Организация"
				ИЛИ ИмяРеквизита = "Подразделение" Тогда
					
				МестонахождениеНеСовпадает = Истина;
			Иначе
				ПрочиеРеквизитыНеСовпадают = Истина;
			КонецЕсли;
			
		КонецЕсли; 
		
	КонецЦикла; 
	
	Если МестонахождениеНеСовпадает Тогда
		ТекстПредупреждения = НСтр("ru = 'Необходимо выбрать активы, числящиеся в одной организации и подразделении'");
	ИначеЕсли ПрочиеРеквизитыНеСовпадают Тогда
		ТекстПредупреждения = НСтр("ru = 'Необходимо выбрать однотипные активы'");
	КонецЕсли;

	Если ТекстПредупреждения <> Неопределено Тогда
		ПоказатьПредупреждение(, ТекстПредупреждения);
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

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

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