URL из 1С в браузер: от одной строки кода до COM и командной строки
Содержание
Чтобы открыть ссылку в браузере из 1С 8.3, хватит одной строки в клиентской процедуре: ПерейтиПоНавигационнойСсылке("https://адрес"). Платформа сама передаст адрес браузеру по умолчанию. Метод работает в тонком, толстом и веб-клиенте, никаких COM-объектов и внешних компонент не нужно.
Остальные методы нужны в особых случаях: открыть страницу в конкретном браузере, запустить её через командную строку на Linux, дождаться результата или поддержать старый код на обычных формах. Тема общая для платформы, от конфигурации (БП, ЗУП, УТ) способ не зависит.
Базовые способы: ПерейтиПоНавигационнойСсылке и ЗапуститьПриложение
В языке 1С есть два штатных метода, которые принимают URL. Оба выполняются только на клиенте, то есть в процедуре с директивой &НаКлиенте.
ПерейтиПоНавигационнойСсылке
Самый универсальный вариант. Понимает и внешние адреса (http://, https://, mailto:), и внутренние ссылки 1С вида e1cib/....
&НаКлиенте
Процедура ОткрытьСайтНалоговой(Команда)
ПерейтиПоНавигационнойСсылке("https://www.nalog.gov.ru");
КонецПроцедуры
- ✅ работает во всех клиентах, включая веб-клиент;
- ✅ не требует прав на COM и расширений браузера;
- ✅ в веб-клиенте открывает адрес в новой вкладке.
ЗапуститьПриложение
Метод запускает «файл или команду» средствами операционной системы. Если передать ему URL, Windows откроет его тем браузером, что назначен по умолчанию.
&НаКлиенте
Процедура ОткрытьСайтЧерезЗапуск(Команда)
ЗапуститьПриложение("https://www.nalog.gov.ru");
КонецПроцедуры
Его преимущество в том, что строку можно дополнить параметрами командной строки: например, указать путь к нужному браузеру. Недостаток: в веб-клиенте метод требует установленного расширения для работы с файлами.
Асинхронный вариант
В платформе 8.3.18 и новее есть ЗапуститьПриложениеАсинх и конструкция Асинх/Ждать. Так удобно обработать ошибку запуска, не блокируя форму:
&НаКлиенте
Асинх Процедура ОткрытьСсылкуАсинх(Команда)
Попытка
Ждать ЗапуститьПриложениеАсинх("https://www.nalog.gov.ru");
Исключение
Сообщить("Не удалось открыть ссылку: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
На более ранних релизах платформы та же задача решается через НачатьЗапускПриложения с описанием оповещения.
Если нужна просто кнопка «Открыть сайт», берите ПерейтиПоНавигационнойСсылке. Остальные способы из этой страницы — инструменты для частных случаев.
Открытие URL через COM-объект WScript.Shell и Shell.Application
COM-подход пришёл из времён обычных форм и толстого клиента. Он до сих пор встречается в старых обработках, поэтому его полезно узнавать в чужом коде.
Работает только под Windows и только там, где разрешено создание COM-объектов: в тонком и толстом клиенте. В веб-клиенте и на Linux такой код упадёт с ошибкой.
Через WScript.Shell
&НаКлиенте
Процедура ОткрытьЧерезWScript(АдресСтраницы)
#Если НЕ ВебКлиент Тогда
Попытка
Shell = Новый COMОбъект("WScript.Shell");
Shell.Run(АдресСтраницы);
Исключение
Сообщить("Ошибка COM: " + ОписаниеОшибки());
КонецПопытки;
#КонецЕсли
КонецПроцедуры
Метод Run передаёт строку оболочке Windows. Для адреса с https:// оболочка находит браузер по умолчанию, как при двойном щелчке по ярлыку интернета.
Через Shell.Application
Объект Shell.Application даёт доступ к функции ShellExecute. Её удобно использовать, когда нужен конкретный браузер и отдельные аргументы:
&НаКлиенте
Процедура ОткрытьВChrome(АдресСтраницы)
#Если НЕ ВебКлиент Тогда
ShellApp = Новый COMОбъект("Shell.Application");
// файл, аргументы, рабочий каталог, операция, режим окна
ShellApp.ShellExecute("chrome.exe", АдресСтраницы, "", "open", 1);
#КонецЕсли
КонецПроцедуры
Если Chrome установлен стандартно, оболочка найдёт chrome.exe по реестру, полный путь указывать не нужно. Для Firefox подставьте firefox.exe, для Edge — msedge.exe.
Не используйте InternetExplorer.Application. Этот COM-объект часто встречается в старых примерах, но Internet Explorer в современных Windows отключён, и код либо не сработает, либо откроет Edge в режиме совместимости.
Запуск ссылки системной командой: start, xdg-open, open
Иногда ссылку проще отдать командному интерпретатору. Так делают, когда нужен браузер с ключами запуска (например, режим инкогнито) или когда код работает на клиенте под Linux или macOS.
Windows: команда start
&НаКлиенте
Процедура ОткрытьЧерезStart(АдресСтраницы)
Команда = "cmd /c start """" """ + АдресСтраницы + """";
ЗапуститьПриложение(Команда);
КонецПроцедуры
Пустые кавычки после start обязательны: первую строку в кавычках команда start считает заголовком окна. Без них адрес в кавычках «съестся» как заголовок, и браузер не откроется.
Адрес обязательно берите в кавычки. Символ & в URL для cmd означает конец команды. Ссылка https://site.ru/?a=1&b=2 без кавычек обрежется до ?a=1, а остаток cmd попробует выполнить как отдельную команду.
Конкретный браузер с параметром:
ЗапуститьПриложение("cmd /c start chrome --incognito """ + АдресСтраницы + """");
Старый метод КомандаСистемы делает то же самое, но синхронно и с мелькающим чёрным окном консоли. В новом коде его лучше заменить на ЗапуститьПриложение.
Linux и macOS
На клиенте под Linux за открытие URL отвечает утилита xdg-open, на macOS — open:
&НаКлиенте
Процедура ОткрытьНаLinux(АдресСтраницы)
ЗапуститьПриложение("xdg-open """ + АдресСтраницы + """");
КонецПроцедуры
Определить ОС клиента можно через Новый СистемнаяИнформация и свойство ТипПлатформы. Но если задача просто открыть адрес, проще сразу вызвать ПерейтиПоНавигационнойСсылке: платформа сама выберет нужный системный механизм.
WinAPI из 1С: что реально можно вызвать
Встроенный язык 1С не умеет напрямую вызывать функции Windows API, как это делают в C++ или Delphi. Объявить ShellExecuteW из shell32.dll и вызвать её строкой кода нельзя.
Рабочих путей к WinAPI три:
- 🔹 COM-обёртка.
Shell.Application.ShellExecuteиз раздела выше и есть вызов той самой функции ShellExecute, только через COM. - 🔹 Внешняя компонента. Компонента по технологии Native API пишется на C++, подключается методом
ПодключитьВнешнююКомпонентуи может вызывать любые функции ОС. Её делают, когда нужно управлять окнами, перехватывать фокус или работать с браузером глубже простого открытия. - 🔹 PowerShell или утилита. Например,
ЗапуститьПриложение("powershell -NoProfile -Command Start-Process 'https://site.ru'"). Это не WinAPI в чистом виде, но даёт те же возможности без компиляции.
Для открытия одной страницы внешняя компонента избыточна. Она оправдана, если в той же задаче есть другие низкоуровневые операции и компонента всё равно подключается.
Открыть ссылку в веб-клиенте, тонком и мобильном клиенте
Набор доступных способов зависит от того, где выполняется клиентский код.
| Способ | Тонкий клиент (Windows) | Тонкий клиент (Linux, macOS) | Веб-клиент | Толстый клиент |
|---|---|---|---|---|
ПерейтиПоНавигационнойСсылке | ✅ | ✅ | ✅ новая вкладка | ✅ |
ЗапуститьПриложение с URL | ✅ | через xdg-open / open | только с расширением для работы с файлами | ✅ |
COM WScript.Shell / Shell.Application | ✅ | ❌ | ❌ | ✅ |
cmd /c start | ✅ | ❌ | ❌ | ✅ |
Веб-клиент
Пользователь и так сидит в браузере, поэтому ПерейтиПоНавигационнойСсылке открывает адрес в соседней вкладке. Есть одна ловушка: блокировщик всплывающих окон.
Браузер разрешает открыть вкладку, только если вызов идёт прямо из нажатия кнопки. Если ссылка открывается после Ждать, вызова сервера с долгим ожиданием или в обработчике оповещения, браузер может посчитать это всплывающим окном и заблокировать. Пользователь увидит значок блокировки в адресной строке.
Что помогает:
- 🔸 открывать ссылку в обработчике команды сразу, а данные для адреса готовить заранее;
- 🔸 добавить адрес сайта с 1С в исключения блокировщика;
- 🔸 показать пользователю гиперссылку, чтобы он нажал её сам.
Мобильный клиент
В мобильном клиенте и мобильном приложении ПерейтиПоНавигационнойСсылке передаёт адрес системе, и та открывает браузер телефона. COM и командная строка там недоступны.
Код на сервере не откроет браузер у пользователя
Частая ошибка новичка: вызвать ЗапуститьПриложение в процедуре &НаСервере или в общем модуле, который работает на сервере. Код выполнится на компьютере сервера 1С, где никто не смотрит в экран. У пользователя ничего не произойдёт.
Правильная схема: сервер формирует адрес и возвращает его строкой, клиент вызывает метод открытия.
&НаКлиенте
Процедура ОткрытьКарточкуНаСайте(Команда)
Адрес = АдресКарточкиНаСервере(Объект.Ссылка);
Если ЗначениеЗаполнено(Адрес) Тогда
ПерейтиПоНавигационнойСсылке(Адрес);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция АдресКарточкиНаСервере(Ссылка)
Возврат "https://portal.example.ru/card?id=" + Строка(Ссылка.УникальныйИдентификатор());
КонецФункции
Без кода и через обработки: гиперссылки, поле HTML, HTTP-сервисы
Не всегда нужна команда с процедурой. Часть задач решается настройкой формы.
Надпись-гиперссылка на управляемой форме
В редакторе формы добавьте декорацию «Надпись» и включите у неё свойство Гиперссылка. В обработчике Нажатие вызовите ПерейтиПоНавигационнойСсылке. Пользователь видит подчёркнутый текст вместо кнопки.
Второй вариант — форматированная строка со ссылкой внутри текста:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.НадписьСправка.Заголовок = Новый ФорматированнаяСтрока(
"Справка по форме: ",
Новый ФорматированнаяСтрока("открыть на сайте", , , , "https://www.nalog.gov.ru"));
КонецПроцедуры
Для такой надписи в свойствах укажите, что заголовок отображается как форматированный текст. По щелчку платформа сама откроет адрес. Если нужно перехватить переход (проверить права, записать в журнал), заполните обработчик ОбработкаНавигационнойСсылки и установите в нём СтандартнаяОбработка = Ложь.
Поле HTML-документа
Если страницу нужно показать внутри 1С, а не во внешнем браузере, на форму выводят поле HTML-документа и присваивают реквизиту адрес или HTML-текст. Это не замена браузеру: тяжёлые сайты и страницы с авторизацией через сторонние сервисы в нём часто работают плохо.
Внешние обработки
Обработка «Открыть сайт» с одной кнопкой собирается за пять минут: создайте внешнюю обработку
, добавьте форму, команду и клиентскую процедуру с ПерейтиПоНавигационнойСсылке. Её можно подключить в Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки и вызывать из нужного раздела без изменения конфигурации.
При открытии внешнего файла обработки через меню платформа может спросить подтверждение. Это защита от опасных действий, а не ошибка.
HTTP-сервисы
HTTP-сервис работает на стороне веб-сервера и сам браузер пользователя открыть не может. Его роль другая: он становится адресом, который вы открываете. Например, сервис формирует страницу с данными заказа, а форма в 1С открывает ссылку на этот сервис через ПерейтиПоНавигационнойСсылке.
Ошибки и безопасность при открытии ссылок из 1С
Что ломается чаще всего
| Симптом | Причина | Что сделать |
|---|---|---|
| Ничего не происходит | Код вызван на сервере | Перенесите вызов в &НаКлиенте |
| Открылась часть адреса | & в URL без кавычек при start | Возьмите адрес в кавычки |
| «Ошибка при вызове конструктора (COMОбъект)» | Веб-клиент, Linux или запрет COM политиками | Используйте ПерейтиПоНавигационнойСсылке |
| Вкладка не открылась в веб-клиенте | Блокировщик всплывающих окон | Открывайте сразу по нажатию, добавьте сайт в исключения |
| Открылось окно «Выберите приложение» | В Windows не назначен браузер по умолчанию | Назначьте его в параметрах Windows, раздел приложений по умолчанию |
| Кириллица в адресе превратилась в «кракозябры» | Параметр не закодирован | Кодируйте КодироватьСтроку |
Кодируйте параметры адреса
Пробелы, кириллица, &, # и ? внутри значения параметра ломают адрес. Кодируйте каждое значение отдельно:
ТекстПоиска = "счёт-фактура на аванс";
Адрес = "https://yandex.ru/search/?text="
+ КодироватьСтроку(ТекстПоиска, СпособКодированияСтроки.КодировкаURL);
ПерейтиПоНавигационнойСсылке(Адрес);
СпособКодированияСтроки.КодировкаURL кодирует всё, включая / и ?, поэтому применяйте его только к значению параметра, а не ко всей ссылке.
Не передавайте в командную строку чужие данные
Если адрес берётся из реквизита, который заполняет пользователь или приходит из обмена, его нельзя без проверки вставлять в cmd /c start или КомандаСистемы. Строка вида https://site.ru" & del ... превратится в выполнение посторонней команды на компьютере пользователя.
Правила простые:
- Для пользовательских адресов используйте
ПерейтиПоНавигационнойСсылке, а не командную строку. - Проверяйте схему адреса перед открытием.
- Не открывайте
file://и локальные пути из внешних данных.
&НаКлиенте
Функция ЭтоВнешняяСсылка(Адрес)
АдресНРег = НРег(СокрЛП(Адрес));
Возврат СтрНачинаетсяС(АдресНРег, "https://")
ИЛИ СтрНачинаетсяС(АдресНРег, "http://");
КонецФункции
В безопасном режиме, в котором часто работают дополнительные обработки на сервере, создание COM-объектов и запуск приложений запрещены. Это ещё одна причина держать открытие ссылки на клиенте и без COM.
Частые вопросы
Можно ли открыть ссылку в браузере, не являющемся браузером по умолчанию?
cmd /c start firefox "адрес" через ЗапуститьПриложение или Shell.Application.ShellExecute("firefox.exe", Адрес). ПерейтиПоНавигационнойСсылке всегда открывает браузер по умолчанию.Как открыть ссылку на документ 1С, а не на сайт?
ПерейтиПоНавигационнойСсылке, но с внутренней ссылкой вида e1cib/data/.... Её можно получить функцией ПолучитьНавигационнуюСсылку или скопировать из открытого документа. Такая ссылка открывает объект в текущем сеансе 1С, а не во внешнем браузере.Можно ли открыть ссылку из 1С и сразу передать в неё логин и пароль?
Как узнать, открыл ли пользователь ссылку?
Почему ссылка открывается в Internet Explorer или Edge, хотя установлен Chrome?
https назначено другое приложение. Платформа берёт тот браузер, который указан в системе. Поменяйте браузер по умолчанию в параметрах Windows.