Реализация личного кабинета (ЛК) для клиентов — одна из самых востребованных задач при интеграции 1С с веб-технологиями. Основная цель заключается в том, чтобы клиент мог через браузер авторизоваться, оставить заявку, прикрепить документы и отслеживать статус выполнения в реальном времени. При этом крайне важно понимать, как система будет работать с лицензиями и какими техническими средствами лучше воспользоваться. Разберем все варианты реализации по шагам.
Самый простой путь — опубликовать базу на веб-сервере (Apache или IIS) и использовать встроенный механизм внешних пользователей. В этом случае интерфейс 1С будет доступен прямо в браузере.
Особенности лицензирования:
Этот подход считается наиболее профессиональным и масштабируемым. Мы разделяем систему на две части: бэкенд (логика в 1С через HTTP-сервисы) и фронтенд (сайт на JavaScript, React, Vue или даже Java/C#).
Проанализируем, как в этом случае работают лицензии. Технически 1С использует механизм пула соединений. Когда браузер клиента делает запрос к HTTP-сервису, 1С открывает сеанс, выполняет код и возвращает сеанс в пул. Если запросы кратковременные, один сеанс (и одна лицензия) может обслужить десятки пользователей, заходящих по очереди. Однако с юридической точки зрения, согласно политике фирмы 1С, использование программных средств мультиплексирования не освобождает от необходимости лицензирования каждого конечного пользователя. На практике многие ограничивают количество одновременно работающих сессий в настройках публикации default.vrd.
Рассмотрим пример простейшего HTTP-сервиса для получения статуса заявки:
Функция ПолучитьСтатусЗаявки(Запрос)
НомерЗаявки = Запрос.ПараметрыURL.Получить("Number");
ЗапросКБД = Новый Запрос;
ЗапросКБД.Текст =
"ВЫБРАТЬ
| ЗаявкаКлиента.Статус КАК Статус
|ИЗ
| Документ.ЗаявкаКлиента КАК ЗаявкаКлиента
|ГДЕ
| ЗаявкаКлиента.Номер = &Номер";
ЗапросКБД.УстановитьПараметр("Номер", НомерЗаявки);
Результат = ЗапросКБД.Выполнить().Выгрузить();
Если Результат.Количество() > 0 Тогда
Ответ = Новый Соответствие;
Ответ.Вставить("status", Строка(Результат[0].Статус));
JSON = Новый ЗаписьJSON;
JSON.УстановитьСтроку();
ЗаписатьJSON(JSON, Ответ);
СтрокаОтвета = JSON.Закрыть();
Возврат Новый HTTPСервисОтвет(200, СтрокаОтвета);
Иначе
Возврат Новый HTTPСервисОтвет(404);
КонецЕсли;
КонецФункции
Если нет желания писать каждый HTTP-сервис вручную, можно воспользоваться встроенным механизмом OData. Достаточно включить соответствующую опцию в свойствах конфигурации и опубликовать базу. Это позволит внешнему сайту обращаться к справочникам и документам напрямую через стандартные GET/POST запросы.
Разберем преимущества этого метода:
Для реализации загрузки файлов (например, сканов документов к заявке) через HTTP-сервис мы рекомендуем использовать передачу данных в формате Base64 или передачу бинарных данных напрямую в теле POST-запроса. Проанализируем пример получения файла в 1С:
// Пример обработки входящего файла в теле HTTP-запроса
ДанныеФайла = Запрос.ПолучитьТелоКакДвоичныеДанные();
ИмяФайла = Запрос.ПараметрыURL.Получить("FileName");
// Сохраняем во временное хранилище или прикрепляем к документу
СправочникФайлы = Справочники.Файлы.СоздатьЭлемент();
СправочникФайлы.Наименование = ИмяФайла;
СправочникФайлы.ФайлХранилище = Новый ХранилищеЗначения(ДанныеФайла);
СправочникФайлы.Записать();
Важно помнить, что выставлять 1С напрямую в интернет — это риск. Рассмотрим стандартную архитектуру безопасности:
Такая схема позволяет кэшировать данные (чтобы не нагружать 1С и не тратить лишние лицензии на каждый чих пользователя) и защищает базу от прямых атак.
Выясним, какой путь выбрать именно вам. Если у вас 5-10 партнеров и бюджет позволяет купить лицензии — используйте веб-клиент. Если вы строите публичный сервис для сотен или тысяч клиентов — делайте ставку на HTTP-сервисы и внешний сайт на JavaScript. Это даст максимальную скорость работы и гибкость интерфейса. Для ускорения разработки обратите внимание на библиотеку metadata.js, которая позволяет упростить взаимодействие фронтенда с метаданными 1С.