MVP для отображения уже загруженных табелей

This commit is contained in:
@@ -232,14 +232,14 @@
&НаКлиенте &НаКлиенте
Функция СтраницаФормыПоСтатьеФинансирования(АнализируемаяСтатьяФинансирования) Функция СтраницаФормыПоСтатьеФинансирования(АнализируемаяСтатьяФинансирования)
Если АнализируемаяСтатьяФинансирования = СтатьяФинансированияСГЗ Тогда Если АнализируемаяСтатьяФинансирования = СтатьяФинансированияСГЗ Тогда
Возврат Элементы.ГруппаСтраницаТабельСГЗ Возврат Элементы.ГруппаСтраницаТабельСГЗ;
ИначеЕсли АнализируемаяСтатьяФинансирования = СтатьяФинансированияПД Тогда ИначеЕсли АнализируемаяСтатьяФинансирования = СтатьяФинансированияПД Тогда
Возврат Элементы.ГруппаСтраницаТабельПД Возврат Элементы.ГруппаСтраницаТабельПД;
ИначеЕсли АнализируемаяСтатьяФинансирования = СтатьяФинансированияОМС Тогда ИначеЕсли АнализируемаяСтатьяФинансирования = СтатьяФинансированияОМС Тогда
Возврат Элементы.ГруппаСтраницаТабельОМС Возврат Элементы.ГруппаСтраницаТабельОМС;
КонецЕсли; КонецЕсли;
Возврат ""; Возврат Элементы.ГруппаСтраницаТабельСГЗ;
КонецФункции // ИмяТабличнойЧастиПоИсточникуФинансировани я() КонецФункции
&НаКлиенте &НаКлиенте
Функция ЗаписатьКоличествоСотрудниковПоСтатьеФинансирования(АнализируемаяСтатьяФинансирования) Функция ЗаписатьКоличествоСотрудниковПоСтатьеФинансирования(АнализируемаяСтатьяФинансирования)
@@ -573,6 +573,9 @@
&НаКлиенте &НаКлиенте
Асинх Процедура КомандаОткрыть(Команда) Асинх Процедура КомандаОткрыть(Команда)
// Перед открытием файла очищаем форму от данных предыдущей загрузки,
// чтобы при ошибке формата Excel пользователь увидел чистую форму.
НачатьСначала(Неопределено);
//Если ЗначениеЗаполнено(Объект.ДатаЗагрузки) Тогда //Если ЗначениеЗаполнено(Объект.ДатаЗагрузки) Тогда
Режим = РежимДиалогаВыбораФайла.Открытие; Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
@@ -3549,12 +3552,346 @@
ИЛИ Объект.ТабличнаяЧастьОМС.Количество() > 0; ИЛИ Объект.ТабличнаяЧастьОМС.Количество() > 0;
КонецФункции КонецФункции
// Заглушка Прохода А. Полная реализация заполнения ТЧ будет в Проходе Б. // Проход Б: полная обратная загрузка данных табеля в табличные части формы.
&НаКлиенте &НаКлиенте
Асинх Процедура ЗагрузитьДанныеТабеляВФорму(СсылкаНаТабель) Асинх Процедура ЗагрузитьДанныеТабеляВФорму(СсылкаНаТабель)
Ждать ОткрытьЗначениеАсинх(СсылкаНаТабель); Ждать ЗаполнитьТабличныеЧастиИзТабеляНаСервере(СсылкаНаТабель);
ОпределитьВидимостьСтраниц();
Если Объект.ТабличнаяЧастьСГЗ.Количество() > 0 Тогда
ТекущаяСтатьяФинансирования = СтатьяФинансированияСГЗ;
ИначеЕсли Объект.ТабличнаяЧастьПД.Количество() > 0 Тогда
ТекущаяСтатьяФинансирования = СтатьяФинансированияПД;
ИначеЕсли Объект.ТабличнаяЧастьОМС.Количество() > 0 Тогда
ТекущаяСтатьяФинансирования = СтатьяФинансированияОМС;
КонецЕсли;
Элементы.ГруппаСтраницы.ТекущаяСтраница = СтраницаФормыПоСтатьеФинансирования(ТекущаяСтатьяФинансирования);
КонецПроцедуры КонецПроцедуры
&НаСервере
Функция ЗаполнитьТабличныеЧастиИзТабеляНаСервере(СсылкаНаТабель)
Если НЕ ЗначениеЗаполнено(СсылкаНаТабель) Тогда
Возврат Неопределено;
КонецЕсли;
ТабельОбъект = СсылкаНаТабель.ПолучитьОбъект();
Если ТабельОбъект = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
// Формируем выборку по (Сотрудник, Финансирование, День).
ДанныеПоСотрудникам = Новый Соответствие;
Для Каждого СтрокаТЧ Из ТабельОбъект.ДанныеОВремени Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТЧ.Сотрудник) Тогда
Продолжить;
КонецЕсли;
Для НомерДня = 1 По 31 Цикл
ВидВремени = СтрокаТЧ["ВидВремени" + НомерДня];
Если НЕ ЗначениеЗаполнено(ВидВремени) Тогда
Продолжить;
КонецЕсли;
Часы = СтрокаТЧ["Часов" + НомерДня];
Финансирование = ФинансированиеПоВидуВремени(ВидВремени);
Если Финансирование = Неопределено Тогда
Продолжить;
КонецЕсли;
Сотрудники = ДанныеПоСотрудникам[СтрокаТЧ.Сотрудник];
Если Сотрудники = Неопределено Тогда
Сотрудники = Новый Соответствие;
ДанныеПоСотрудникам.Вставить(СтрокаТЧ.Сотрудник, Сотрудники);
КонецЕсли;
ПоФинансированию = Сотрудники[Финансирование];
Если ПоФинансированию = Неопределено Тогда
ПоФинансированию = Новый Соответствие;
Сотрудники.Вставить(Финансирование, ПоФинансированию);
КонецЕсли;
ПоДню = ПоФинансированию[НомерДня];
Если ПоДню = Неопределено Тогда
ПоДню = Новый Массив;
ПоФинансированию.Вставить(НомерДня, ПоДню);
КонецЕсли;
ЗаписьДня = Новый Структура("ВидВремени, Часы", ВидВремени, Часы);
ПоДню.Добавить(ЗаписьДня);
КонецЦикла;
КонецЦикла;
// Прямо заполняем ТЧ объекта обработки.
Объект.ТабличнаяЧастьСГЗ.Очистить();
Объект.ТабличнаяЧастьПД.Очистить();
Объект.ТабличнаяЧастьОМС.Очистить();
Для Каждого КЗ_Сотрудник Из ДанныеПоСотрудникам Цикл
Сотрудник = КЗ_Сотрудник.Ключ;
ДанныеСотрудника = КЗ_Сотрудник.Значение;
Для Каждого КЗ_Фин Из ДанныеСотрудника Цикл
Финансирование = КЗ_Фин.Ключ;
ДанныеПоДням = КЗ_Фин.Значение;
ТЧ = Объект["ТабличнаяЧасть" + Финансирование];
СтрокаОсновная = ТЧ.Добавить();
СтрокаОсновная.Сотрудник = Сотрудник;
СтрокаОсновная.ТабельныйНомер = Сотрудник.Код;
СтрокаНочные = ТЧ.Добавить();
СтрокаНочные.Сотрудник = Сотрудник;
СтрокаНочные.ТабельныйНомер = Сотрудник.Код;
СтрокаСверхурочные = ТЧ.Добавить();
СтрокаСверхурочные.Сотрудник = Сотрудник;
СтрокаСверхурочные.ТабельныйНомер = Сотрудник.Код;
Для НомерДня = 1 По 31 Цикл
ЗаписиДня = ДанныеПоДням[НомерДня];
Если ЗаписиДня = Неопределено Тогда
Продолжить;
КонецЕсли;
Классификация = КлассифицироватьДень(ЗаписиДня);
Если Классификация.Основная <> Неопределено Тогда
СтрокаОсновная["Часов" + НомерДня] = Классификация.Основная.Часы;
СтрокаОсновная["Время" + НомерДня + "Буква"] = Классификация.Основная.Буква;
СтрокаОсновная["ВидВремени" + НомерДня] = Классификация.Основная.ВидВремени;
КонецЕсли;
Если Классификация.Ночные <> Неопределено Тогда
СтрокаНочные["Часов" + НомерДня] = Классификация.Ночные.Часы;
СтрокаНочные["Время" + НомерДня + "Буква"] = Классификация.Ночные.Буква;
СтрокаНочные["ВидВремени" + НомерДня] = Классификация.Ночные.ВидВремени;
КонецЕсли;
Если Классификация.Сверхурочные <> Неопределено Тогда
СтрокаСверхурочные["Часов" + НомерДня] = Классификация.Сверхурочные.Часы;
СтрокаСверхурочные["Время" + НомерДня + "Буква"] = Классификация.Сверхурочные.Буква;
СтрокаСверхурочные["ВидВремени" + НомерДня] = Классификация.Сверхурочные.ВидВремени;
КонецЕсли;
КонецЦикла;
Если СтрокаПустаяПоЧасам(СтрокаНочные) Тогда
ТЧ.Удалить(СтрокаНочные);
Иначе
СтрокаНочные.ВремяИтог = РассчитатьВремяИтог(СтрокаНочные);
КонецЕсли;
Если СтрокаПустаяПоЧасам(СтрокаСверхурочные) Тогда
ТЧ.Удалить(СтрокаСверхурочные);
Иначе
СтрокаСверхурочные.ВремяИтог = РассчитатьВремяИтог(СтрокаСверхурочные);
КонецЕсли;
СтрокаОсновная.ВремяИтог = РассчитатьВремяИтог(СтрокаОсновная);
КонецЦикла;
КонецЦикла;
Возврат Неопределено;
КонецФункции
&НаСервере
Функция ФинансированиеПоВидуВремени(ВидВремени)
Если ВидВремени = ВидВремениЯвкаСГЗ
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыСГЗ
ИЛИ ВидВремени = ВидВремениПраздникиСГЗ
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыСГЗ
ИЛИ ВидВремени = ВидВремениСверхурочныеСГЗ
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыСГЗ Тогда
Возврат "СГЗ";
ИначеЕсли ВидВремени = ВидВремениЯвкаПД
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыПД
ИЛИ ВидВремени = ВидВремениПраздникиПД
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыПД
ИЛИ ВидВремени = ВидВремениСверхурочныеПД
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыПД Тогда
Возврат "ПД";
ИначеЕсли ВидВремени = ВидВремениЯвкаОМС
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыОМС
ИЛИ ВидВремени = ВидВремениПраздникиОМС
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыОМС
ИЛИ ВидВремени = ВидВремениСверхурочныеОМС
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыОМС Тогда
Возврат "ОМС";
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
&НаСервере
Функция КлассифицироватьДень(ЗаписиДня)
Результат = Новый Структура("Основная, Ночные, Сверхурочные", Неопределено, Неопределено, Неопределено);
ЧасыПраздничных = 0;
ЧасыЯвки = 0;
ЧасыНочных = 0;
ЧасыСверхурочных = 0;
ВидВремениПраздничных = Неопределено;
ВидВремениЯвки = Неопределено;
ВидВремениНочных = Неопределено;
ВидВремениСверхурочных = Неопределено;
ПервыйНеденежный = Неопределено;
Для Каждого Запись Из ЗаписиДня Цикл
ВидВремени = Запись.ВидВремени;
Часы = Запись.Часы;
Если ВидВремениЯвкаПринадлежитФинансированию(ВидВремени) Тогда
ЧасыЯвки = ЧасыЯвки + Часы;
Если ВидВремениЯвки = Неопределено Тогда
ВидВремениЯвки = ВидВремени;
КонецЕсли;
ИначеЕсли ВидВремениПраздникиПринадлежит(ВидВремени) Тогда
ЧасыПраздничных = ЧасыПраздничных + Часы;
Если ВидВремениПраздничных = Неопределено Тогда
ВидВремениПраздничных = ВидВремени;
КонецЕсли;
ИначеЕсли ВидВремениНочныеПринадлежит(ВидВремени) Тогда
ЧасыНочных = ЧасыНочных + Часы;
Если ВидВремениНочных = Неопределено Тогда
ВидВремениНочных = ВидВремени;
КонецЕсли;
ИначеЕсли ВидВремениСверхурочныеПринадлежит(ВидВремени) Тогда
ЧасыСверхурочных = ЧасыСверхурочных + Часы;
Если ВидВремениСверхурочных = Неопределено Тогда
ВидВремениСверхурочных = ВидВремени;
КонецЕсли;
ИначеЕсли ПервыйНеденежный = Неопределено Тогда
ПервыйНеденежный = Новый Структура("Часы, Буква, ВидВремени", Часы, БукваПоВидуВремени(ВидВремени), ВидВремени);
КонецЕсли;
КонецЦикла;
Если ЧасыПраздничных > 0 Тогда
Результат.Основная = Новый Структура("Часы, Буква, ВидВремени", ЧасыПраздничных, "РП", ВидВремениПраздничных);
ИначеЕсли ЧасыЯвки > 0 Тогда
Результат.Основная = Новый Структура("Часы, Буква, ВидВремени", ЧасыЯвки, "Ф", ВидВремениЯвки);
ИначеЕсли ПервыйНеденежный <> Неопределено Тогда
Результат.Основная = ПервыйНеденежный;
КонецЕсли;
Если ЧасыНочных > 0 Тогда
Результат.Ночные = Новый Структура("Часы, Буква, ВидВремени", ЧасыНочных, "Н", ВидВремениНочных);
КонецЕсли;
Если ЧасыСверхурочных > 0 Тогда
Результат.Сверхурочные = Новый Структура("Часы, Буква, ВидВремени", ЧасыСверхурочных, "С", ВидВремениСверхурочных);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция СтрокаПустаяПоЧасам(СтрокаТЧ)
Для НомерДня = 1 По 31 Цикл
Если СтрокаТЧ["Часов" + НомерДня] > 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервере
Функция ВидВремениЯвкаПринадлежитФинансированию(ВидВремени)
Возврат ВидВремени = ВидВремениЯвкаСГЗ
ИЛИ ВидВремени = ВидВремениЯвкаПД
ИЛИ ВидВремени = ВидВремениЯвкаОМС;
КонецФункции
&НаСервере
Функция ВидВремениПраздникиПринадлежит(ВидВремени)
Возврат ВидВремени = ВидВремениПраздникиСГЗ
ИЛИ ВидВремени = ВидВремениПраздникиПД
ИЛИ ВидВремени = ВидВремениПраздникиОМС
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыСГЗ
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыПД
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыОМС;
КонецФункции
&НаСервере
Функция ВидВремениНочныеПринадлежит(ВидВремени)
Возврат ВидВремени = ВидВремениРаботаНочныеЧасыСГЗ
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыПД
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыОМС;
КонецФункции
&НаСервере
Функция ВидВремениСверхурочныеПринадлежит(ВидВремени)
Возврат ВидВремени = ВидВремениСверхурочныеСГЗ
ИЛИ ВидВремени = ВидВремениСверхурочныеПД
ИЛИ ВидВремени = ВидВремениСверхурочныеОМС
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыСГЗ
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыПД
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыОМС
ИЛИ ВидВремени = ВидВремениКормлениеРебенка()
ИЛИ ВидВремени = ВидВремениПовышениеКвалификации();
КонецФункции
&НаСервере
Функция БукваПоВидуВремени(ВидВремени)
Если ВидВремени = ВидВремениБолезнь() Тогда
Возврат "Б";
ИначеЕсли ВидВремени = ВидВремениВыходныеДни() Тогда
Возврат "В";
ИначеЕсли ВидВремени = ВидВремениОсновнойОтпуск() Тогда
Возврат "О";
ИначеЕсли ВидВремени = ВидВремениДополнительныйОтпуск() Тогда
Возврат "ОД";
ИначеЕсли ВидВремени = ВидВремениКомандировка() Тогда
Возврат "К";
ИначеЕсли ВидВремени = ВидВремениПрогулы() Тогда
Возврат "П";
ИначеЕсли ВидВремени = ВидВремениНеявкиПоНевыясненнымПричинам() Тогда
Возврат "НН";
ИначеЕсли ВидВремени = ВидВремениОтпускНаОбучение() Тогда
Возврат "ОУ";
ИначеЕсли ВидВремени = ВидВремениОтпускПоБеременностиИРодам() Тогда
Возврат "Р";
ИначеЕсли ВидВремени = ВидВремениОтпускПоУходуЗаРебенком() Тогда
Возврат "ОР";
ИначеЕсли ВидВремени = ВидВремениНеоплачиваемыйОтпускПоРазрешениюРаботодателя() Тогда
Возврат "ОЗ";
ИначеЕсли ВидВремени = ВидВремениОтстранениеОтРаботыБезОплаты() Тогда
Возврат "НБ";
ИначеЕсли ВидВремени = ВидВремениОтстранениеОтРаботыСОплатой() Тогда
Возврат "НО";
Иначе
Возврат "";
КонецЕсли;
КонецФункции
&НаСервере
Функция РассчитатьВремяИтог(СтрокаТЧ)
ГруппировкаЧасов = Новый Соответствие;
Для НомерДня = 1 По 31 Цикл
Часы = СтрокаТЧ["Часов" + НомерДня];
Если Часы = 0 Тогда
Продолжить;
КонецЕсли;
Буква = СтрокаТЧ["Время" + НомерДня + "Буква"];
Если Буква = "" Тогда
Продолжить;
КонецЕсли;
ТекущаяСумма = ГруппировкаЧасов[Буква];
Если ТекущаяСумма = Неопределено Тогда
ТекущаяСумма = 0;
КонецЕсли;
ГруппировкаЧасов.Вставить(Буква, ТекущаяСумма + Часы);
КонецЦикла;
Результат = "";
Для Каждого КЗ Из ГруппировкаЧасов Цикл
Если Результат <> "" Тогда
Результат = Результат + ", ";
КонецЕсли;
Результат = Результат + КЗ.Ключ + " " + Формат(КЗ.Значение, "ЧРД=.; ЧГ=");
КонецЦикла;
Возврат Результат;
КонецФункции
// Серверная обёртка для вызова с клиента без контекста формы. // Серверная обёртка для вызова с клиента без контекста формы.
&НаСервереБезКонтекста &НаСервереБезКонтекста
Функция НайтиСсылкуНаТабельНаСервере(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации) Функция НайтиСсылкуНаТабельНаСервере(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации)
@@ -3611,3 +3948,4 @@
Возврат Выборка.ТабельУчетаРабочегоВремени; Возврат Выборка.ТабельУчетаРабочегоВремени;
КонецФункции КонецФункции