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
+
+ /index
+
+ Главная
+ ОбработкаГлавной
+
+
+
+ ТекущийПользователь
+
+ ru
+ Текущий пользователь
+
+ /me
+
+ Получить
+
+ ru
+ GET /me
+
+ ОбработкаТекущегоПользователя
+
+
+
+ Подразделения
+
+ ru
+ Список подразделений
+
+ /departments
+
+ Получить
+
+ ru
+ GET /departments
+
+ ОбработкаСпискаПодразделений
+
+
+
+ СотрудникиПодразделения
+
+ ru
+ Сотрудники подразделения
+
+ /employees
+
+ Получить
+
+ ru
+ GET /employees?dep=...
+
+ ОбработкаСпискаСотрудников
+
+
+
+ ВидыВремени
+
+ ru
+ Виды использования рабочего времени
+
+ /kinds
+
+ Получить
+
+ ru
+ GET /kinds
+
+ ОбработкаСпискаВидовВремени
+
+
+
+ ИсточникиФинансирования
+
+ ru
+ Источники финансирования
+
+ /funds
+
+ Получить
+
+ ru
+ GET /funds
+
+ ОбработкаСпискаИсточниковФинансирования
+
+
+
diff --git a/Учет родительской платы b/Учет родительской платы
new file mode 160000
index 0000000..d21b4cc
--- /dev/null
+++ b/Учет родительской платы
@@ -0,0 +1 @@
+Subproject commit d21b4cc635c58885fcfa27da8ee3d2e5b625f80b