diff --git a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/Configuration/Configuration.mdo b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/Configuration/Configuration.mdo index df4c7ed..da1063a 100644 --- a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/Configuration/Configuration.mdo +++ b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/Configuration/Configuration.mdo @@ -78,6 +78,7 @@ CommonModule.ПС_ЗагрузкаДанныхИзExcel_Описание CommonModule.ПС_КартаДанных CommonModule.ПС_ТабелиСервер + HTTPService.ПС_ВебСервисТабелей Catalog.Организации Catalog.ПодразделенияОрганизаций Catalog.Пользователи diff --git a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/Module.bsl b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/Module.bsl new file mode 100644 index 0000000..40be5e9 --- /dev/null +++ b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/Module.bsl @@ -0,0 +1,385 @@ +// HTTP-сервис "Веб-сервис табелей". +// Маршруты: +// GET /index — HTML-форма ввода табеля +// GET /me — JSON с данными текущего пользователя +// GET /departments — JSON со списком доступных подразделений +// GET /employees — JSON со списком действующих сотрудников подразделения + +#Область ОбработчикиСобытий + +Функция ОбработкаГлавной(Запрос) + Возврат ГлавнаяHtml(); +КонецФункции + +Функция ОбработкаТекущегоПользователя(Запрос) + Данные = ДанныеТекущегоПользователя(); + Объект = Новый Соответствие; + Объект.Вставить("name", Данные.Имя); + Объект.Вставить("user", Данные.ИмяПользователя); + Возврат JsonОтвет(200, Объект); +КонецФункции + +Функция ОбработкаСпискаПодразделений(Запрос) + Массив = Новый Массив; + Подразделения = ДоступныеПодразделения(); + Для Каждого КлючЗначение Из Подразделения Цикл + П = КлючЗначение.Значение; + Элемент = Новый Соответствие; + Элемент.Вставить("ref", XMLСтрока(П.Ссылка)); + Элемент.Вставить("name", П.Имя); + Массив.Добавить(Элемент); + КонецЦикла; + Объект = Новый Соответствие; + Объект.Вставить("items", Массив); + Возврат JsonОтвет(200, Объект); +КонецФункции + +Функция ОбработкаСпискаСотрудников(Запрос) + СтрокаПодразделения = Запрос.ПараметрыЗапроса.Получить("dep"); + Если СтрокаПодразделения = Неопределено Тогда + СтрокаПодразделения = Запрос.ПараметрыURL.Получить("dep"); + КонецЕсли; + Если СтрокаПодразделения = Неопределено ИЛИ ПустаяСтрока(СтрокаПодразделения) Тогда + Ошибка = Новый Соответствие; + Ошибка.Вставить("error", "Не передано подразделение (dep)"); + Возврат JsonОтвет(400, Ошибка); + КонецЕсли; + + Массив = Новый Массив; + СотрудникиСписок = СотрудникиПодразделения(СтрокаПодразделения); + Для Каждого Строка Из СотрудникиСписок Цикл + Элемент = Новый Соответствие; + Элемент.Вставить("ref", XMLСтрока(Строка.Ссылка)); + Элемент.Вставить("name", Строка.Имя); + Элемент.Вставить("position", Строка.Должность); + Массив.Добавить(Элемент); + КонецЦикла; + + Объект = Новый Соответствие; + Объект.Вставить("items", Массив); + Возврат JsonОтвет(200, Объект); +КонецФункции + +Функция ОбработкаСпискаВидовВремени(Запрос) + Массив = Новый Массив; + ВидыСписок = ВидыВремениСписок(); + Для Каждого Строка Из ВидыСписок Цикл + Элемент = Новый Соответствие; + Элемент.Вставить("ref", XMLСтрока(Строка.Ссылка)); + Элемент.Вставить("letter", Строка.Буква); + Элемент.Вставить("name", Строка.Наименование); + Массив.Добавить(Элемент); + КонецЦикла; + + Объект = Новый Соответствие; + Объект.Вставить("items", Массив); + Возврат JsonОтвет(200, Объект); +КонецФункции + +Функция ОбработкаСпискаИсточниковФинансирования(Запрос) + Массив = Новый Массив; + Для Каждого Строка Из ИсточникиФинансированияСписок() Цикл + Элемент = Новый Соответствие; + Элемент.Вставить("ref", Строка.Код); + Элемент.Вставить("name", Строка.Наименование); + Массив.Добавить(Элемент); + КонецЦикла; + + Объект = Новый Соответствие; + Объект.Вставить("items", Массив); + Возврат JsonОтвет(200, Объект); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// HTML-страница. + +Функция ГлавнаяHtml() + ДанныеПользователя = ДанныеТекущегоПользователя(); + Подразделения = ДоступныеПодразделения(); + + Части = Новый Массив; + Части.Добавить(""); + Части.Добавить(""); + Части.Добавить(""); + Части.Добавить(""); + Части.Добавить("Ввод табеля — MVP"); + Части.Добавить(""); + Части.Добавить(""); + Части.Добавить(""); + Части.Добавить("

Ввод табеля учёта рабочего времени

"); + Части.Добавить("
MVP — проверка концепции.
"); + Части.Добавить("
"); + Части.Добавить("
Пользователь: " + ДанныеПользователя.Имя + "
"); + Части.Добавить("
Подразделений доступно: " + Формат(Подразделения.Количество(), "ЧГ=0") + "
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
"); + Части.Добавить("
Сотрудники появятся после загрузки.
"); + Части.Добавить("
"); + Части.Добавить(""); + Части.Добавить(""); + + ТелоHtml = СтрСоединить(Части, Символы.ПС); + + Ответ = Новый HTTPСервисОтвет(200); + Ответ.Заголовки.Вставить("Content-Type", "text/html; charset=utf-8"); + Ответ.УстановитьТелоИзСтроки(ТелоHtml, КодировкаТекста.UTF8); + Возврат Ответ; +КонецФункции + +Функция ОпцииПодразделений(Подразделения) + Части = Новый Массив; + Для Каждого КлючЗначение Из Подразделения Цикл + Ссылка = XMLСтрока(КлючЗначение.Значение.Ссылка); + Имя = КлючЗначение.Значение.Имя; + Части.Добавить(""); + КонецЦикла; + Возврат СтрСоединить(Части, ""); +КонецФункции + +// Backend. + +Функция ДанныеТекущегоПользователя() + ИмяПользователя = ""; + Попытка + ИмяПользователя = ИмяПользователя(); + Исключение + ИмяПользователя = "Не определён"; + КонецПопытки; + Возврат Новый Структура("ИмяПользователя, Имя", ИмяПользователя, ИмяПользователя); +КонецФункции + +// Возвращает Соответствие: Ключ = XMLСтрока(ссылки), Значение = Структура{Ссылка, Имя}. +Функция ДоступныеПодразделения() + Результат = Новый Соответствие; + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Наименование КАК Имя + |ИЗ Справочник.ПодразделенияОрганизаций + |ГДЕ НЕ ПометкаУдаления + |УПОРЯДОЧИТЬ ПО Наименование"); + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Данные = Новый Структура("Ссылка, Имя", Выборка.Ссылка, СокрЛП(Выборка.Имя)); + Результат.Вставить(XMLСтрока(Выборка.Ссылка), Данные); + КонецЦикла; + Возврат Результат; +КонецФункции + +// Фиксированный набор источников финансирования для учреждений здравоохранения. +Функция ИсточникиФинансированияСписок() + Результат = Новый Массив; + Результат.Добавить(Новый Структура("Код, Наименование", "СГЗ", + "Субсидии на выполнение государственного задания")); + Результат.Добавить(Новый Структура("Код, Наименование", "ПД", + "Приносящая доход деятельность")); + Результат.Добавить(Новый Структура("Код, Наименование", "ОМС", + "Обязательное медицинское страхование")); + Возврат Результат; +КонецФункции + +// Возвращает массив структур {Ссылка, Имя, Должность} — сотрудники, действующие в подразделении. +Функция СотрудникиПодразделения(Знач СтрокаПодразделения) + Результат = Новый Массив; + + ПодразделениеСсылка = XMLЗначение(Тип("СправочникСсылка.ПодразделенияОрганизаций"), + СтрокаПодразделения); + + Запрос = Новый Запрос( + "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | КадроваяИстория.Сотрудник КАК Сотрудник + |ИЗ + | РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК КадроваяИстория + |ГДЕ + | КадроваяИстория.Подразделение = &Подразделение + | И КадроваяИстория.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение) + | И КадроваяИстория.ДатаНачала <= &ТекущаяДата + | И (КадроваяИстория.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1) + | ИЛИ КадроваяИстория.ДатаОкончания >= &ТекущаяДата) + |УПОРЯДОЧИТЬ ПО + | КадроваяИстория.Сотрудник.Наименование"); + Запрос.УстановитьПараметр("Подразделение", ПодразделениеСсылка); + Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса()); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Сотрудник = Выборка.Сотрудник; + Результат.Добавить(Новый Структура( + "Ссылка, Имя, Должность", + Сотрудник, + СокрЛП(Сотрудник.Наименование), + "")); + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Возвращает массив структур {Ссылка, Буква, Наименование} — предопределённые виды использования рабочего времени. +Функция ВидыВремениСписок() + Результат = Новый Массив; + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ВидыВремени.Ссылка КАК Ссылка, + | ВидыВремени.БуквенныйКод КАК Буква, + | ВидыВремени.Наименование КАК Наименование + |ИЗ + | Справочник.ВидыИспользованияРабочегоВремени КАК ВидыВремени + |ГДЕ + | НЕ ВидыВремени.ПометкаУдаления + | И ВидыВремени.НеИспользуется = ЛОЖЬ + |УПОРЯДОЧИТЬ ПО + | ВидыВремени.Наименование"); + + УстановитьПривилегированныйРежим(Истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(Ложь); + + Пока Выборка.Следующий() Цикл + Результат.Добавить(Новый Структура( + "Ссылка, Буква, Наименование", + Выборка.Ссылка, + СокрЛП(Выборка.Буква), + СокрЛП(Выборка.Наименование))); + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Сериализация в JSON. + +Функция JsonОтвет(КодСостояния, Объект) + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(); + ЗаписатьJsonЗначение(ЗаписьJSON, Объект); + Тело = ЗаписьJSON.Закрыть(); + + Ответ = Новый HTTPСервисОтвет(КодСостояния); + Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8"); + Ответ.УстановитьТелоИзСтроки(Тело, КодировкаТекста.UTF8); + Возврат Ответ; +КонецФункции + +Процедура ЗаписатьJsonЗначение(ЗаписьJSON, Значение) + Если Значение = Неопределено Тогда + ЗаписьJSON.ЗаписатьЗначение(Null); + ИначеЕсли ТипЗнч(Значение) = Тип("Соответствие") ИЛИ ТипЗнч(Значение) = Тип("Структура") Тогда + ЗаписьJSON.ЗаписатьНачалоОбъекта(); + Для Каждого КлючЗначение Из Значение Цикл + ЗаписьJSON.ЗаписатьИмяСвойства(КлючЗначение.Ключ); + ЗаписатьJsonЗначение(ЗаписьJSON, КлючЗначение.Значение); + КонецЦикла; + ЗаписьJSON.ЗаписатьКонецОбъекта(); + ИначеЕсли ТипЗнч(Значение) = Тип("Массив") Тогда + ЗаписьJSON.ЗаписатьНачалоМассива(); + Для Каждого Элемент Из Значение Цикл + ЗаписатьJsonЗначение(ЗаписьJSON, Элемент); + КонецЦикла; + ЗаписьJSON.ЗаписатьКонецМассива(); + Иначе + ЗаписьJSON.ЗаписатьЗначение(Значение); + КонецЕсли; +КонецПроцедуры + +#КонецОбласти + diff --git a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/ПС_ВебСервисТабелей.mdo b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/ПС_ВебСервисТабелей.mdo new file mode 100644 index 0000000..d85d32b --- /dev/null +++ b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/ПС_ВебСервисТабелей.mdo @@ -0,0 +1,103 @@ + + + ПС_ВебСервисТабелей + + ru + Веб-сервис табелей + + tabel + AutoUse + 20 + + Корневой + + ru + Корневой URL + + + + Главная + ОбработкаГлавной + + + + ТекущийПользователь + + ru + Текущий пользователь + + + + Получить + + ru + GET /me + + ОбработкаТекущегоПользователя + + + + Подразделения + + ru + Список подразделений + + + + Получить + + ru + GET /departments + + ОбработкаСпискаПодразделений + + + + СотрудникиПодразделения + + ru + Сотрудники подразделения + + + + Получить + + ru + GET /employees?dep=... + + ОбработкаСпискаСотрудников + + + + ВидыВремени + + ru + Виды использования рабочего времени + + + + Получить + + ru + GET /kinds + + ОбработкаСпискаВидовВремени + + + + ИсточникиФинансирования + + ru + Источники финансирования + + + + Получить + + ru + GET /funds + + ОбработкаСпискаИсточниковФинансирования + + + diff --git a/Учет родительской платы b/Учет родительской платы new file mode 160000 index 0000000..d21b4cc --- /dev/null +++ b/Учет родительской платы @@ -0,0 +1 @@ +Subproject commit d21b4cc635c58885fcfa27da8ee3d2e5b625f80b