Перенос общих функций в серверный модуль

Подготовка к переносу работы с табелем в сервис
This commit is contained in:
4 changed files with 585 additions and 56 deletions
@@ -0,0 +1,561 @@
// Серверные функции для работы с табелем учёта рабочего времени.
// Перенесены из модуля формы обработки ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL.
#Область СлужебныеПроцедурыИФункции
// Поиск элементов справочника ВидыИспользованияРабочегоВремени по наименованию.
// Используется как замена прямого обращения к реквизитам формы обработки.
// Имена элементов зафиксированы в проекте и не подлежат изменению.
Функция ВидВремениЯвкаСГЗ()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Явка (СГЗ)", Истина);
КонецФункции
Функция ВидВремениЯвкаПД()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Явка (ПД)", Истина);
КонецФункции
Функция ВидВремениЯвкаОМС()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Явка (ОМС)", Истина);
КонецФункции
Функция ВидВремениПраздникиСГЗ()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Праздники (СГЗ)", Истина);
КонецФункции
Функция ВидВремениПраздникиПД()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Праздники (ПД)", Истина);
КонецФункции
Функция ВидВремениПраздникиОМС()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Праздники (ОМС)", Истина);
КонецФункции
Функция ВидВремениПраздникиБезПовышеннойОплатыСГЗ()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Праздники без повышенной оплаты (СГЗ)", Истина);
КонецФункции
Функция ВидВремениПраздникиБезПовышеннойОплатыПД()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Праздники без повышенной оплаты (ПД)", Истина);
КонецФункции
Функция ВидВремениПраздникиБезПовышеннойОплатыОМС()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Праздники без повышенной оплаты (ОМС)", Истина);
КонецФункции
Функция ВидВремениРаботаНочныеЧасыСГЗ()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Работа ночные часы (СГЗ)", Истина);
КонецФункции
Функция ВидВремениРаботаНочныеЧасыПД()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Работа ночные часы (ПД)", Истина);
КонецФункции
Функция ВидВремениРаботаНочныеЧасыОМС()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Работа ночные часы (ОМС)", Истина);
КонецФункции
Функция ВидВремениСверхурочныеСГЗ()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Сверхурочные (СГЗ)", Истина);
КонецФункции
Функция ВидВремениСверхурочныеПД()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Сверхурочные (ПД)", Истина);
КонецФункции
Функция ВидВремениСверхурочныеОМС()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Сверхурочные (ОМС)", Истина);
КонецФункции
Функция ВидВремениСверхурочныеБезПовышеннойОплатыСГЗ()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Сверхурочные без повышенной оплаты (СГЗ)", Истина);
КонецФункции
Функция ВидВремениСверхурочныеБезПовышеннойОплатыПД()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Сверхурочные без повышенной оплаты (ПД)", Истина);
КонецФункции
Функция ВидВремениСверхурочныеБезПовышеннойОплатыОМС()
Возврат Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Сверхурочные без повышенной оплаты (ОМС)", Истина);
КонецФункции
// Статьи финансирования — ищем предопределённые элементы.
Функция СтатьяФинансированияСГЗ()
Возврат Справочники.СтатьиФинансированияЗарплата.НайтиПоНаименованию("СГЗ", Истина);
КонецФункции
Функция СтатьяФинансированияПД()
Возврат Справочники.СтатьиФинансированияЗарплата.НайтиПоНаименованию("ПД", Истина);
КонецФункции
Функция СтатьяФинансированияОМС()
Возврат Справочники.СтатьиФинансированияЗарплата.НайтиПоНаименованию("ОМС", Истина);
КонецФункции
#КонецОбласти
#Область ПолучениеВидовВремени
// Возвращает элемент справочника ВидыИспользованияРабочегоВремени для вида «Явка»
// по текущей статье финансирования (СГЗ / ПД / ОМС).
//
// Параметры:
// СтатьяФинансирования - CatalogRef.СтатьиФинансированияЗарплата
//
// Возвращаемое значение:
// CatalogRef.ВидыИспользованияРабочегоВремени
//
Функция ВидВремениЯвка(СтатьяФинансирования) Экспорт
Если СтатьяФинансирования = СтатьяФинансированияСГЗ() Тогда
Возврат ВидВремениЯвкаСГЗ();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияПД() Тогда
Возврат ВидВремениЯвкаПД();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияОМС() Тогда
Возврат ВидВремениЯвкаОМС();
КонецЕсли;
КонецФункции
// Возвращает элемент справочника для вида «Болезнь».
Функция ВидВремениБолезнь() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.Болезнь;
КонецФункции
Функция ВидВремениВыходныеДни() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ВыходныеДни;
КонецФункции
Функция ВидВремениДополнительныйОтпуск() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ДополнительныйОтпуск;
КонецФункции
Функция ВидВремениКомандировка() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.Командировка;
КонецФункции
Функция ВидВремениКормлениеРебенка() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.КормлениеРебенка;
КонецФункции
Функция ВидВремениНеявкиПоНевыясненнымПричинам() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.НеявкиПоНевыясненнымПричинам;
КонецФункции
Функция ВидВремениНеоплачиваемыйОтпускПоРазрешениюРаботодателя() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.НеоплачиваемыйОтпускПоРазрешениюРаботодателя;
КонецФункции
Функция ВидВремениОтстранениеОтРаботыБезОплаты() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ОтстранениеОтРаботыБезОплаты;
КонецФункции
Функция ВидВремениОтстранениеОтРаботыСОплатой() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ОтстранениеОтРаботыСОплатой;
КонецФункции
Функция ВидВремениОплачиваемыеНерабочиеДни() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ОплачиваемыеНерабочиеДни;
КонецФункции
Функция ВидВремениОсновнойОтпуск() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ОсновнойОтпуск;
КонецФункции
Функция ВидВремениОтпускНаОбучение() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ОтпускНаОбучение;
КонецФункции
Функция ВидВремениОтпускПоБеременностиИРодам() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ОтпускПоБеременностиИРодам;
КонецФункции
Функция ВидВремениОтпускПоУходуЗаРебенком() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ОтпускПоУходуЗаРебенком;
КонецФункции
// В исходном коде модуля формы эта функция возвращает ОтпускПоУходуЗаРебенком —
// копируем как есть (так зафиксировано в проекте).
Функция ВидВремениДополнительныеВыходныеДниОплачиваемые() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ОтпускПоУходуЗаРебенком;
КонецФункции
Функция ВидВремениПовышениеКвалификации() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.ПовышениеКвалификации;
КонецФункции
Функция ВидВремениПраздники(СтатьяФинансирования) Экспорт
Если СтатьяФинансирования = СтатьяФинансированияСГЗ() Тогда
Возврат ВидВремениПраздникиСГЗ();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияПД() Тогда
Возврат ВидВремениПраздникиПД();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияОМС() Тогда
Возврат ВидВремениПраздникиОМС();
КонецЕсли;
КонецФункции
Функция ВидВремениПраздникиБезПовышеннойОплаты(СтатьяФинансирования) Экспорт
Если СтатьяФинансирования = СтатьяФинансированияСГЗ() Тогда
Возврат ВидВремениПраздникиБезПовышеннойОплатыСГЗ();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияПД() Тогда
Возврат ВидВремениПраздникиБезПовышеннойОплатыПД();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияОМС() Тогда
Возврат ВидВремениПраздникиБезПовышеннойОплатыОМС();
КонецЕсли;
КонецФункции
Функция ВидВремениПрогулы() Экспорт
Возврат Справочники.ВидыИспользованияРабочегоВремени.Прогулы;
КонецФункции
Функция ВидВремениРаботаНочныеЧасы(СтатьяФинансирования) Экспорт
Если СтатьяФинансирования = СтатьяФинансированияСГЗ() Тогда
Возврат ВидВремениРаботаНочныеЧасыСГЗ();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияПД() Тогда
Возврат ВидВремениРаботаНочныеЧасыПД();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияОМС() Тогда
Возврат ВидВремениРаботаНочныеЧасыОМС();
КонецЕсли;
КонецФункции
Функция ВидВремениСверхурочные(СтатьяФинансирования) Экспорт
Если СтатьяФинансирования = СтатьяФинансированияСГЗ() Тогда
Возврат ВидВремениСверхурочныеСГЗ();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияПД() Тогда
Возврат ВидВремениСверхурочныеПД();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияОМС() Тогда
Возврат ВидВремениСверхурочныеОМС();
КонецЕсли;
КонецФункции
Функция ВидВремениСверхурочныеБезПовышеннойОплаты(СтатьяФинансирования) Экспорт
Если СтатьяФинансирования = СтатьяФинансированияСГЗ() Тогда
Возврат ВидВремениСверхурочныеБезПовышеннойОплатыСГЗ();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияПД() Тогда
Возврат ВидВремениСверхурочныеБезПовышеннойОплатыПД();
ИначеЕсли СтатьяФинансирования = СтатьяФинансированияОМС() Тогда
Возврат ВидВремениСверхурочныеБезПовышеннойОплатыОМС();
КонецЕсли;
КонецФункции
#КонецОбласти
#Область КлассификацияВидовВремени
// Возвращает код финансирования ("СГЗ"/"ПД"/"ОМС") для указанного вида времени.
// Для неденежных видов (болезнь, отпуск и т.п.) возвращает Неопределено.
Функция ФинансированиеПоВидуВремени(ВидВремени) Экспорт
Если ВидВремени = ВидВремениЯвкаСГЗ()
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыСГЗ()
ИЛИ ВидВремени = ВидВремениПраздникиСГЗ()
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыСГЗ()
ИЛИ ВидВремени = ВидВремениСверхурочныеСГЗ()
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыСГЗ() Тогда
Возврат "СГЗ";
ИначеЕсли ВидВремени = ВидВремениЯвкаПД()
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыПД()
ИЛИ ВидВремени = ВидВремениПраздникиПД()
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыПД()
ИЛИ ВидВремени = ВидВремениСверхурочныеПД()
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыПД() Тогда
Возврат "ПД";
ИначеЕсли ВидВремени = ВидВремениЯвкаОМС()
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыОМС()
ИЛИ ВидВремени = ВидВремениПраздникиОМС()
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыОМС()
ИЛИ ВидВремени = ВидВремениСверхурочныеОМС()
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыОМС() Тогда
Возврат "ОМС";
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция ВидВремениЯвкаПринадлежитФинансированию(ВидВремени) Экспорт
Возврат ВидВремени = ВидВремениЯвкаСГЗ()
ИЛИ ВидВремени = ВидВремениЯвкаПД()
ИЛИ ВидВремени = ВидВремениЯвкаОМС();
КонецФункции
Функция ВидВремениПраздникиПринадлежит(ВидВремени) Экспорт
Возврат ВидВремени = ВидВремениПраздникиСГЗ()
ИЛИ ВидВремени = ВидВремениПраздникиПД()
ИЛИ ВидВремени = ВидВремениПраздникиОМС()
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыСГЗ()
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыПД()
ИЛИ ВидВремени = ВидВремениПраздникиБезПовышеннойОплатыОМС();
КонецФункции
Функция ВидВремениНочныеПринадлежит(ВидВремени) Экспорт
Возврат ВидВремени = ВидВремениРаботаНочныеЧасыСГЗ()
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыПД()
ИЛИ ВидВремени = ВидВремениРаботаНочныеЧасыОМС();
КонецФункции
Функция ВидВремениСверхурочныеПринадлежит(ВидВремени) Экспорт
Возврат ВидВремени = ВидВремениСверхурочныеСГЗ()
ИЛИ ВидВремени = ВидВремениСверхурочныеПД()
ИЛИ ВидВремени = ВидВремениСверхурочныеОМС()
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыСГЗ()
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыПД()
ИЛИ ВидВремени = ВидВремениСверхурочныеБезПовышеннойОплатыОМС()
ИЛИ ВидВремени = ВидВремениКормлениеРебенка()
ИЛИ ВидВремени = ВидВремениПовышениеКвалификации();
КонецФункции
// Возвращает буквенное обозначение вида времени (для UI/Excel-формата).
Функция БукваПоВидуВремени(ВидВремени) Экспорт
Если ВидВремени = ВидВремениБолезнь() Тогда
Возврат "Б";
ИначеЕсли ВидВремени = ВидВремениВыходныеДни() Тогда
Возврат "В";
ИначеЕсли ВидВремени = ВидВремениОсновнойОтпуск() Тогда
Возврат "О";
ИначеЕсли ВидВремени = ВидВремениДополнительныйОтпуск() Тогда
Возврат "ОД";
ИначеЕсли ВидВремени = ВидВремениКомандировка() Тогда
Возврат "К";
ИначеЕсли ВидВремени = ВидВремениПрогулы() Тогда
Возврат "П";
ИначеЕсли ВидВремени = ВидВремениНеявкиПоНевыясненнымПричинам() Тогда
Возврат "НН";
ИначеЕсли ВидВремени = ВидВремениОтпускНаОбучение() Тогда
Возврат "ОУ";
ИначеЕсли ВидВремени = ВидВремениОтпускПоБеременностиИРодам() Тогда
Возврат "Р";
ИначеЕсли ВидВремени = ВидВремениОтпускПоУходуЗаРебенком() Тогда
Возврат "ОР";
ИначеЕсли ВидВремени = ВидВремениНеоплачиваемыйОтпускПоРазрешениюРаботодателя() Тогда
Возврат "ОЗ";
ИначеЕсли ВидВремени = ВидВремениОтстранениеОтРаботыБезОплаты() Тогда
Возврат "НБ";
ИначеЕсли ВидВремени = ВидВремениОтстранениеОтРаботыСОплатой() Тогда
Возврат "НО";
Иначе
Возврат "";
КонецЕсли;
КонецФункции
#КонецОбласти
#Область ОбратноеПреобразование
// Классифицирует записи дня для обратной загрузки из табеля в ТЧ формы.
//
// Параметры:
// ЗаписиДня - Массив из Структура (ключи "ВидВремени", "Часы")
//
// Возвращаемое значение:
// Структура с ключами "Основная", "Ночные", "Сверхурочные".
// Каждое значение — Структура("Часы, Буква, ВидВремени") или Неопределено.
//
Функция КлассифицироватьДень(ЗаписиДня) Экспорт
Результат = Новый Структура("Основная, Ночные, Сверхурочные", Неопределено, Неопределено, Неопределено);
ЧасыПраздничных = 0;
ЧасыЯвки = 0;
ЧасыНочных = 0;
ЧасыСверхурочных = 0;
ВидВремениПраздничных = Неопределено;
ВидВремениЯвки = Неопределено;
ВидВремениНочных = Неопределено;
ВидВремениСверхурочных = Неопределено;
ПервыйНеденежный = Неопределено;
Для Каждого Запись Из ЗаписиДня Цикл
ВидВремени = Запись.ВидВремени;
Часы = Запись.Часы;
Если ВидВремениЯвкаПринадлежитФинансированию(ВидВремени) Тогда
ЧасыЯвки = ЧасыЯвки + Часы;
Если ВидВремениЯвки = Неопределено Тогда
ВидВремениЯвки = ВидВремени;
КонецЕсли;
ИначеЕсли ВидВремениПраздникиПринадлежит(ВидВремени) Тогда
ЧасыПраздничных = ЧасыПраздничных + Часы;
Если ВидВремениПраздничных = Неопределено Тогда
ВидВремениПраздничных = ВидВремени;
КонецЕсли;
ИначеЕсли ВидВремениНочныеПринадлежит(ВидВремени) Тогда
ЧасыНочных = ЧасыНочных + Часы;
Если ВидВремениНочных = Неопределено Тогда
ВидВремениНочных = ВидВремени;
КонецЕсли;
ИначеЕсли ВидВремениСверхурочныеПринадлежит(ВидВремени) Тогда
ЧасыСверхурочных = ЧасыСверхурочных + Часы;
Если ВидВремениСверхурочных = Неопределено Тогда
ВидВремениСверхурочных = ВидВремени;
КонецЕсли;
ИначеЕсли ПервыйНеденежный = Неопределено Тогда
ПервыйНеденежный = Новый Структура("Часы, Буква, ВидВремени", Часы, БукваПоВидуВремени(ВидВремени), ВидВремени);
КонецЕсли;
КонецЦикла;
Если ЧасыПраздничных > 0 Тогда
Результат.Основная = Новый Структура("Часы, Буква, ВидВремени", ЧасыПраздничных, "РП", ВидВремениПраздничных);
ИначеЕсли ЧасыЯвки > 0 Тогда
Результат.Основная = Новый Структура("Часы, Буква, ВидВремени", ЧасыЯвки, "Ф", ВидВремениЯвки);
ИначеЕсли ПервыйНеденежный <> Неопределено Тогда
Результат.Основная = ПервыйНеденежный;
КонецЕсли;
Если ЧасыНочных > 0 Тогда
Результат.Ночные = Новый Структура("Часы, Буква, ВидВремени", ЧасыНочных, "Н", ВидВремениНочных);
КонецЕсли;
Если ЧасыСверхурочных > 0 Тогда
Результат.Сверхурочные = Новый Структура("Часы, Буква, ВидВремени", ЧасыСверхурочных, "С", ВидВремениСверхурочных);
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает Истина, если во всех 31 колонках ЧасовN строки значение <= 0.
Функция СтрокаПустаяПоЧасам(СтрокаТЧ) Экспорт
Для НомерДня = 1 По 31 Цикл
Если СтрокаТЧ["Часов" + НомерДня] > 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// Группирует часы по буквенным кодам и формирует строку вида "Я 7, Б 10".
Функция РассчитатьВремяИтог(СтрокаТЧ) Экспорт
ГруппировкаЧасов = Новый Соответствие;
Для НомерДня = 1 По 31 Цикл
Часы = СтрокаТЧ["Часов" + НомерДня];
Если Часы = 0 Тогда
Продолжить;
КонецЕсли;
Буква = СтрокаТЧ["Время" + НомерДня + "Буква"];
Если Буква = "" Тогда
Продолжить;
КонецЕсли;
ТекущаяСумма = ГруппировкаЧасов[Буква];
Если ТекущаяСумма = Неопределено Тогда
ТекущаяСумма = 0;
КонецЕсли;
ГруппировкаЧасов.Вставить(Буква, ТекущаяСумма + Часы);
КонецЦикла;
Результат = "";
Для Каждого КЗ Из ГруппировкаЧасов Цикл
Если Результат <> "" Тогда
Результат = Результат + ", ";
КонецЕсли;
Результат = Результат + КЗ.Ключ + " " + Формат(КЗ.Значение, "ЧРД=.; ЧГ=");
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область Валидация
// Проверяет, есть ли в записях дня другие виды времени, отличные от указанного.
Функция ЕстьНесовместимыеВидыВремени(Сотрудник, НомерДня, ТаблицаДня, ВидВремени) Экспорт
НесовместимыеВидыВремениНайдены = Ложь;
СписокНесовместимыхВидовВремени = "";
Для каждого СтрокаТаблицыДня Из ТаблицаДня Цикл
Если СтрокаТаблицыДня.ВидВремени <> ВидВремени Тогда
Если СписокНесовместимыхВидовВремени = "" Тогда
СписокНесовместимыхВидовВремени = Строка(СтрокаТаблицыДня.ВидВремени);
Иначе
СписокНесовместимыхВидовВремени = СписокНесовместимыхВидовВремени + ", " + Строка(СтрокаТаблицыДня.ВидВремени);
КонецЕсли;
НесовместимыеВидыВремениНайдены = Истина;
КонецЕсли;
КонецЦикла;
Возврат НесовместимыеВидыВремениНайдены;
КонецФункции
#КонецОбласти
#Область ПоискСотрудников
// Возвращает табельный номер (поле Код) для указанного сотрудника.
Функция ТабельныйНомерСотрудникаБД(Сотрудник) Экспорт
Возврат Сотрудник.Код;
КонецФункции
// Получает последнюю кадровую историю сотрудника.
Функция КадровыеДанные(Сотрудник, ДатаПолученияКадровыхДанных) Экспорт
СтруктураПоискаКадровыхДанных = Новый Структура("Сотрудник", Сотрудник);
Возврат РегистрыСведений.КадроваяИсторияСотрудников.ПолучитьПоследнее(ДатаПолученияКадровыхДанных, СтруктураПоискаКадровыхДанных);
КонецФункции
// Возвращает пустую структуру данных сотрудника (используется как фабрика).
Функция СтруктураДанныхСотрудника() Экспорт
Возврат Новый Структура("Сотрудник,Должность,НаименованиеДолжностиДляТабеля,ДолжностьПоШтатномуРасписанию,Подразделение,ВидЗанятости,КоличествоСтавок," +
"ПредставлениеСотрудника,ПредставлениеДолжности,ПредставлениеПодразделения,Обработан",
Справочники.Сотрудники.ПустаяСсылка(),
Справочники.Должности.ПустаяСсылка(), "",
Справочники.ШтатноеРасписание.ПустаяСсылка(),
Справочники.ПодразделенияОрганизаций.ПустаяСсылка(),
"",
0,
"", "", "",
Ложь);
КонецФункции
#КонецОбласти
#Область ФильтрацияСотрудников
// Проверяет, есть ли сотрудник в списке совместителей (по физическому лицу).
Функция СотрудникВСпискеСовместителей(Сотрудник, СписокСовместителей) Экспорт
Результат = Ложь;
Попытка
Если СписокСовместителей.Количество() > 0 Тогда
Если Сотрудник.ФизическоеЛицо = СписокСовместителей[0].Сотрудник.ФизическоеЛицо Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Исключение
КонецПопытки;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область ПоискТабеля
// Ищет ссылку на сохранённый табель по ключевым реквизитам через РС ПС_ЗагруженныеТабеля.
// Возвращает последнюю по дате загрузки редакцию.
Функция НайтиСсылкуНаТабель(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации) Экспорт
Если НЕ ЗначениеЗаполнено(Организация)
ИЛИ НЕ ЗначениеЗаполнено(Подразделение)
ИЛИ ПустаяСтрока(НаименованиеПодразделения)
ИЛИ НЕ ЗначениеЗаполнено(ПериодРегистрации) Тогда
Возврат Документы.ТабельУчетаРабочегоВремени.ПустаяСсылка();
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПС_ЗагруженныеТабеляСрезПоследних.ТабельУчетаРабочегоВремени КАК ТабельУчетаРабочегоВремени
|ИЗ
| РегистрСведений.ПС_ЗагруженныеТабеля.СрезПоследних(
| &ПериодРегистрации,
| Организация = &Организация
| И НаименованиеПодразделенияПоТабелю = &НаименованиеПодразделения
| И ПериодВводаДанныхОВремени = &ПериодВводаДанныхОВремени
| И СтруктурноеПодразделение = &СтруктурноеПодразделение) КАК ПС_ЗагруженныеТабеляСрезПоследних
|УПОРЯДОЧИТЬ ПО
| ПС_ЗагруженныеТабеляСрезПоследних.ДатаЗагрузки УБЫВ";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("СтруктурноеПодразделение", Подразделение);
Запрос.УстановитьПараметр("НаименованиеПодразделения", НаименованиеПодразделения);
Запрос.УстановитьПараметр("ПериодВводаДанныхОВремени", Перечисления.ПериодыВводаДанныхОВремени.ТекущийМесяц);
Запрос.УстановитьПараметр("ПериодРегистрации", НачалоМесяца(ПериодРегистрации));
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Документы.ТабельУчетаРабочегоВремени.ПустаяСсылка();
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.ТабельУчетаРабочегоВремени;
КонецФункции
#КонецОбласти
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ce51cd3a-9b22-4c6a-9f49-7b3b1fa0f1aa">
<name>ПС_ТабелиСервер</name>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
<returnValuesReuse>DuringSession</returnValuesReuse>
</mdclass:CommonModule>
@@ -77,6 +77,7 @@
<commonModules>CommonModule.УчетРабочегоВремениРасширенный</commonModules>
<commonModules>CommonModule.ПС_ЗагрузкаДанныхИзExcel_Описание</commonModules>
<commonModules>CommonModule.ПС_КартаДанных</commonModules>
<commonModules>CommonModule.ПС_ТабелиСервер</commonModules>
<catalogs>Catalog.Организации</catalogs>
<catalogs>Catalog.ПодразделенияОрганизаций</catalogs>
<catalogs>Catalog.Пользователи</catalogs>
@@ -3515,7 +3515,7 @@
Возврат;
КонецЕсли;
СсылкаНаТабель = Ждать НайтиСсылкуНаТабельАсинх();
СсылкаНаТабель = НайтиСсылкуНаТабельАсинх();
Если НЕ ЗначениеЗаполнено(СсылкаНаТабель) Тогда
Возврат;
КонецЕсли;
@@ -3555,7 +3555,7 @@
// Проход Б: полная обратная загрузка данных табеля в табличные части формы.
&НаКлиенте
Асинх Процедура ЗагрузитьДанныеТабеляВФорму(СсылкаНаТабель)
Ждать ЗаполнитьТабличныеЧастиИзТабеляНаСервере(СсылкаНаТабель);
ЗаполнитьТабличныеЧастиИзТабеляНаСервере(СсылкаНаТабель);
ОпределитьВидимостьСтраниц();
@@ -3722,6 +3722,16 @@
КонецЕсли;
КонецФункции
&НаСервере
Функция СтрокаПустаяПоЧасам(СтрокаТЧ)
Для НомерДня = 1 По 31 Цикл
Если СтрокаТЧ["Часов" + НомерДня] > 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервере
Функция КлассифицироватьДень(ЗаписиДня)
Результат = Новый Структура("Основная, Ночные, Сверхурочные", Неопределено, Неопределено, Неопределено);
@@ -3784,16 +3794,6 @@
Возврат Результат;
КонецФункции
&НаСервере
Функция СтрокаПустаяПоЧасам(СтрокаТЧ)
Для НомерДня = 1 По 31 Цикл
Если СтрокаТЧ["Часов" + НомерДня] > 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервере
Функция ВидВремениЯвкаПринадлежитФинансированию(ВидВремени)
Возврат ВидВремени = ВидВремениЯвкаСГЗ
@@ -3895,57 +3895,16 @@
// Серверная обёртка для вызова с клиента без контекста формы.
&НаСервереБезКонтекста
Функция НайтиСсылкуНаТабельНаСервере(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации)
Возврат НайтиСсылкуНаТабель(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации);
Возврат ПС_ТабелиСервер.НайтиСсылкуНаТабель(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации);
КонецФункции
&НаКлиенте
Асинх Функция НайтиСсылкуНаТабельАсинх()
Возврат Ждать НайтиСсылкуНаТабельНаСервере(
Функция НайтиСсылкуНаТабельАсинх()
Возврат НайтиСсылкуНаТабельНаСервере(
Объект.Организация,
Объект.Подразделение,
Объект.НаименованиеПодразделения,
Объект.ПериодРегистрации);
КонецФункции
// Поиск ссылки на табель по ключевым реквизитам.
// Источник: РС ПС_ЗагруженныеТабеля.СрезПоследних (последняя редакция по ДатаЗагрузки).
// Возвращает DocumentRef.ТабельУчетаРабочегоВремени или пустую ссылку.
&НаСервереБезКонтекста
Функция НайтиСсылкуНаТабель(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации)
Если НЕ ЗначениеЗаполнено(Организация)
ИЛИ НЕ ЗначениеЗаполнено(Подразделение)
ИЛИ ПустаяСтрока(НаименованиеПодразделения)
ИЛИ НЕ ЗначениеЗаполнено(ПериодРегистрации) Тогда
Возврат Документы.ТабельУчетаРабочегоВремени.ПустаяСсылка();
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПС_ЗагруженныеТабеляСрезПоследних.ТабельУчетаРабочегоВремени КАК ТабельУчетаРабочегоВремени
|ИЗ
| РегистрСведений.ПС_ЗагруженныеТабеля.СрезПоследних(
| &ПериодРегистрации,
| Организация = &Организация
| И НаименованиеПодразделенияПоТабелю = &НаименованиеПодразделения
| И ПериодВводаДанныхОВремени = &ПериодВводаДанныхОВремени
| И СтруктурноеПодразделение = &СтруктурноеПодразделение) КАК ПС_ЗагруженныеТабеляСрезПоследних
|УПОРЯДОЧИТЬ ПО
| ПС_ЗагруженныеТабеляСрезПоследних.ДатаЗагрузки УБЫВ";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("СтруктурноеПодразделение", Подразделение);
Запрос.УстановитьПараметр("НаименованиеПодразделения", НаименованиеПодразделения);
Запрос.УстановитьПараметр("ПериодВводаДанныхОВремени", Перечисления.ПериодыВводаДанныхОВремени.ТекущийМесяц);
Запрос.УстановитьПараметр("ПериодРегистрации", НачалоМесяца(ПериодРегистрации));
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Документы.ТабельУчетаРабочегоВремени.ПустаяСсылка();
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.ТабельУчетаРабочегоВремени;
КонецФункции