Реализация сценария, при котором пользователь переходит по ссылке из почты, мессенджера или другой системы сразу в форму документа 1С, является классической задачей интеграции. Основная сложность здесь заключается в обеспечении безопасности и удобства: пользователь не должен вручную вводить логин и пароль, а система должна «понять», какой именно объект нужно открыть, основываясь на переданных данных.
В этой статье мы разберем, как правильно настроить веб-клиент 1С для работы с внешними ссылками, рассмотрим методы автоматической авторизации и программную обработку параметров запуска. Мы пройдем путь от формирования структуры URL до написания кода в модуле управляемого приложения.
Для начала проанализируем, как платформа 1С воспринимает внешние ссылки. Веб-клиент поддерживает стандартные параметры командной строки, которые можно передавать прямо в адресной строке браузера. Рассмотрим основные из них:
N — имя пользователя (логин).P — пароль пользователя.C — параметр запуска (произвольная строка, которую можно прочитать в коде).Типовая ссылка с явной передачей учетных данных может выглядеть следующим образом: http://myserver/base_name/?N=TechnicalUser&P=Password123&C=ID_999. В данном примере мы заходим под техническим пользователем и передаем идентификатор документа в параметре C.
Передавать пароль в открытом виде в строке URL крайне небезопасно: он сохраняется в истории браузера и логах сервера. Чтобы избежать этого, мы проанализируем возможность использования файла публикации default.vrd. Это позволяет создать отдельную «точку входа» для внешних ссылок с уже прописанными учетными данными.
Разберем, как это настроить. На веб-сервере (IIS или Apache) создается отдельная публикация базы (например, base_guest). В каталоге этой публикации находим файл default.vrd и добавляем в него атрибуты авторизации:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
base="/base_guest"
ib="Srvr="ServerName";Ref="BaseName";"
usr="TechnicalUser"
pwd="SecretPassword">
<standardOdata enable="false"/>
</point>
Теперь при обращении по адресу http://myserver/base_guest/?C=31256 1С автоматически авторизует сеанс под указанным пользователем, и нам останется только обработать параметр C.
После того как авторизация прошла успешно, нам необходимо перехватить переданный параметр и открыть нужный документ. Рассмотрим, как это сделать в Модуле управляемого приложения. Основным событием здесь является ПриНачалеРаботыСистемы.
Выясним, как извлечь данные. В платформе существует глобальное свойство ПараметрЗапуска, которое содержит всё, что было передано после ключа C= в URL. Проанализируем пример кода для обработки этого параметра:
Процедура ПриНачалеРаботыСистемы()
// Получаем переданный ID из URL
ПереданныйID = ПараметрЗапуска;
Если ЗначениеЗаполнено(ПереданныйID) Тогда
// Вызываем обработчик открытия, используя ожидание,
// чтобы избежать блокировки всплывающих окон браузером
ПодключитьОбработчикОжидания("ПрикладнаяОбработкаВнешнегоПерехода", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
Важный момент: мы используем ПодключитьОбработчикОжидания. Это необходимо, так как браузеры часто блокируют открытие новых окон (форм), если они вызываются напрямую в момент инициализации приложения. Рассмотрим процедуру обработки подробнее:
Процедура ПрикладнаяОбработкаВнешнегоПерехода() Экспорт
// Распарсим параметр запуска, если там передано несколько значений
// Например: "ID_31256;Period_2023"
ДанныеПараметра = ПараметрЗапуска;
// Логика поиска документа по ID (в данном случае ID физлица)
ФизлицоСсылка = Справочники.ФизическиеЛица.НайтиПоРеквизиту("ID_Внешний", ДанныеПараметра);
Если Не ФизлицоСсылка.Пустая() Тогда
// Устанавливаем параметры сеанса, если это необходимо для RLS или логики базы
// УстановитьПараметрыСеансаДляФизлица(ФизлицоСсылка);
// Поиск или создание документа для этого физлица
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", НайтиДокументПоФизлицу(ФизлицоСсылка));
ОткрытьФорму("Документ.АнкетаПользователя.ФормаОбъекта", ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию с безопасностью. Если мы передаем в ссылке просто порядковый номер ID, злоумышленник может легко перебрать значения и получить доступ к чужим данным. Чтобы этого не произошло, мы настоятельно рекомендуем использовать GUID (уникальные идентификаторы) или временные токены.
Разберем по шагам безопасный алгоритм:
ВнешниеСсылки с полями: Токен (GUID), Объект (Ссылка), СрокДействия (Дата).?C=550e8400-e29b-41d4-a716-446655440000.Посмотрим на ситуацию со стороны прав. Технический пользователь, под которым осуществляется вход, должен обладать достаточными правами для просмотра и редактирования целевого документа. Однако, если в базе включен RLS (ограничение доступа на уровне записей), технический пользователь может не «увидеть» документ конкретного физлица.
Существует два способа решения этой проблемы:
УстановитьПривилегированныйРежим(Истина) в процедурах поиска и первичной обработки.ПараметрыСеанса.ТекущийПользователь, чтобы штатные механизмы RLS отработали корректно для того лица, чей ID передан в ссылке.Помимо параметров запуска, стоит упомянуть технологию OpenID. Если в вашей организации используется единая система аутентификации, 1С может быть настроена на работу через OpenID-провайдер. В этом случае пользователь, уже авторизованный в своей корпоративной сети, пробросит свою сессию в 1С автоматически без дополнительных настроек в URL.
Также платформа поддерживает формат навигационных ссылок e1cib/data/.... Если авторизация уже настроена через default.vrd, ссылка может выглядеть так: http://server/base/ru_RU/e1cib/data/Документ.Анкета?ref=baef24fd52be099511e9cfdc7065b2eb. Это самый короткий путь к объекту, но он менее гибкий, так как не позволяет выполнить произвольный код перед открытием формы.
Таким образом, мы выяснили, что наиболее надежным и гибким решением является использование выделенной публикации с преднастроенной авторизацией и передача уникального токена в параметре C, который обрабатывается в процедуре ПриНачалеРаботыСистемы через обработчик ожидания.