Я хочу рассказать про опыт интеграции 1С на сайт в личный кабинет: с какими проблемами сталкивались, как их решали и какие инструменты для этого использовали.
За время работы мы с командой смогли изменить позиционирование 1С от вспомогательной бухгалтерской системы до фундамента финансового, регламентированного и оперативного учета. Мы доказали, что 1С может быть средой быстрой разработки и инструментом, который обеспечивает потребности фронт- и бэк-контуров.
Повод для изменений: инцидент и архитектурный контекст
В июне 2024 года произошел коллапс, из-за которого наши сервисы были недоступны несколько дней. Функционал восстановили, но остались нюансы и потери.

Структура IT-системы выглядела следующим образом. Есть фронтовая часть с модулями: заказ, склад, закупка, юрлица и другие. За ними стоит бэк, в основном реализованный на Java, который обеспечивает работу фронта. Третьим эшелоном стоит 1С, в которую стекаются данные с бэка и ведется учет.

Потеряв один из бэк-модулей в результате масштабного сбоя, мы поначалу пошли по классическому пути его восстановления, но уперлись в то, что разработка модуля должна занять несколько месяцев. С учетом ситуации это было неприемлемо, и начались поиски альтернативных решений.
Решение через внедрение 1С на фронт: технология inframe
В качестве одного из альтернативных решений рассматривалась реализация того же функционала на 1С.

Мы предложили подход, при котором 1С, находившаяся глубоко в бэке, «растягивается» и выводится на фронт до пользователя. Это стало возможным благодаря появившемуся на тот момент функционалу inframe-запуска. Это режим встроенного окна, в котором внутри основного сайта выделяется область, и в ней открывается окно 1С.
1С в этом режиме запускается в упрощенном виде: без части заголовков, без шапки и без переходов по меню. Встроенное приложение работает в одном окружении и позволяет переоткрывать окна между модулями. Выглядит это так: основной сайт, панель разделов, верхние вкладки, и среди остальных вкладок одна открывает окно 1С.

На иллюстрации представлен функционал, который работает на 1С. Внешний вид немного отличается, особенно в верхней части интерфейса, но основной функционал полностью доступен.
Проблема авторизации и переход на OpenID Connect
Функционально это соответствовало нашим требованиям, но мы столкнулись с серьезным минусом – авторизацией.


При входе во вкладку система запрашивала логин и пароль, доменная авторизация не проходила. Это выглядело странно: пользователь входил в систему через единую авторизацию, а при открытии отдельных вкладок должен был вводить еще один пароль. Получилось некрасиво, неудобно и нефункционально.
В поисках решения мы пришли к тому, что 1С поддерживает различные способы авторизации, в том числе аутентификацию через OpenID Connect.

Эта система использует стороннего провайдера OpenID. В нашем случае это Keycloak-провайдер. Он отвечает за авторизацию и отдает клиенту cookie-файл с результатом авторизации. На стороне клиента cookie сохраняется. Системы, которые поддерживают такой механизм, видят успешную авторизацию и позволяют работать без дополнительного входа.
Получилась система, в которой при запуске 1С в inframe-режиме дополнительная авторизация не требуется. Используются результаты авторизации, которая была выполнена при входе на сайт.
Переход на веб-режим по требованиям безопасности

Проблему авторизации мы решили, но через некоторое время начали ужесточать требования к безопасности. По результатам расследования инцидента сформулировали новые требования, в том числе отказ от массового VPN для пользователей, терминальных доступов и подобных механизмов. Это заставило перейти от работы в тонком клиенте для большинства пользователей к работе в вебе. Благодаря предыдущим наработкам мы были к этому готовы.
Мы решили не усложнять использование inframe и запускать 1С в обычном веб-режиме для тех баз, которые не требовались клиентам и партнерам. Запуск 1С вынесли в основное меню сайта: раздел «1С СДЕК» и список всех поддерживаемых в веб-режиме баз. Таким образом, пользователь получил доступ к работе из одного сервиса. Список баз находился в этом же интерфейсе, и больше не требовалось использовать стартер 1С, прописывать базы и запускать их вручную. Все работало отсюда.
Ограничения веб-режима и исключения для ЗУП
Основной минус веб-режима в том, что он не поддерживает работу с длительными запросами. В этом случае срабатывают тайм-ауты: появляется сообщение о том, что приложение зависло и требуется подождать, после чего сеанс прерывается. Это решается оптимизацией, выводом операций в асинхронный режим или использованием регламентных заданий.
Область, которую мы не смогли закрыть, – работа с ЗУП. Она требовала глубокой переработки типового функционала, и дальнейшее поддержание ЗУП стало бы слишком трудозатратным. Поэтому по ЗУП продолжил работу по старой схеме. Большую часть систем перевели на веб.
Проблема с OpenID Connect после обновления платформы
Следующая проблема возникла при очередном обновлении платформы: OpenID Connect перестал работать для веб-форм. Эта платформа была важна, потому что в ней 1С реализовала новую механику записи в регистры сведений, когда появилась поддержка добавления и объединения записей. Это позволяло значительно оптимизировать нагрузки. Нам был нужен этот функционал, но без рабочей авторизации по OpenID Connect использовать его было невозможно.
Переход на JWT-токены
Мы начали искать альтернативу и нашли, что кроме OpenID Connect поддерживается авторизация по JWT-токену.

Эта технология тоже использует сторонние серверы аутентификации. Пользователь вводит логин и пароль на сервере аутентификации и получает в ответ не cookie-файл, как в случае с OpenID Connect, а JWT-токен – JSON Web Token. Все последующие вызовы к серверу приложений отправляются с этим токеном в заголовке. Сервер проверяет валидность токена и при успешной проверке возвращает результат, а при ошибке – отказ в доступе. Эта технология у нас заработала. Мы не стали переносить ее на все системы, а использовали только там, где критичен был переход на 25-ю версию платформы с поддержкой новой записи регистров.
Проблема сессий и обработки ошибок при использовании JWT

Когда мы начали работать с токенами, появилась новая проблема. Периодически сеансы завершались с сообщением о непредвиденной ошибке или о завершении сеанса администратором и предлагалось перезапустить сеанс. После перезапуска открывался уже новый сеанс, для которого старый токен был недействителен. В результате все зависало вплоть до ручного перезапуска вкладки.
Мы начали искать решение. Им оказался механизм, при котором при получении такого сообщения родительское окно – сайт – перезапускало вкладку с 1С. Она проходила авторизацию заново, получала свежий токен и продолжала работу. Проблема заключалась в том, что для родительского окна невозможно было отличить, какое именно сообщение всплывает в дочернем окне 1С. Поэтому на любое сообщение об ошибке оно реагировало одинаково и перезапускало окно, независимо от того, требовалось это или нет.
Эту проблему мы решили с помощью механики обработки ошибок и вывода пользовательских форм сообщений об ошибках. Все формы, не требующие перезапуска, мы заменили на свои. На формы, требующие перезапуска, повесили триггер, по которому родительское окно переоткрывает вкладку с 1С.
Опыт перехода на платформу 8.5

Следующим шагом мы запустили систему на платформе 8.5. Опыт оказался положительным: формы стали более приятными и отзывчивыми, скорость интерфейса выросла. Общая оценка нового интерфейса была положительной со всех сторон. Особенно заметно это на фоне прошлых крупных изменений – например, перехода на интерфейс «Такси», который вызвал много споров и недовольства. В этот раз интерфейс зашел отлично.
Итоги
-
Запуск 1С в режиме inframe удобен для интеграции, когда в существующую систему требуется добавить функционал 1С.
-
1С поддерживает большой список методов авторизации, что помогает в разных сценариях. Сейчас доступны авторизация по почте, двойная аутентификация и другие варианты.
-
Обновления платформы всегда несут риски внезапных поломок того, что раньше работало стабильно.
-
Новый интерфейс 8.5 показал себя позитивно.
*************
Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TECH EVENT.
Вступайте в нашу телеграмм-группу Инфостарт