Группы сотрудников / Форма элемента / Модуль формы

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	
	СсылкаНаОбъект = ТекущийОбъект.Ссылка;
	НастройкиЗаполнения = ТекущийОбъект.ХранилищеНастроек.Получить();
	УстановитьОтображение();
	
КонецПроцедуры

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

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

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


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

&НаКлиенте
Процедура ФормироватьАвтоматическиПриИзменении(Элемент)
	
	УстановитьОтображениеФормироватьАвтоматически(ЭтаФорма);
	
КонецПроцедуры

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


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

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

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

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

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


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

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

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


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

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

&НаКлиенте
Процедура ОбновитьСоставСотрудниковГруппы(Команда)
	
	Если НастройкиЗаполнения = Неопределено Тогда
		
		Оповещение = Новый ОписаниеОповещения("ОбновитьСоставСотрудниковГруппыПредупреждениеЗавершение", ЭтотОбъект);
		ПоказатьПредупреждение(Оповещение, НСтр("ru='Перед тем как сформировать список сотрудников необходимо настроить критерии отбора'"));
		
	Иначе
		ПоказатьСоставСотрудниковАвтогруппы(Ложь);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПодобратьСотрудников(Команда)
	
	ВыполнитьПодборСотрудников(Истина);
	
КонецПроцедуры
	
#КонецОбласти


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

&НаКлиенте
Процедура ОбновитьСоставСотрудниковГруппыПредупреждениеЗавершение(Результат) Экспорт
	
	НастроитьКритерииОтбора();
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьКритерииОтбора()
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("КлючВарианта", "ЗаполнениеСписковСотрудников");
	ПараметрыОткрытия.Вставить("Вариант", НастройкиЗаполнения);
	
	Оповещение = Новый ОписаниеОповещения("НастроитьКритерииОтбораЗавершение", ЭтотОбъект);
	
	ОткрытьФорму("Справочник.ГруппыСотрудников.Форма.ФормаНастройкиУсловийЗаполнения", ПараметрыОткрытия, ЭтаФорма, , , , Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьКритерииОтбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		
		Если Результат.Свойство("НастройкиЗаполнения") Тогда
			НастройкиЗаполнения = Результат.НастройкиЗаполнения;
		КонецЕсли; 
		
		ПоказатьСоставСотрудниковАвтогруппы(Истина);
		Модифицированность = Истина;
		
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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