В процессе интеграции 1С с корпоративными порталами или сторонними веб-ресурсами часто возникает задача: предоставить пользователю прямую ссылку, при переходе по которой в веб-клиенте сразу откроется нужный отчет или форма. Это избавляет сотрудников от необходимости искать объект в интерфейсе программы. Рассмотрим подробно, как реализовать этот механизм, используя штатные возможности платформы 1С:Предприятие 8.3.
Для передачи произвольных данных в конфигурацию при запуске используется ключ C (латинская «си»). В контексте веб-клиента этот параметр добавляется в строку URL. Структура ссылки выглядит следующим образом:
http://сервер/имя_базы/?C=ИмяНужногоОбъекта
Важно понимать, что всё, что указано после знака равенства, платформа воспринимает как единую строку и помещает в глобальную переменную ПараметрЗапуска. Проанализируем, как получить эти данные на стороне 1С. Основная работа происходит в модуле управляемого приложения.
Для того чтобы система отреагировала на переданный параметр, нам необходимо прописать логику в процедуре ПриНачалеРаботыСистемы. Разберем по шагам создание вспомогательной обработки, которая будет выступать в роли «диспетчера».
Предположим, мы создали в конфигурации обработку с именем ВспомогательныйЗапуск. В модуле управляемого приложения пропишем следующий код:
Процедура ПриНачалеРаботыСистемы()
// Проверяем, не пуст ли параметр запуска
Если НЕ ПустаяСтрока(ПараметрЗапуска) Тогда
// Формируем структуру параметров для открытия формы
ПараметрыПерехода = Новый Структура;
ПараметрыПерехода.Вставить("ИмяОбъектаДляОткрытия", ПараметрЗапуска);
// Открываем форму вспомогательной обработки
ОткрытьФорму("Обработка.ВспомогательныйЗапуск.Форма.Форма", ПараметрыПерехода);
КонецЕсли;
КонецПроцедуры
Важный нюанс: Почему мы не открываем нужный отчет напрямую из ПриНачалеРаботыСистемы? Использование промежуточной обработки позволяет разделить логику инициализации системы и логику поиска/подключения внешних объектов, что делает код более чистым и безопасным.
Часто отчеты и обработки хранятся в справочнике ДополнительныеОтчетыИОбработки (или ВнешниеОбработки). Чтобы запустить такой объект по его имени, переданному в URL, рассмотрим программный код внутри нашей вспомогательной обработки.
Воспользуемся событием ПриОткрытии на клиенте и серверными функциями для извлечения двоичных данных. Проанализируем пример кода:
&НаСервере
Функция ПолучитьДанныеОбработки(ИмяОбработки)
// Ищем объект в справочнике по наименованию
СсылкаНаОбъект = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОбработки);
Если СсылкаНаОбъект.Пустая() Тогда
Возврат Неопределено;
КонецЕсли;
// Получаем двоичные данные из хранилища
ДвоичныеДанные = СсылкаНаОбъект.ХранилищеВнешнейОбработки.Получить();
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
Возврат АдресХранилища;
КонецФункции
&НаСервере
Функция ПодключитьИПолучитьИмя(АдресХранилища)
// Регистрируем внешнюю обработку в сеансе
Возврат ВнешниеОбработки.Подключить(АдресХранилища);
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Параметры.Свойство("ИмяОбъектаДляОткрытия") Тогда
Попытка
Адрес = ПолучитьДанныеОбработки(Параметры.ИмяОбъектаДляОткрытия);
Если Адрес <> Неопределено Тогда
ИмяПодключенной = ПодключитьИПолучитьИмя(Адрес);
// Открываем форму подключенной обработки
ОткрытьФорму("ВнешняяОбработка." + ИмяПодключенной + ".Форма");
// Закрываем саму "открывашку"
ЭтаФорма.Закрыть();
КонецЕсли;
Исключение
Сообщить("Ошибка при запуске: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Если нам нужно передать не просто имя отчета, но и, например, дату начала периода или конкретную организацию, строка C становится сложнее. Поскольку 1С воспринимает всё после C= как одну строку, нам необходимо использовать разделители. Рассмотрим наиболее эффективный метод — использование функции СтрРазделить().
Пример URL: .../?C=Продажи;01.01.2023;ОсновнойСклад
Разберем, как десериализовать эти данные:
// В модуле обработки-открывашки
МассивПараметров = СтрРазделить(ПараметрЗапуска, ";");
ИмяОтчета = МассивПараметров[0];
ДатаНачала = МассивПараметров[1];
Для передачи сложных структур рекомендуем использовать JSON. Строка JSON должна быть предварительно закодирована в формат URL (percent-encoding), чтобы спецсимволы (кавычки, скобки) не нарушили структуру ссылки.
Чтобы пользователь не вводил логин и пароль при каждом переходе, в URL можно добавить ключи N (Name) и P (Password). Внимание: это небезопасно для открытых сетей, так как пароль будет виден в истории браузера. Однако в закрытых корпоративных сетях это допустимо.
Пример полной ссылки: http://server/base/?N=Ivanov&P=SuperPass123&C=ReportDaily
Если в базе настроена аутентификация по протоколам OpenID или SAML, параметры N и P указывать не нужно — система узнает пользователя автоматически по его доменной учетной записи.
Выясним, когда можно обойтись без программирования в ПриНачалеРаботыСистемы. Платформа 1С поддерживает навигационные ссылки, которые позволяют открывать объекты напрямую. Формат ссылки:
http://server/base/#e1cib/app/Отчет.Продажи
Сравним методы:
Рассмотрим технические нюансы публикации. Если ваша база опубликована на Apache под управлением Linux, обратите внимание на файл default.vrd. В нем не должно быть жестко прописанных параметров авторизации в секции <authentication>, если вы планируете передавать разных пользователей через URL. Также помните, что Linux чувствителен к регистру символов в путях, хотя для параметров внутри строки запроса 1С это обычно не играет роли.
Проанализируем риски: если злоумышленник узнает, что ваша база умеет запускать любую внешнюю обработку по имени из URL, он может попытаться запустить конфиденциальные отчеты. Чтобы этого избежать, добавим проверку прав в функцию ПолучитьДанныеОбработки.
Рекомендуемые меры защиты:
Для «высокопоставленных пользователей», которым нужен только отчет и ничего лишнего, рекомендуем использовать параметр O=Simple. Это запустит веб-клиент в режиме, где скрыты панели разделов, меню функций и другие «тяжелые» элементы интерфейса. Ссылка примет вид:
http://server/base/?O=Simple&C=MyExecutiveDashboard
Таким образом, мы получаем лаконичное веб-приложение, которое выглядит как отдельный портал, но при этом работает на мощностях 1С.