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