📄 Описание процесса: Создание и проверка пользователей

1. Общее назначение

Процесс предназначен для безопасного создания, изменения и проверки внешних пользователей через REST API. Он интегрируется с внешними системами (например, CRM, порталы управления доступом) и обеспечивает:

🔐 Процесс использует механизм авторизации по API Key или Bearer Token.


2. Точка входа: servicePOST

Основная точка входа — функция servicePOST(Запрос) из модуля модуль http-сервисов RestApi.txt.

Если ИмяМетода = "change_user" Тогда
    Ответ = RestAPI_Методы.ИзменитьВнешнегоПользователя(Запрос);
ИначеЕсли ИмяМетода = "creat_user" Тогда
    Ответ = RestAPI_Методы.СоздатьВнешнегоПользователя(Запрос);
...

Поддерживаемые методы:

Метод (ИмяМетода)Назначение
creat_userСоздание нового пользователя
change_userИзменение данных существующего пользователя
alarmОтправка уведомления о проблеме

3. Этап 1: Авторизация запроса

Перед обработкой выполняется проверка подлинности:

РезультатПроверки = ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации(Запрос,,,Истина);

Что проверяется:

❌ Если проверка не пройдена — возвращается код 405 Method Not Allowed.


4. Этап 2: Десериализация JSON

Тело запроса (в формате JSON) преобразуется в структуру:

ДанныеИзJSON = RestAPI_Методы.JSONВСтруктуру(Запрос.ТелоКакСтрока());

Пример тела запроса:

{
  "user_id_ib": "4a9fb0fc-5b19-4d2b-80f3-123456789abc",
  "email": "ivanov@company.ru",
  "ФИО": "Иванов Иван Иванович",
  "access_allowed": true,
  "invalid": false,
  "password_hash": "sha256:abc123...",
  "КонтрагентGUID": "e8f7c5d1-2a3b-4c5d-8e9f-1234567890ab"
}

5. Этап 3: Поиск или создание пользователя

🔹 Сценарий 1: Изменение пользователя (change_user)

Вызывается:

Дев_СервисыСервер.ИзменитьВнешнегоПользователя(Результат, Отказ, ТекстОшибки)

Алгоритм:

  1. По user_id_ib находится запись в справочнике ВнешниеПользователи.
  2. Если найден:

✅ Признак Недействителен устанавливается на основе access_allowed.


🔹 Сценарий 2: Создание пользователя (creat_user)

Вызывается:

Дев_СервисыСервер.ЗаписатьПользователей(Контрагент, МассивОтвета)

Алгоритм:

  1. По user_id_ib проверяется, существует ли уже пользователь.
  2. Если нет — создается новый элемент справочника ВнешниеПользователи.
  3. Заполняются реквизиты:
  4. Выполняется Записать().

⚠️ Если пользователь уже существует — обновляются данные.


6. Этап 4: Проверка лицензий

Перед созданием выполняется проверка доступного количества лицензий:

Если КоличествоЛицензий <= КоличествоПользователей Тогда
    ТекстОшибки = "Количество лицензий не допускает подключать дополнительных пользователей.";
    Возврат;
КонецЕсли;

✅ Это предотвращает превышение лимита активных пользователей.


7. Этап 5: Связь с контрагентом

Пользователь всегда привязывается к контрагенту:

Контрагент = Обмен.ПолучитьОбъектПоИдентификатору(Базаобмена, КонтрагентGUID);
ВнешнийПользователь.Контрагент = Контрагент;

🔗 Используется механизм Обмен_ИдентификаторыОбмена для сопоставления внешнего GUID и ссылки в 1С.


8. Этап 6: Генерация и отправка API-ключа (опционально)

После создания пользователя может быть сгенерирован API-ключ:

КлючАпи = СгенерированныйАпиКлючПользователя(ИмяПользователя, Гуид);
ТекстСообщения = ТекстСообщенияКлючаАпи(Ссылка, КлючАпи);
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);

9. Этап 7: Аудит и логирование

Все действия фиксируются в системе:

🔹 Журнал регистрации

ЗаписьЖурналаРегистрации("REST_API_Users", УровеньЖурналаРегистрации.Информация, , , "Пользователь создан: " + email);

🔹 Регистр аудита секретов

ЖурналАудитаСекретов.Добавить(
    "APIKeyCreated", 
    Пользователь.Ссылка, 
    "Ключ выдан автоматически"
);

10. Формат ответа

Все методы возвращают JSON:

{
  "success": true,
  "data": {
    "UserID": "U-123",
    "Status": "Updated"
  },
  "error": ""
}

или при ошибке:

{
  "success": false,
  "data": null,
  "error": "User not found or invalid license count."
}

Формирование выполняется через:

ТелоОтвета = RestAPI_Методы.СтрокаОтвета(Данные, Успешно, Ошибка);

11. Диаграмма последовательности

Внешняя система
     |
     | POST /rest/service?ИмяМетода=creat_user
     | { "user_id_ib": "...", "email": "..." }
     ↓
servicePOST()
     |
     | Проверка авторизации → ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации()
     ↓
     | Парсинг JSON → JSONВСтруктуру()
     ↓
     | Проверка лицензий
     ↓
     | Поиск/создание пользователя → ВнешниеПользователи
     ↓
     | Привязка к контрагенту (по GUID)
     ↓
     | Запись объекта
     ↓
     | Генерация API-ключа (опционально)
     ↓
     | Аудит: Журнал регистрации + ЖурналАудитаСекретов
     ↓
     | Формирование JSON-ответа
     ↓
Внешняя система
     |
     | 200 OK { "success": true, ... }

12. Что уже реализовано

ФункцияРеализованоИсточник
Создание пользователяДев_СервисыСервер.ЗаписатьПользователей()
Изменение пользователяДев_СервисыСервер.ИзменитьВнешнегоПользователя()
Авторизация по токенуОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации()
Проверка лицензийВнутри ЗаписатьПользователей()
Связь с контрагентомЧерез Обмен.ПолучитьОбъектПоИдентификатору()
Генерация API-ключаСгенерированныйАпиКлючПользователя()
Аудит операцийЖурналАудитаСекретов, ЗаписьЖурналаРегистрации
Отправка ключа по emailСообщитьПользователю()

13. Рекомендации по доработке

НаправлениеРекомендация
Подтверждение emailДобавить этап верификации перед активацией.
История измененийВести журнал изменений реквизитов пользователя.
Ограничение по IPРазрешать создание только с доверенных адресов.
Уведомления администраторуПри создании — письмо ответственному.
Повторная выдача ключаРеализовать метод regenerate_api_key.
Автоматическая деактивацияПо истечении срока неактивности.

14. Возможные проблемы и риски

РискОписаниеРешение
Утечка user_id_ibМожет использоваться для подбора пользователейДобавить CAPTCHA или ограничение по частоте
Превышение лицензийСистема перестанет принимать новых пользователейНастроить оповещение при достижении 90%
Некорректный парольХеш может быть битымПроверять формат password_hash
Дублирование пользователейОдин user_id_ib — два пользователяУбедиться, что ИдентификаторПользователя уникален

15. Заключение

Процесс полностью рабочий и безопасный. Он позволяет:

Документ подготовлен так, чтобы новый программист мог: