При интеграции корпоративного сайта или личного кабинета с учетной системой часто возникает необходимость перенаправить пользователя со страницы браузера напрямую в интерфейс 1С. При этом требуется не просто открыть веб-клиент, но и передать в сеанс определенный контекст: идентификатор пользователя, номер заказа, код номенклатуры или признак действия, которое необходимо выполнить сразу после авторизации.
Разберем подробно, как устроен этот механизм в платформе «1С:Предприятие 8.3», какие существуют стандартные возможности передачи параметров через URL, как правильно обработать полученные данные в конфигурации и какие архитектурные нюансы следует учитывать при реализации таких переходов.
Платформа 1С поддерживает передачу произвольных строковых данных в сеанс с помощью параметра запуска /C (в строке URL веб-клиента он передается как GET-параметр C). Это штатный способ передачи пользовательских параметров при старте приложения.
Разберем структуру формирования адреса на стороне сайта:
http://myserver/mybase/).?C=ЗначениеПараметра.Если требуется передать сложную структуру данных (например, ID пользователя и код карточки услуги), упакуем значения в строку с разделителями или в формат JSON, после чего обязательно выполним URL-кодирование (процентное кодирование специальных символов):
Пример URL: http://myserver/mybase/?C=UserID%3D12345%26ServiceID%3D98765
Теперь выясним, как принять и обработать этот параметр внутри конфигурации 1С. В коде управляемого приложения переданная строка становится доступной через глобальное свойство ПараметрЗапуска. Перехват удобнее всего выполнять в модуле управляемого приложения в предопределенной процедуре ПриНачалеРаботыСистемы или ПриОбработкеПараметровЗапуска.
Посмотрим на пример кода в модуле управляемого приложения:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
Если Не ПустаяСтрока(ПараметрЗапуска) Тогда
ОбработатьВходныеПараметры(ПараметрЗапуска);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВходныеПараметры(Знач СтрокаПараметров)
// Предположим, параметры переданы в формате "Ключ1=Значение1;Ключ2=Значение2"
МассивПар = СтрРазделить(СтрокаПараметров, ";");
СтруктураПараметров = Новый Структура;
Для Каждого Пара Из МассивПар Цикл
ПозицияРазделителя = СтрНайти(Пара, "=");
Если ПозицияРазделителя > 0 Тогда
ИмяПараметра = Лев(Пара, ПозицияРазделителя - 1);
ЗначениеПараметра = Сред(Пара, ПозицияРазделителя + 1);
СтруктураПараметров.Вставить(ИмяПараметра, ЗначениеПараметра);
КонецЕсли;
КонецЦикла;
// Выполняем логирование и открытие целевой формы
Если СтруктураПараметров.Свойство("UserID") Тогда
ЗафиксироватьВходПользователя(СтруктураПараметров.UserID);
КонецЕсли;
Если СтруктураПараметров.Свойство("ServiceID") Тогда
ПараметрыОткрытия = Новый Структура("Ключ", ПолучитьСсылкуНаУслугу(СтруктураПараметров.ServiceID));
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыОткрытия);
КонецЕсли;
КонецПроцедуры
Если задача заключается исключительно в том, чтобы открыть конкретный существующий документ или элемент справочника, платформа предоставляет механизм прямых навигационных ссылок e1cib.
Рассмотрим, как формируется навигационная ссылка для веб-клиента:
http://myserver/mybase/#e1cib/data/Справочник.Номенклатура?ref=8a1b2c3d4e5f...http://myserver/mybase/#e1cib/app/Обработка.КарточкаУслуги?ID=12345При таком подходе платформа автоматически обрабатывает навигационную ссылку и сразу после авторизации открывает нужную форму, что избавляет от необходимости вручную разбирать ПараметрЗапуска в модуле приложения.
Проанализируем риски прямой передачи данных в URL. Параметры, переданные открытым текстом в строке браузера, сохраняются в истории переходов, логах веб-серверов (IIS, Apache, Nginx) и могут быть перехвачены или подменены пользователем вручную. Если необходимо передавать чувствительные сведения или параметры авторизации, рекомендуется использовать связку HTTP-сервиса и одноразовых токенов.
Разберем по шагам алгоритм работы такой схемы:
HTTP-сервису 1С, передавая все необходимые параметры (ID пользователя, данные сессии сайта, целевое действие).http://myserver/mybase/?C=ТОКЕН_GUID и открывает новое окно браузера.ПриНачалеРаботыСистемы 1С считывает переданный токен, получает из регистра соответствующие данные, удаляет использованный токен (исключая повторный вход по этой же ссылке) и выполняет открытие целевого интерфейса.Посмотрим на пример обработки одноразового токена при запуске сеанса:
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
Если Не ПустаяСтрока(ПараметрЗапуска) Тогда
ДанныеСеанса = ПолучитьДанныеПоТокенуНаСервере(ПараметрЗапуска);
Если ДанныеСеанса <> Неопределено Тогда
ОткрытьФорму(ДанныеСеанса.ИмяФормы, ДанныеСеанса.ПараметрыФормы);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При реализации открытия 1С с внешних веб-ресурсов необходимо учитывать следующие факторы:
?C=, должны быть приведены к стандарту URL-encoding, иначе спецсимволы (пробелы, амперсанды, кириллица) могут некорректно прочитаться платформой.