Мобильное приложение согласования на 1С: беспарольный вход по коду и офлайн-обмен

Серверная конфигурация + приложение на мобильной платформе 1С: вход по коду из письма, токены доступа вместо паролей, автономная работа под парк до 5 000 устройств.

Заказчик: Крупная технологическая интернет-компания (проект под NDA)
Стек: 1С:Предприятие 8.3, мобильная платформа 1С, HTTP-сервисы, планы обмена, ТокенДоступа (JWT HS256), XDTO, регистры сведений, регламентные задания, SMTP

Задача

Согласование документов и заявок со смартфона без доступа сотрудников к учётной базе 1С и без раздачи паролей. Требовались безопасная беспарольная авторизация, автономная работа при нестабильной мобильной сети и масштаб до 5 000 устройств.

Результат

Разработаны обе части продукта: серверная конфигурация «Мобильное согласование» и приложение на мобильной платформе 1С. Вход беспарольный (код из email + токен доступа 1С), мобильные пользователи изолированы от базы одной ролью, обмен идёт сжатыми XDTO-пакетами через планы обмена, карточки согласования настраиваются без доработки клиента.

К нам пришла крупная технологическая интернет-компания с задачей, которую типовыми средствами 1С закрыть нельзя: руководителям и специалистам нужно согласовывать документы и заявки со смартфона — из переговорной, из дома, в дороге, — не открывая при этом полноценный клиент 1С и не получая доступ ко всей учётной базе. Раздавать пароли 1С тысячам сотрудников недопустимо, а количество устройств планировалось довести до 5 000. Нужно было отдельное мобильное приложение на платформе 1С с собственной серверной частью, безопасной авторизацией и обменом, который переживает нестабильную мобильную сеть.

Мы спроектировали и написали оба контура целиком: серверную конфигурацию «Мобильное согласование» (центральная база, HTTP-сервисы, планы обмена) и мобильное приложение на мобильной платформе 1С. Ниже — как это устроено внутри.

Авторизация без паролей: код из письма + токен доступа 1С

Главное требование безопасности — ни один пользователь мобильного приложения не должен знать пароль от 1С. Поэтому вход двухшаговый и полностью беспарольный.

Шаг 1 — регистрация устройства. Приложение отправляет логин и хеш устройства. Сервер находит сотрудника, генерирует одноразовый 5-значный код и привязывает его к хешу устройства в регистре сведений:

Функция Регистрация(СтруктураДанных) Экспорт
    Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("Логин", СтруктураДанных.login);
    Если Пользователь.Пустая() Тогда
        Возврат Ошибка("Не найден пользователь по логину.");
    КонецЕсли;

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Код = ГСЧ.СлучайноеЧисло(10000, 99999);

    МенеджерЗаписи = РегистрыСведений.Аутентификация.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Пользователь   = Пользователь;
    МенеджерЗаписи.HashУстройства = СтруктураДанных.hash;
    МенеджерЗаписи.Код            = Код;
    МенеджерЗаписи.Записать();
КонецФункции

Отдельное регламентное задание разбирает очередь неотправленных кодов и рассылает их по SMTP — код приходит сотруднику на корпоративную почту. Так канал доставки кода отделён от канала запроса, а сам код живёт только до успешного входа.

Шаг 2 — проверка кода и выдача токена. При вводе кода сервер сверяет его с хешем устройства, считает попытки (после 5 неверных устройство блокируется) и, если всё верно, выдаёт токен доступа 1С (JWT, подпись HS256) — штатный механизм платформы 8.3.21+. Под каждого сотрудника автоматически создаётся пользователь информационной базы с единственным способом входа «Аутентификация токеном доступа», без пароля и без показа в списке выбора:

НовыйПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
НовыйПользовательИБ.АутентификацияСтандартная    = Ложь;
НовыйПользовательИБ.АутентификацияТокеномДоступа = Истина;
НовыйПользовательИБ.ПоказыватьВСпискеВыбора      = Ложь;
НовыйПользовательИБ.Роли.Добавить(Метаданные.Роли.ИспользованиеСервисаОбменаСМобильнымПриложением);
НовыйПользовательИБ.Записать();

// сам токен подписывается ключом из константы
ТокенДоступа = Новый ТокенДоступа;
ТокенДоступа.Получатели.Добавить("mobile"); // имя HTTP-сервиса из default.vrd
ТокенДоступа.КлючСопоставленияПользователя = ИмяПользователяИБ;
ТокенДоступа.ВремяЖизни = 2592000; // 30 суток
ТокенДоступа.Подписать(АлгоритмПодписиТокенаДоступа.HS256, Константы.КлючПодписи.Получить());

Дальше все запросы приложение подписывает этим токеном, а веб-сервер (через default.vrd) сам проверяет подпись и сопоставляет запрос с нужным пользователем ИБ. Роль у такого пользователя ровно одна — доступ к сервису обмена, поэтому даже с валидным токеном из мобильного приложения нельзя «дотянуться» до остальной учётной базы. Подробный разбор самого механизма мы вынесли в статью JWT-авторизация в 1С.

Обмен, устойчивый к мобильной сети

Мобильное приложение работает автономно: сотрудник видит свои задачи и согласовывает их даже при плохой связи, а синхронизация идёт пакетами. В основе — штатные планы обмена 1С, «протуннелированные» через HTTP-сервис. Каждому устройству соответствует свой узел плана обмена (UUID узла = ID устройства), сервер отдаёт только изменения для конкретного узла.

Чтобы не гонять по мобильной сети лишний трафик и не упираться в ограничение HTTP-сервиса (нельзя вернуть «Хранилище значения» напрямую), пакет сериализуется через XDTO и сжимается перед отправкой:

Функция СформироватьПакетОтвета(Пакет) Экспорт
    // сериализуем в XML, затем сжимаем (уровень 9) и снова сериализуем как строку
    СжатыйПакет = Новый ХранилищеЗначения(Сериализовать(Пакет), Новый СжатиеДанных(9));
    Возврат Сериализовать(СжатыйПакет);
КонецФункции

Приём данных с устройства идёт через штатные «Чтение/Запись сообщения обмена» с явной обработкой конфликтов (приоритеты «Заменить в ЦБ», «Заменить в мобильном», «Обновление из ЦБ») и подтверждением номеров сообщений. Диспетчер сервисов разделён на понятные шаблоны — Registration, Synchronization, Update, Check, — а все ошибки клиента и сервера пишутся в отдельный регистр-журнал с автоочисткой. О том, как мы вообще проектируем backend для мобильных приложений 1С, — в статье Backend для мобильного приложения на 1С, а про выбор формата пакета — в XDTO vs JSON.

Гибкие карточки согласования

Согласование — это не просто «да/нет». Документ задачи несёт срок исполнения, срочность, контрагента, организацию, HTML-текст с телом заявки, вложенные файлы и — главное — настраиваемый набор действий и полей. В карточке задачи описываются свои команды (табличная часть «Команды задачи») и дополнительные поля с обязательностью заполнения и списками выбора, поэтому под новый тип согласования не нужно переписывать приложение — достаточно сконфигурировать документ на сервере:

  • Команды задачи — динамические кнопки решения (например, «Согласовано», «Не согласовано», «Вернуть на доработку»), которые приложение рисует на форме.
  • Дополнительные поля — комментарий, сумма, причина отказа и т.п., с флагом обязательности и предопределённым списком выбора.
  • Исполнители — таблица сотрудников-согласантов; при входе устройства сервер сам регистрирует для него только его задачи.

Серверная сторона опубликована как HTTP-сервис на веб-сервере — как это делается на проде, мы описали в статье Публикация 1С на веб-сервере.

Что в итоге

Заказчик получил готовый продукт из двух частей — мобильное приложение и серверную конфигурацию, — спроектированный под масштаб до 5 000 устройств: беспарольный вход по коду из письма, изоляция мобильных пользователей от учётной базы через токены доступа и одну роль, автономная работа и экономный обмен по нестабильной сети, а также согласование любых типов документов без доработки под каждый новый маршрут.

Похожие мобильные решения на платформе 1С мы уже собирали в других отраслях — например, мобильное приложение торгового представителя (офлайн-сбор заказов) и приложение для приёмки в автосервисе.

Хотите такое же приложение под свою задачу — на мобильной платформе 1С, с безопасной авторизацией и обменом? Разбираем всю кухню на курсе Мобильный клиент 1С или беремся за разработку под ключ — оставьте заявку.

Частые вопросы

Читать по теме

Нужен похожий проект?

Опишите задачу — оценю сроки и стоимость.