
Привет, Хабр! Меня зовут Александр Любин, я архитектор 1С в CDEK. В этой статье расскажу про наш опыт интеграции 1С в ERP‑систему и личный кабинет. Расскажу, с какими проблемами мы сталкивались, как их решали, какие инструменты использовали.
Мой опыт в разработке — 15 лет. Последние три с половиной года — в CDEK. За это время мы с командой смогли в корне изменить позиционирование 1C в компании от «что‑то там для бухгалтерии» до фундамента финансового, регламентированного и оперативного учёта. Смогли доказать, что 1C может быть средой быстрой разработки и инструментом, который позволяет обеспечить потребности как фронт, так и бэк контуров. Я расскажу, как у нас всё проходило.
Содержание
Тянем 1С до пользователя
В прошлом году наша структура выглядела следующим образом:

Была фронтовая часть, в которой представлены различные модули, такие как заказ, склад, закупка, юр.лица и множество других. За ними стоит бэк (в основном реализованный на Java), который обеспечивает функционирование фронта. И третьим эшелоном стояла 1С, в которую сливались данные с бэка для ведения учёта.
Позже мы потеряли один из модулей во время сбоя. Его восстановление в прежнем виде могло занять месяцы работы. Это было неприемлемо. Начались поиски альтернативных решений.

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

Это режим встроенного окна, когда внутри основного сайта можно выделить область, в которой уже будет открываться окно 1С. Сама 1С, поддержи��ающая этот режим, будет запускаться в упрощённом виде: без некоторых заголовков, шапок, переходов по меню. Важно, что встроенное приложение выглядит при этом органично.
Такой запуск позволяет вести работу в одном окружении, пользоваться переоткрытием окон из одного модуля в другое. Выглядит это следующим образом.

Вот наша ERP‑система: панель разделов, вкладки сверху и одна из них открывает окно 1С. Так и подписано «работает на 1С». Внешний вид немного отличается, особенно в шапочной части. Но весь основной функционал здесь уже есть.
Настраиваем бесшовную авторизацию
Функционально это было то, что нам требуется. Основной минус, с которым столкнулись — вопрос авторизации. При входе на эту вкладку система просила ввести логин‑пароль.

Доменная авторизация не проходила. Это выглядело очень странно для пользователя, потому что при входе в ERP‑систему он проходил общую авторизацию (SSO), единую для всех разделов, а при открытии определённых вкладок требовался ещё дополнительный логин‑пароль — некрасиво, неудобно и нефункционально.
В поисках решения этой проблемы мы пришли к тому, что 1С поддерживает различные способы авторизации, в том числе аутентификацию через OpenID Connect. Эта система построена на использовании стороннего провайдера OpenID. В нашем случае — keycloak‑провайдер. Он отвечает за авторизацию. Отдаёт куки‑файл на результат авторизации на клиента. У клиента это сохраняется в качестве куки‑файлов.

В дальнейшем все системы, которые поддерживают подобную авторизацию, видят, что авторизация прошла успешно, и позволяют пользователю работать в системе без какого‑либо дополнительного входа.
Мы получили систему, когда при запуске нашей 1С in‑frame никакой дополнительной авторизации не требуется. Она использует результаты той, которая была выполнена при входе на сайт. Эту задачу мы закрыли.
Переводим системы в веб
Вскоре в компании начали усиливать информационную безопасность. Было принято решение отказаться от массового VPN на пользователей, терминальных доступов и всего подобного.
Это нас заставило перейти из работы в тонком клиенте для большинства пользователей на работу в веб. По результатам предыдущей работы мы уже были к этому готовы. Но решили не усложнять использование in‑frame, а запускать 1C в обычном веб‑режиме.
Весь запуск 1С тоже вывели в основное меню, в раздел «1С СДЭК» со списком систем, поддерживаемых в веб‑режиме.

Пользователь получил работу из одного сервиса. Список баз тоже содержался здесь. Уже не требовалось использовать стартер 1C, прописывать там базы и запускать. Всё работало отсюда. Основной минус, с которым мы столкнулись — веб‑режим не поддерживает работу с длительными запросами.
Срабатывают тайм‑ауты и сначала выводят сообщение, что приложение зависло, предлагая подождать, а потом сеанс прерывается. Это решается по большей части оптимизацией, выводом в асинхронный режим или регламентными заданиями.
Одна из областей, которую мы не смогли решить — работа с ЗУПом. Она требовала глубокой переработки типового функционала. В дальнейшем поддержание программы было бы слишком трудозатратным. Поэтому по ЗУПу мы оставили работу на старой схеме, а большую часть систем благополучно перевели на веб.
Чиним авторизацию
При очередном обновлении платформы у нас сломался OpenID Connect. Он перестал работать для веб‑форм, и всё.

Новая платформа была для нас важна, потому что в ней 1С реализовала новую механику работы с регистрами сведений, точнее с её записью: начала поддерживать добавление записей, объединение, слияние. Это бы позволило очень сильно оптимизировать наши нагрузки. Функционал был востребован, а из‑за отсутствия OpenID коннекта мы не могли его применять.
Начали искать альтернативы и выяснили, что кроме OpenID Connect есть авторизация по JWT‑токену. Здесь тоже используется сторонний сервер аутентификации.

Пользователь при авторизации вводит логин‑пароль для этого сервера, а в ответ получает не куки‑файл для OpenID коннекта, а JWT‑токен. Во всех последующих серверных вызовах в заголовке указывается этот токен. Сервер приложений проверяет валидность токена и в случае, если всё валидно, возвращает результат. А если нет — ошибку доступа.
Технология благополучно у нас заработала. Мы не стали портировать её по всем системам, а сделали только для тех, где был критичен переход именно на 25-ю платформу с поддержанием новой записи регистров. Но когда начали работать с токенами, столкнулись со следующей проблемой. Периодически происходило отваливание сеансов с сообщением, что «возникла непредвиденная ошибка или сеанс был завершен администратором». Предлагалось перезапустить сеанс.
Когда этот сеанс перезапускался, это был уже другой сеанс, к которому старый токен не применялся. Всё зависало. Решалось ручным перезапуском вкладки. Пользователи не понимали, почему всё зависло и как это исправить.
В поисках решения выяснили, что при получении такого сообщения родительское окно, то есть сайт, перезапускал вкладку с 1С — авторизация выполнялась по новой, приходил свежий токен и работа благополучно продолжалась. При этом родительское окно не могло отличить, какое сообщение об ошибке всплывает у дочернего окна с 1С. На любое сообщение об ошибке оно реагировало одинаково — перезапуском всего окна, независимо от того, требовалось это или нет.
Проблему решили с помощью новой механики, возможности обработки ошибок и вывода св��их пользовательских форм сообщения об ошибках.
Все формы, не требующие перезапуска, мы поменяли на свои; а на требующие повесили триггер, по которому родительское окно переоткрывало вкладку с 1С.
Тестируем платформу 8.5
Следующий шаг, который мы сделали — попробовали запустить систему на платформе 8.5. Опыт понравился: формы стали гораздо приятнее, отзывчивые, скорость работы интерфейса улучшилась. Общий отзыв от нового интерфейса был положительным.
Особенно если вспомнить, что после предыдущих серьёзных изменений интерфейса на шасси в 1С было очень много недовольных пользователей и холиваров.

Выводы
1. Запуск 1С в режиме in‑frame очень удобен для интеграции, когда уже есть существующая система и требуется добавить туда дополнительный функционал (именно 1С).
2. 1С поддерживает уже достаточно большой список возможностей авторизации разными методами (по почте, двойная аутентификация), что помогает в различных ситуациях.
3. Обновления платформы всегда несут риски — то, что всегда работало, может внезапно отвалиться. Будьте готовы искать новые решения.
4. Новый интерфейс 8.5 весьма позитивен.
Задавайте вопросы и делитесь своим опытом интеграции 1С в комментариях — с удовольствием отвечу и обсужу!
Miratvorets
а как вы решились использовать тестовую-ознакомительную версию платформы (8.5) на проде?