Шаблоны ввода исходных данных / Форма элемента / Модуль формы

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

&НаКлиенте
Перем НаименованиеДоИзменения;

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


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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	ПрочитатьДанныеФормы();
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.Свойства
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	НаименованиеДоИзменения = Объект.Наименование;
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.Свойства
КонецПроцедуры

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

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

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

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

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

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


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

&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
	Если ПустаяСтрока(Объект.ПредставлениеДокумента) Или Объект.ПредставлениеДокумента = НаименованиеДоИзменения Тогда
		Объект.ПредставлениеДокумента = Объект.Наименование;
	КонецЕсли;
	НаименованиеДоИзменения = Объект.Наименование;
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура НесколькоСотрудниковПриИзменении(Элемент)
	УстановитьДоступностьВыбораНесколькихОбъектов(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура НесколькоПодразделенийПриИзменении(Элемент)
	УстановитьДоступностьВыбораНесколькихОбъектов(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура НесколькоОрганизацийПриИзменении(Элемент)
	УстановитьДоступностьВыбораНесколькихОбъектов(ЭтаФорма);
КонецПроцедуры

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

&НаКлиенте
Процедура ОрганизацияЗаполняетсяПриИзменении(Элемент)
	УстановитьДоступностьВыбораОрганизации(ЭтаФорма);
	УстановитьДоступностьВыбораПодразделения(ЭтаФорма);
	
	Если ОрганизацияЗаполняется Тогда
		ПриИзмененииОрганизацияЗаполняетсяНаСервере();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьПодразделениеПриИзменении(Элемент)
	УстановитьДоступностьВыбораПодразделения(ЭтаФорма);
	УстановитьДоступностьПроверкиЗаполненияПодразделения(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура ПодразделениеЗаполняетсяПриИзменении(Элемент)
	УстановитьДоступностьВыбораПодразделения(ЭтаФорма);
	УстановитьДоступностьПроверкиЗаполненияПодразделения(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура ЗначенияПоказателейВводятсяНаРазныеДатыПриИзменении(Элемент)
	УстановитьДоступностьВремяСводно(ЭтаФорма);
	УстановитьДоступностьВремяВводитсяЗаМесяц(ЭтаФорма);
КонецПроцедуры

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

&НаКлиенте
Процедура ВремяВводитсяЗаМесяцПриИзменении(Элемент)
	УстановитьДоступностьВыбораНесколькихОбъектов(ЭтаФорма);
КонецПроцедуры

#Область СтраницаДополнительно

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

&НаКлиенте
Процедура РегистрироватьСведенияОБухучетеПриИзменении(Элемент)
	ОбновитьЗависимыеПоля("РегистрироватьСведенияОБухучетеПриИзменении");
КонецПроцедуры

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

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


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

&НаКлиенте
Процедура ПоказателиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ПоказатьЗначение(, Показатели.НайтиПоИдентификатору(ВыбраннаяСтрока).Показатель);
КонецПроцедуры

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

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


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

&НаКлиенте
Процедура ВидыРабочегоВремениВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ПоказатьЗначение(, ВидыРабочегоВремени.НайтиПоИдентификатору(ВыбраннаяСтрока).ВидВремени);
КонецПроцедуры

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

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


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

&НаКлиенте
Процедура ВидыНерабочегоВремениВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ПоказатьЗначение(, ВидыНерабочегоВремени.НайтиПоИдентификатору(ВыбраннаяСтрока).ВидВремени);
КонецПроцедуры

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

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


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

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

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

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

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

&НаКлиенте
Процедура ВидыРаботВыбираютсяЗаранееПриИзменении(Элемент)
	ОбновитьЗависимыеПоля("ВидыРаботВыбираютсяЗаранееПриИзменении");
КонецПроцедуры

&НаКлиенте
Процедура ВыполненныеРаботыРаспределяютсяПоСотрудникамЧислоПриИзменении(Элемент)
	УстановитьДоступностьСпособовРаспределенияВыполненныхРабот(ЭтаФорма);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьСпособовРаспределенияВыполненныхРабот(Форма)
	Объект = Форма.Объект;
	Элементы = Форма.Элементы;
	
	ДоступностьРаспределения = Форма.ВыполненныеРаботыРаспределяютсяПоСотрудникамЧисло = 1;
	
	Элементы.ВыполненныеРаботыРаспределяютсяСУчетомКоэффициентов.Доступность = ДоступностьРаспределения;
	Элементы.ВыполненныеРаботыРаспределяютсяСУчетомТарифныхСтавок.Доступность = ДоступностьРаспределения;
	Элементы.ВыполненныеРаботыРаспределяютсяСУчетомОтработанногоВремени.Доступность = ДоступностьРаспределения;
	Элементы.ВыполненныеРаботыРаспределяютсяСверхТарифа.Доступность = ДоступностьРаспределения;
	
	Если Не ДоступностьРаспределения Тогда
		Объект.ВыполненныеРаботыРаспределяютсяСУчетомКоэффициентов = Ложь;
		Объект.ВыполненныеРаботыРаспределяютсяСУчетомТарифныхСтавок = Ложь;
		Объект.ВыполненныеРаботыРаспределяютсяСУчетомОтработанногоВремени = Ложь;
		Объект.ВыполненныеРаботыРаспределяютсяСверхТарифа = Ложь;
	КонецЕсли;
КонецПроцедуры

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


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

// СтандартныеПодсистемы.Свойства
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

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

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

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

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


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

#Область Свойства

// СтандартныеПодсистемы.Свойства
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

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

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

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

#Область ЧтениеИЗаписьДанныхФормы

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

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

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

#Область ПоказателиРасчетаЗарплаты

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

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

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

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

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

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

#Область ВидыВремени

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

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

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

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

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

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

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

#Область УправлениеСвойствамиЭлементов

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

&НаКлиентеНаСервереБезКонтекста
Функция ИндексВетвиНазначения(Назначение)
	// Элементы дерева на первом уровне всегда размещаются в одинаковой последовательности.
	
	ИндексыВетокНазначения = Новый Соответствие;
	ИндексыВетокНазначения.Вставить(ПредопределенноеЗначение("Перечисление.НазначенияПоказателейРасчетаЗарплаты.ДляСотрудника"), 0);
	ИндексыВетокНазначения.Вставить(ПредопределенноеЗначение("Перечисление.НазначенияПоказателейРасчетаЗарплаты.ДляПодразделения"), 1);
	ИндексыВетокНазначения.Вставить(ПредопределенноеЗначение("Перечисление.НазначенияПоказателейРасчетаЗарплаты.ДляОрганизации"), 2);
	
	Возврат ИндексыВетокНазначения[Назначение];
КонецФункции

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

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

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьВремяВводитсяЗаМесяц(Форма)
	Форма.Элементы.ВремяВводитсяЗаМесяцИстина.Доступность = Не Форма.Объект.ВремяВводитсяСводно;
	Форма.Элементы.ВремяВводитсяЗаМесяцЛожь.Доступность = Не Форма.Объект.ВремяВводитсяСводно;
		
	Если Форма.Объект.ВремяВводитсяСводно Тогда
		Форма.ВремяВводитсяЗаМесяцЧисло = 1;
	КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура УстановитьДоступностьВводаВидовРабот(ДоступностьВводаВидовРабот)
	Элементы.СтраницаВидыРабот.Доступность = ДоступностьВводаВидовРабот;
	
	Если Не ДоступностьВводаВидовРабот Тогда
		Объект.ВидыРабот.Очистить();
		ВидыРаботЗаполняютсяВДокументеЧисло = 0;
		ВыполненныеРаботыРаспределяютсяПоСотрудникамЧисло = 0;
		УстановитьЗаголовокСтраницыВидыРабот(ЭтаФорма);
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьЗаголовокСтраницыПоказатели(Форма)
	Форма.ЗаголовокСтраницыПоказатели = КоличествоВыбранныхПоказателей(Форма);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция КоличествоВыбранныхПоказателей(Форма)
	Возврат Форма.ВыбранныеПоказателиДляОрганизации.Количество()
			+ Форма.ВыбранныеПоказателиДляПодразделения.Количество()
			+ Форма.ВыбранныеПоказателиДляСотрудника.Количество();
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьЗаголовокСтраницыВидыВремени(Форма)
	Форма.ЗаголовокСтраницыВидыВремени = Форма.ВыбранныеВидыВремени.Количество();
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьЗаголовокСтраницыВидыРабот(Форма)
	Форма.ЗаголовокСтраницыВидыРабот = Форма.Объект.ВидыРабот.Количество();
КонецПроцедуры

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

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

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

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

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

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