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