diff --git a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Module.bsl b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Module.bsl index b9ce839..38145be 100644 --- a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Module.bsl +++ b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Module.bsl @@ -232,14 +232,14 @@ &НаКлиенте Функция СтраницаФормыПоСтатьеФинансирования(АнализируемаяСтатьяФинансирования) Если АнализируемаяСтатьяФинансирования = СтатьяФинансированияСГЗ Тогда - Возврат Элементы.ГруппаСтраницаТабельСГЗ + Возврат Элементы.ГруппаСтраницаТабельСГЗ; ИначеЕсли АнализируемаяСтатьяФинансирования = СтатьяФинансированияПД Тогда - Возврат Элементы.ГруппаСтраницаТабельПД + Возврат Элементы.ГруппаСтраницаТабельПД; ИначеЕсли АнализируемаяСтатьяФинансирования = СтатьяФинансированияОМС Тогда - Возврат Элементы.ГруппаСтраницаТабельОМС - КонецЕсли; - Возврат ""; -КонецФункции // ИмяТабличнойЧастиПоИсточникуФинансировани я() + Возврат Элементы.ГруппаСтраницаТабельОМС; + КонецЕсли; + Возврат Элементы.ГруппаСтраницаТабельСГЗ; +КонецФункции &НаКлиенте Функция ЗаписатьКоличествоСотрудниковПоСтатьеФинансирования(АнализируемаяСтатьяФинансирования) @@ -573,6 +573,9 @@ &НаКлиенте Асинх Процедура КомандаОткрыть(Команда) + // Перед открытием файла очищаем форму от данных предыдущей загрузки, + // чтобы при ошибке формата Excel пользователь увидел чистую форму. + НачатьСначала(Неопределено); //Если ЗначениеЗаполнено(Объект.ДатаЗагрузки) Тогда Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); @@ -3549,12 +3552,346 @@ ИЛИ Объект.ТабличнаяЧастьОМС.Количество() > 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 @@ Возврат Выборка.ТабельУчетаРабочегоВремени; КонецФункции +