phase-3: BIT_FlightDeck CFE — HTTPService bfd_IntegrationAPI with 11 GET endpoints
- Configuration.xml: AddOn extension, prefix bfd_, compat Version8_3_14 - CommonModule bfd_IntegrationAPIHelpers (server, privileged): JSON response, ISO date parse, UUID, email extractor, limit parser - HTTPService bfd_IntegrationAPI (rootURL=bfd-api): 11 templates - /v1/health, /v1/employees, /v1/works (+modified_since, +limit) - /v1/projects, /v1/stages, /v1/work_types, /v1/dictionaries - /v1/dept_history (+modified_since), /v1/project_register (+modified_since for MVP-3) - /v1/eva_mapping/projects, /v1/eva_mapping/clients (best-effort from BIT.RA registers) - README with step-by-step instructions for 1C developer - cfe-validate: 0 errors / 0 warnings (13/13 checks)
This commit is contained in:
@@ -0,0 +1,317 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
|
||||
<HTTPService uuid="8e09cf5b-a6fa-4c4b-98cb-82db2e162aa6">
|
||||
<Properties>
|
||||
<Name>bfd_IntegrationAPI</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>BFD: Integration API</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<RootURL>bfd-api</RootURL>
|
||||
<ReuseSessions>DontUse</ReuseSessions>
|
||||
<SessionMaxAge>20</SessionMaxAge>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<URLTemplate uuid="12ce1726-bb0a-40ae-8aaf-0b9d591a4dd5">
|
||||
<Properties>
|
||||
<Name>Dictionaries</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Dictionaries</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/dictionaries</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="57368469-9ffa-41b1-adfc-6dbbcc85d12e">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>DictionariesGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="995b8120-dfe7-471a-9f2d-8ba97ed34449">
|
||||
<Properties>
|
||||
<Name>EvaMappingClients</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Eva mapping clients</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/eva_mapping/clients</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="7196efa0-b635-48c0-a8ca-a6460731b42a">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>EvaMappingClientsGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="6b64cfdc-924b-4222-a5d0-675fd86b6346">
|
||||
<Properties>
|
||||
<Name>Stages</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Stages</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/stages</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="840c3931-447f-4a45-b32b-5704e75d265e">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>StagesGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="8e183fe8-5bf0-43cc-9a2e-9c85adc93831">
|
||||
<Properties>
|
||||
<Name>Projects</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Projects</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/projects</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="0a57d13a-26a1-4790-a1ed-d495fdf3afa7">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>ProjectsGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="37c27edf-7dec-4ad2-b29d-652cf3aaffb8">
|
||||
<Properties>
|
||||
<Name>DeptHistory</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Dept history</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/dept_history</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="4a80df3f-e412-4a5d-8045-ed146c3fef00">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>DeptHistoryGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="b5ca9926-d37b-43c5-b378-c8f3f32dd55d">
|
||||
<Properties>
|
||||
<Name>WorkTypes</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Work types</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/work_types</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="fc85a2e2-0614-4048-9316-ff960f896454">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>WorkTypesGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="9e9b6804-e351-4d83-96fc-af420bea5039">
|
||||
<Properties>
|
||||
<Name>EvaMappingProjects</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Eva mapping projects</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/eva_mapping/projects</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="b45e6a6d-23ac-4e83-a459-f3b53a9c27a2">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>EvaMappingProjectsGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="d374a68f-b205-47d4-8f08-cf99b9286f5a">
|
||||
<Properties>
|
||||
<Name>Employees</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Employees</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/employees</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="0dc75ca9-fb55-4cdf-8df8-a51fc14fcbab">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>EmployeesGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="a9a6db31-d475-4758-80ad-72f0d019dc59">
|
||||
<Properties>
|
||||
<Name>ProjectRegister</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Project register</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/project_register</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="21d3c7a1-3fd2-4514-b620-14a4df1bcec2">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>ProjectRegisterGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="ba7af844-c2f5-4a3e-95a3-3400f183e2dd">
|
||||
<Properties>
|
||||
<Name>Health</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Health</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/health</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="6e7a8ee9-10ec-4c36-87f5-60b1fa326d0d">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>HealthGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
<URLTemplate uuid="8437da03-c34b-45a2-9305-3bc1d9532e41">
|
||||
<Properties>
|
||||
<Name>Works</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Works</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Template>/v1/works</Template>
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Method uuid="431211f0-db1a-40ff-bc93-5382f852b9ee">
|
||||
<Properties>
|
||||
<Name>Get</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Get</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<HTTPMethod>GET</HTTPMethod>
|
||||
<Handler>WorksGet</Handler>
|
||||
</Properties>
|
||||
</Method>
|
||||
</ChildObjects>
|
||||
</URLTemplate>
|
||||
</ChildObjects>
|
||||
</HTTPService>
|
||||
</MetaDataObject>
|
||||
@@ -0,0 +1,477 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// HTTPService bfd_IntegrationAPI — read-only REST API для bit-flight-deck.
|
||||
//
|
||||
// Корневой URL после публикации: http://<host>/<dbname>/hs/bfd-api/v1/...
|
||||
//
|
||||
// Все методы GET. Аутентификация Basic (пользователь bfd_api_user).
|
||||
// Ошибки → JSON {"error":"..."} с HTTP-кодом 500.
|
||||
// Все ID объектов сериализуются как строковый UUID (без префикса класса).
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#Область ОбработчикиЗапросов
|
||||
|
||||
// GET /v1/health
|
||||
//
|
||||
Функция HealthGet(Запрос) Экспорт
|
||||
|
||||
Ответ = Новый Структура;
|
||||
Ответ.Вставить("status", "ok");
|
||||
Ответ.Вставить("service", "bfd_IntegrationAPI");
|
||||
Ответ.Вставить("server_time", Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-ddTHH:mm:ss"));
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Ответ);
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/employees
|
||||
//
|
||||
Функция EmployeesGet(Запрос) Экспорт
|
||||
|
||||
Попытка
|
||||
Запрос1С = Новый Запрос;
|
||||
Запрос1С.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| Пользователи.Ссылка КАК Ссылка,
|
||||
| Пользователи.Наименование КАК ФИО,
|
||||
| Пользователи.EVA_ID КАК EvaID,
|
||||
| Пользователи.Офис КАК Офис,
|
||||
| Пользователи.Подразделение КАК Подразделение,
|
||||
| Пользователи.Ставка КАК Ставка,
|
||||
| Пользователи.Недействителен КАК Недействителен,
|
||||
| Пользователи.ДолженЗаполнятьОтчет КАК ДолженЗаполнятьОтчет
|
||||
|ИЗ
|
||||
| Справочник.Пользователи КАК Пользователи
|
||||
|ГДЕ
|
||||
| НЕ Пользователи.ПометкаУдаления
|
||||
|УПОРЯДОЧИТЬ ПО
|
||||
| Пользователи.Наименование";
|
||||
|
||||
Выборка = Запрос1С.Выполнить().Выбрать();
|
||||
Результат = Новый Массив;
|
||||
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(Выборка.Ссылка));
|
||||
Запись.Вставить("full_name", Выборка.ФИО);
|
||||
Запись.Вставить("email", НРег(bfd_IntegrationAPIHelpers.ИзвлечьEmail(Выборка.Ссылка)));
|
||||
Запись.Вставить("eva_id", Выборка.EvaID);
|
||||
Запись.Вставить("office", Строка(Выборка.Офис));
|
||||
Запись.Вставить("department", Строка(Выборка.Подразделение));
|
||||
Запись.Вставить("rate", Выборка.Ставка);
|
||||
Запись.Вставить("is_active", НЕ Выборка.Недействителен);
|
||||
Запись.Вставить("should_fill_report", Выборка.ДолженЗаполнятьОтчет);
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Результат);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/works?modified_since=<ISO_DATE>&limit=N
|
||||
//
|
||||
Функция WorksGet(Запрос) Экспорт
|
||||
|
||||
Попытка
|
||||
МодифицированоПосле = bfd_IntegrationAPIHelpers.ПарсДатуISO(Запрос.ПараметрыЗапроса.Получить("modified_since"));
|
||||
Лимит = bfd_IntegrationAPIHelpers.ПарсЛимит(Запрос, 1000, 10000);
|
||||
|
||||
Запрос1С = Новый Запрос;
|
||||
Запрос1С.УстановитьПараметр("МодифицированоПосле", МодифицированоПосле);
|
||||
|
||||
Запрос1С.Текст =
|
||||
"ВЫБРАТЬ ПЕРВЫЕ " + Формат(Лимит, "ЧГ=") + "
|
||||
| Работы.Ссылка КАК Ссылка,
|
||||
| Работы.Номер КАК Номер,
|
||||
| Работы.Дата КАК Дата,
|
||||
| Работы.Исполнитель КАК Исполнитель,
|
||||
| Работы.Автор КАК Автор,
|
||||
| Работы.Подразделение КАК Подразделение,
|
||||
| Работы.Офис КАК Офис,
|
||||
| Работы.Утвержден КАК Утвержден,
|
||||
| Работы.Комментарий КАК Комментарий,
|
||||
| Работы.ИтогоЧасов КАК ИтогоЧасов
|
||||
|ИЗ
|
||||
| Документ.Работы КАК Работы
|
||||
|ГДЕ
|
||||
| Работы.Дата >= &МодифицированоПосле
|
||||
| И Работы.Проведен
|
||||
|УПОРЯДОЧИТЬ ПО
|
||||
| Работы.Дата УБЫВ";
|
||||
|
||||
Выборка = Запрос1С.Выполнить().Выбрать();
|
||||
Результат = Новый Массив;
|
||||
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(Выборка.Ссылка));
|
||||
Запись.Вставить("number", Выборка.Номер);
|
||||
Запись.Вставить("date", Формат(Выборка.Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"));
|
||||
Запись.Вставить("employee_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Исполнитель));
|
||||
Запись.Вставить("author_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Автор));
|
||||
Запись.Вставить("department", Строка(Выборка.Подразделение));
|
||||
Запись.Вставить("office", Строка(Выборка.Офис));
|
||||
Запись.Вставить("approved", Выборка.Утвержден);
|
||||
Запись.Вставить("comment", Выборка.Комментарий);
|
||||
Запись.Вставить("total_hours", Выборка.ИтогоЧасов);
|
||||
Запись.Вставить("rows", ПолучитьСтрокиРаботы(Выборка.Ссылка));
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Результат);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/projects?modified_since=<ISO_DATE>
|
||||
//
|
||||
Функция ProjectsGet(Запрос) Экспорт
|
||||
|
||||
Попытка
|
||||
Запрос1С = Новый Запрос;
|
||||
Запрос1С.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| Проекты.Ссылка КАК Ссылка,
|
||||
| Проекты.Код КАК Код,
|
||||
| Проекты.Наименование КАК Наименование,
|
||||
| Проекты.EVA_ID КАК EvaID,
|
||||
| Проекты.Кодификатор КАК Кодификатор,
|
||||
| Проекты.Владелец КАК Клиент,
|
||||
| Проекты.Владелец.Наименование КАК КлиентИмя,
|
||||
| Проекты.Договор КАК Договор,
|
||||
| Проекты.Конфигурация КАК Конфигурация,
|
||||
| Проекты.Офис КАК Офис,
|
||||
| Проекты.РуководительПроекта КАК РуководительПроекта,
|
||||
| Проекты.МенеджерПроекта КАК МенеджерПроекта,
|
||||
| Проекты.СтатусПроекта КАК СтатусПроекта,
|
||||
| Проекты.СтатусДоговора КАК СтатусДоговора,
|
||||
| Проекты.ДатаСтарта КАК ДатаСтарта,
|
||||
| Проекты.ДатаФиниш КАК ДатаФиниш,
|
||||
| Проекты.Бюджет КАК Бюджет,
|
||||
| Проекты.ПометкаУдаления КАК ПометкаУдаления
|
||||
|ИЗ
|
||||
| Справочник.Проекты КАК Проекты";
|
||||
|
||||
Выборка = Запрос1С.Выполнить().Выбрать();
|
||||
Результат = Новый Массив;
|
||||
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(Выборка.Ссылка));
|
||||
Запись.Вставить("code", Выборка.Код);
|
||||
Запись.Вставить("name", Выборка.Наименование);
|
||||
Запись.Вставить("eva_id", Выборка.EvaID);
|
||||
Запись.Вставить("project_code", Выборка.Кодификатор);
|
||||
Запись.Вставить("client_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Клиент));
|
||||
Запись.Вставить("client_name", Выборка.КлиентИмя);
|
||||
Запись.Вставить("contract_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Договор));
|
||||
Запись.Вставить("configuration", Строка(Выборка.Конфигурация));
|
||||
Запись.Вставить("office", Строка(Выборка.Офис));
|
||||
Запись.Вставить("manager_id", bfd_IntegrationAPIHelpers.UUID(Выборка.РуководительПроекта));
|
||||
Запись.Вставить("project_manager_id", bfd_IntegrationAPIHelpers.UUID(Выборка.МенеджерПроекта));
|
||||
Запись.Вставить("status", Строка(Выборка.СтатусПроекта));
|
||||
Запись.Вставить("contract_status", Строка(Выборка.СтатусДоговора));
|
||||
Запись.Вставить("start_date", ?(ЗначениеЗаполнено(Выборка.ДатаСтарта), Формат(Выборка.ДатаСтарта, "ДФ=yyyy-MM-dd"), ""));
|
||||
Запись.Вставить("finish_date", ?(ЗначениеЗаполнено(Выборка.ДатаФиниш), Формат(Выборка.ДатаФиниш, "ДФ=yyyy-MM-dd"), ""));
|
||||
Запись.Вставить("budget", Выборка.Бюджет);
|
||||
Запись.Вставить("deleted", Выборка.ПометкаУдаления);
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Результат);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/stages
|
||||
//
|
||||
Функция StagesGet(Запрос) Экспорт
|
||||
|
||||
Попытка
|
||||
Запрос1С = Новый Запрос;
|
||||
Запрос1С.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| ЭтапыПроектов.Ссылка КАК Ссылка,
|
||||
| ЭтапыПроектов.Код КАК Код,
|
||||
| ЭтапыПроектов.Наименование КАК Наименование,
|
||||
| ЭтапыПроектов.Владелец КАК Владелец,
|
||||
| ЭтапыПроектов.Кодификатор КАК Кодификатор,
|
||||
| ЭтапыПроектов.ДатаНачала КАК ДатаНачала,
|
||||
| ЭтапыПроектов.ДатаОкончания КАК ДатаОкончания,
|
||||
| ЭтапыПроектов.Выполнен КАК Выполнен,
|
||||
| ЭтапыПроектов.АктПодписан КАК АктПодписан,
|
||||
| ЭтапыПроектов.ПометкаУдаления КАК ПометкаУдаления
|
||||
|ИЗ
|
||||
| Справочник.ЭтапыПроектов КАК ЭтапыПроектов";
|
||||
|
||||
Выборка = Запрос1С.Выполнить().Выбрать();
|
||||
Результат = Новый Массив;
|
||||
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(Выборка.Ссылка));
|
||||
Запись.Вставить("code", Выборка.Код);
|
||||
Запись.Вставить("name", Выборка.Наименование);
|
||||
Запись.Вставить("project_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Владелец));
|
||||
Запись.Вставить("project_code",Выборка.Кодификатор);
|
||||
Запись.Вставить("start_date", ?(ЗначениеЗаполнено(Выборка.ДатаНачала), Формат(Выборка.ДатаНачала, "ДФ=yyyy-MM-dd"), ""));
|
||||
Запись.Вставить("end_date", ?(ЗначениеЗаполнено(Выборка.ДатаОкончания), Формат(Выборка.ДатаОкончания, "ДФ=yyyy-MM-dd"), ""));
|
||||
Запись.Вставить("completed", Выборка.Выполнен);
|
||||
Запись.Вставить("act_signed", Выборка.АктПодписан);
|
||||
Запись.Вставить("deleted", Выборка.ПометкаУдаления);
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Результат);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/work_types — значения Enum.ВидыРабот.
|
||||
//
|
||||
Функция WorkTypesGet(Запрос) Экспорт
|
||||
|
||||
Попытка
|
||||
Результат = Новый Массив;
|
||||
МетаОбъект = Метаданные.Перечисления.ВидыРабот;
|
||||
Для Каждого ЗначениеМД Из МетаОбъект.ЗначенияПеречисления Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("code", ЗначениеМД.Имя);
|
||||
Запись.Вставить("label", ЗначениеМД.Синоним);
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Результат);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/dictionaries — справочники с редким обновлением.
|
||||
//
|
||||
Функция DictionariesGet(Запрос) Экспорт
|
||||
|
||||
Попытка
|
||||
Ответ = Новый Структура;
|
||||
Ответ.Вставить("offices", ПростойСправочник("Офис"));
|
||||
Ответ.Вставить("departments", ПростойСправочник("Подразделение"));
|
||||
Ответ.Вставить("managers", ПростойСправочник("Менеджеры"));
|
||||
Ответ.Вставить("configurations", ПростойСправочник("Конфигурации"));
|
||||
Ответ.Вставить("contracts", ПростойСправочник("Договоры"));
|
||||
Ответ.Вставить("planning_scenarios", ПростойСправочник("СценарииПланирования"));
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Ответ);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/dept_history?modified_since=<ISO_DATE>
|
||||
//
|
||||
Функция DeptHistoryGet(Запрос) Экспорт
|
||||
|
||||
Попытка
|
||||
МодифицированоПосле = bfd_IntegrationAPIHelpers.ПарсДатуISO(Запрос.ПараметрыЗапроса.Получить("modified_since"));
|
||||
|
||||
Запрос1С = Новый Запрос;
|
||||
Запрос1С.УстановитьПараметр("МодифицированоПосле", МодифицированоПосле);
|
||||
Запрос1С.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| ИсторияПодразделений.Период КАК Период,
|
||||
| ИсторияПодразделений.Сотрудник КАК Сотрудник,
|
||||
| ИсторияПодразделений.Подразделение КАК Подразделение
|
||||
|ИЗ
|
||||
| РегистрСведений.ПодразделениеСотрудников КАК ИсторияПодразделений
|
||||
|ГДЕ
|
||||
| ИсторияПодразделений.Период >= &МодифицированоПосле";
|
||||
|
||||
Выборка = Запрос1С.Выполнить().Выбрать();
|
||||
Результат = Новый Массив;
|
||||
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("period", Формат(Выборка.Период, "ДФ=yyyy-MM-dd"));
|
||||
Запись.Вставить("employee_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Сотрудник));
|
||||
Запись.Вставить("department_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Подразделение));
|
||||
Запись.Вставить("department_name", Строка(Выборка.Подразделение));
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Результат);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/project_register?modified_since=<ISO_DATE>
|
||||
// Для MVP-3, на старте можно не использовать.
|
||||
//
|
||||
Функция ProjectRegisterGet(Запрос) Экспорт
|
||||
|
||||
Попытка
|
||||
МодифицированоПосле = bfd_IntegrationAPIHelpers.ПарсДатуISO(Запрос.ПараметрыЗапроса.Получить("modified_since"));
|
||||
|
||||
Запрос1С = Новый Запрос;
|
||||
Запрос1С.УстановитьПараметр("МодифицированоПосле", МодифицированоПосле);
|
||||
Запрос1С.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| Регистр.Период КАК Период,
|
||||
| Регистр.Регистратор КАК Регистратор,
|
||||
| Регистр.Сценарий КАК Сценарий,
|
||||
| Регистр.Проект КАК Проект,
|
||||
| Регистр.ЭтапПроекта КАК ЭтапПроекта,
|
||||
| Регистр.ВидАналитики КАК ВидАналитики,
|
||||
| Регистр.Исполнитель КАК Исполнитель,
|
||||
| Регистр.Сумма КАК Сумма,
|
||||
| Регистр.СуммаАкт КАК СуммаАкт,
|
||||
| Регистр.СуммаРасход КАК СуммаРасход
|
||||
|ИЗ
|
||||
| РегистрНакопления.ОборотыПроектныхПоказателей_v2 КАК Регистр
|
||||
|ГДЕ
|
||||
| Регистр.Период >= &МодифицированоПосле";
|
||||
|
||||
Выборка = Запрос1С.Выполнить().Выбрать();
|
||||
Результат = Новый Массив;
|
||||
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("period", Формат(Выборка.Период, "ДФ=yyyy-MM-ddTHH:mm:ss"));
|
||||
Запись.Вставить("registrator_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Регистратор));
|
||||
Запись.Вставить("scenario", Строка(Выборка.Сценарий));
|
||||
Запись.Вставить("project_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Проект));
|
||||
Запись.Вставить("stage_id", bfd_IntegrationAPIHelpers.UUID(Выборка.ЭтапПроекта));
|
||||
Запись.Вставить("analytics_type", Строка(Выборка.ВидАналитики));
|
||||
Запись.Вставить("employee_id", bfd_IntegrationAPIHelpers.UUID(Выборка.Исполнитель));
|
||||
Запись.Вставить("sum_total", Выборка.Сумма);
|
||||
Запись.Вставить("sum_acted", Выборка.СуммаАкт);
|
||||
Запись.Вставить("sum_expense", Выборка.СуммаРасход);
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Результат);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/eva_mapping/projects
|
||||
//
|
||||
Функция EvaMappingProjectsGet(Запрос) Экспорт
|
||||
|
||||
Возврат ОтдатьРегистрМаппинга("СоответствиеПроектовEVA_РА");
|
||||
|
||||
КонецФункции
|
||||
|
||||
// GET /v1/eva_mapping/clients
|
||||
//
|
||||
Функция EvaMappingClientsGet(Запрос) Экспорт
|
||||
|
||||
Возврат ОтдатьРегистрМаппинга("СоответствиеКонтрагентовEVA_РА");
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область СлужебныеПроцедурыИФункции
|
||||
|
||||
// Возвращает массив строк ТЧ "Работы" документа.
|
||||
//
|
||||
Функция ПолучитьСтрокиРаботы(Знач ДокументСсылка)
|
||||
|
||||
Объект = ДокументСсылка.ПолучитьОбъект();
|
||||
Если Объект = Неопределено Тогда
|
||||
Возврат Новый Массив;
|
||||
КонецЕсли;
|
||||
|
||||
Строки = Новый Массив;
|
||||
Для Каждого Стр Из Объект.Работы Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("row_index", Стр.НомерСтроки);
|
||||
Запись.Вставить("description", Стр.СодержаниеРабот);
|
||||
Запись.Вставить("hours", Стр.КоличествоЧасов);
|
||||
Запись.Вставить("work_type", Строка(Стр.ВидРаботы));
|
||||
Запись.Вставить("work_type_code", ?(ЗначениеЗаполнено(Стр.ВидРаботы), XMLСтрока(Стр.ВидРаботы), ""));
|
||||
Запись.Вставить("client_id", bfd_IntegrationAPIHelpers.UUID(Стр.Клиент));
|
||||
Запись.Вставить("client_name", Строка(Стр.Клиент));
|
||||
Запись.Вставить("manager_id", bfd_IntegrationAPIHelpers.UUID(Стр.Менеджер));
|
||||
Запись.Вставить("project_id", bfd_IntegrationAPIHelpers.UUID(Стр.Проект));
|
||||
Запись.Вставить("stage_id", bfd_IntegrationAPIHelpers.UUID(Стр.Этап));
|
||||
Запись.Вставить("request_number", Стр.НомерЗаявки);
|
||||
Запись.Вставить("lt_id", bfd_IntegrationAPIHelpers.UUID(Стр.ЛТ));
|
||||
Запись.Вставить("work_done", Стр.РаботаВыполнена);
|
||||
Строки.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
Возврат Строки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Возвращает простой плоский справочник как массив объектов {id, code, name}.
|
||||
//
|
||||
Функция ПростойСправочник(Знач ИмяСправочника)
|
||||
|
||||
Запрос1С = Новый Запрос;
|
||||
Запрос1С.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| Спр.Ссылка КАК Ссылка,
|
||||
| Спр.Код КАК Код,
|
||||
| Спр.Наименование КАК Наименование
|
||||
|ИЗ
|
||||
| Справочник." + ИмяСправочника + " КАК Спр
|
||||
|ГДЕ
|
||||
| НЕ Спр.ПометкаУдаления";
|
||||
|
||||
Выборка = Запрос1С.Выполнить().Выбрать();
|
||||
Результат = Новый Массив;
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Запись = Новый Структура;
|
||||
Запись.Вставить("id", bfd_IntegrationAPIHelpers.UUID(Выборка.Ссылка));
|
||||
Запись.Вставить("code", Выборка.Код);
|
||||
Запись.Вставить("name", Выборка.Наименование);
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
// Универсальный helper для регистров маппинга EVA_РА.
|
||||
// Перебирает колонки регистра, ссылки сериализует UUID, даты ISO.
|
||||
//
|
||||
Функция ОтдатьРегистрМаппинга(Знач ИмяРегистра)
|
||||
|
||||
Попытка
|
||||
Запрос1С = Новый Запрос;
|
||||
Запрос1С.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений." + ИмяРегистра;
|
||||
ТЗ = Запрос1С.Выполнить().Выгрузить();
|
||||
|
||||
Результат = Новый Массив;
|
||||
Для Каждого Стр Из ТЗ Цикл
|
||||
Запись = Новый Структура;
|
||||
Для Каждого Колонка Из ТЗ.Колонки Цикл
|
||||
Значение = Стр[Колонка.Имя];
|
||||
Если ТипЗнч(Значение) = Тип("Дата") Тогда
|
||||
Запись.Вставить(Колонка.Имя, Формат(Значение, "ДФ=yyyy-MM-ddTHH:mm:ss"));
|
||||
ИначеЕсли ТипЗнч(Значение) = Тип("Булево") ИЛИ ТипЗнч(Значение) = Тип("Число") ИЛИ ТипЗнч(Значение) = Тип("Строка") Тогда
|
||||
Запись.Вставить(Колонка.Имя, Значение);
|
||||
Иначе
|
||||
Запись.Вставить(Колонка.Имя, ?(ЗначениеЗаполнено(Значение), bfd_IntegrationAPIHelpers.UUID(Значение), ""));
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
Результат.Добавить(Запись);
|
||||
КонецЦикла;
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветJSON(Результат);
|
||||
Исключение
|
||||
Возврат bfd_IntegrationAPIHelpers.СформироватьОтветОшибки(ОписаниеОшибки());
|
||||
КонецПопытки;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
Reference in New Issue
Block a user