From d37dd83b23bf3f044c59c3fc9754d7928b13d988 Mon Sep 17 00:00:00 2001 From: tsvetkoff Date: Thu, 17 Sep 2026 15:53:26 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20HTTP-=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=B8=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) Изменение в 101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/Configuration/Configuration.mdo: - добавлена ссылка на новый HTTP-сервис ПС_ВебСервисТабелей 2) Новая функциональность в 101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/Module.bsl: - реализован серверный модуль веб-сервиса с обработчиками маршрутов - GET /index — возвращает HTML-форму ввода табеля - GET /me — возвращает JSON с данными текущего пользователя - GET /departments — возвращает JSON со списком доступных подразделений - GET /employees — возвращает JSON со списком сотрудников подразделения - GET /kinds — возвращает список видов использования рабочего времени - GET /funds — возвращает список источников финансирования 3) Новая функциональность в 101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/ПС_ВебСервисТабелей.mdo: - создан метаданный объект HTTP-сервиса "ПС_ВебСервисТабелей" - настроены корневой URL /tabel и маршруты для всех обработчиков --- .../src/Configuration/Configuration.mdo | 1 + .../src/HTTPServices/ПС_ВебСервисТабелей/Module.bsl | 385 ++++++++++++++++++ .../src/HTTPServices/ПС_ВебСервисТабелей/ПС_ВебСервисТабелей.mdo | 103 +++++ Учет родительской платы | 1 + 4 files changed, 490 insertions(+) create mode 100644 101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/Module.bsl create mode 100644 101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/HTTPServices/ПС_ВебСервисТабелей/ПС_ВебСервисТабелей.mdo create mode 160000 Учет родительской платы 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