При разработке интеграций между 1С и веб-сервисами (например, при работе с Яндекс.Картами в поле HTML-документа) часто возникает необходимость протестировать поведение скриптов вне среды 1С. Мы привыкли, что в конфигураторе 1С взаимодействие происходит через специализированные методы, но в обычном браузере механизмы вызова функций имеют свои особенности. В этой статье мы подробно разберем, как имитировать программное обращение к странице, используя только адресную строку браузера.
Для того чтобы заставить браузер выполнить код на уже открытой странице, используется псевдо-протокол javascript:. В отличие от стандартных http:// или https://, этот протокол не загружает новую страницу, а исполняет инструкции в контексте текущего DOM-дерева. Рассмотрим базовый синтаксис:
Если на вашей странице определена функция:
function fun1() {
alert("Функция вызвана!");
}
То для её запуска из адресной строки достаточно ввести:
javascript:fun1();
Важное замечание по безопасности: Современные браузеры (Chrome, Firefox, Edge) блокируют прямую вставку текста, начинающегося с javascript:, из буфера обмена. Если вы скопируете эту строку и вставите её в адресную строку, префикс javascript: будет автоматически удален. Чтобы команда сработала, вам необходимо либо вписать префикс вручную, либо создать «букмарклет» (закладку с кодом).
Разберем ситуацию, когда функция требует передачи данных, как это часто бывает при работе с координатами карт или строковыми данными. Рассмотрим пример функции, принимающей числовой параметр:
function fun1(val) {
console.log("Получено значение: " + val);
return val;
}
Для передачи строкового или числового параметра из адресной строки мы используем стандартный синтаксис вызова функций JavaScript. Проанализируем пример из обсуждения:
javascript:fun1("3.14");
Если параметров несколько, они перечисляются через запятую, как в обычном коде:
javascript:myFunction("Параметр 1", 2023, true);
При передаче строк с пробелами или специальными символами рекомендуем использовать функцию encodeURIComponent(), чтобы избежать проблем с интерпретацией URL браузером. Однако в большинстве случаев простые кавычки отрабатывают корректно.
Одной из проблем при вызове функций из адресной строки является то, что браузер может попытаться заменить содержимое текущей страницы результатом выполнения функции. Если ваша функция возвращает значение (например, строку или число), страница может «исчезнуть», и вы увидите только этот результат на белом фоне.
Чтобы этого избежать, мы используем конструкцию void(0). Оператор void вычисляет выражение и возвращает undefined, что сообщает браузеру: «не нужно ничего менять на странице». Рассмотрим правильный шаблон вызова:
javascript:fun1("3.14"); void(0);
Стандартное поведение адресной строки браузера — это выполнение GET-запроса при нажатии Enter. Напрямую отправить POST-данные через http://... в строке ввода невозможно. Однако, используя ту же инъекцию JavaScript, мы можем заставить браузер инициировать POST-запрос «от имени» текущей страницы.
Разберем современный способ с использованием Fetch API. Допустим, вам нужно отправить данные на сервер по адресу /api/data:
javascript:fetch('/api/data', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({id: 1, value: "test"})
}).then(res => res.text()).then(console.log); void(0);
Этот код создаст полноценный POST-запрос, не покидая текущую страницу. Это крайне полезно для отладки веб-серверов, которые должны принимать данные от 1С через веб-хуки или API.
Проанализируем, как эти знания применимы в разработке на платформе 1С. Когда мы используем ПолеHTMLДокумента, у нас есть два направления связи:
ВыполнитьJavaScript(). Он работает аналогично вводу кода в адресную строку, но делает это программно и безопасно.
&НаКлиенте
Процедура ВызватьСкрипт()
Параметр = "55.75, 37.61"; // Координаты Москвы
Элементы.КартаHTML.ВыполнитьJavaScript("setCenter(" + Параметр + ");");
КонецПроцедуры
window.location.href. Вы можете задать специфический протокол, который 1С перехватит в событии ПриНажатии (в обычных формах) или через ожидание изменения URL.
// В коде JS на странице
window.location.href = "v8://result_data=" + JSON.stringify(data);
Если вам нужно управлять состоянием страницы извне, но использование javascript: кажется неудобным из-за ограничений безопасности браузеров, рассмотрим метод URL Anchor (Hash). Вы можете обращаться к странице, меняя её адрес следующим образом:
http://localhost:3000/#action:update;value:100
На самой странице необходимо настроить «слушатель» событий изменения хэша. Это более «чистый» способ передачи команд со стороны 1С или внешней системы:
window.onhashchange = function() {
let hash = window.location.hash.substring(1);
console.log("Команда из URL: " + hash);
// Здесь логика парсинга и вызова функций
};
Выясним причину, по которой опытные разработчики редко используют адресную строку для таких задач. В любом современном браузере есть Инструменты разработчика (клавиша F12 или Ctrl+Shift+I). Вкладка Console предоставляет гораздо больше возможностей:
Подводя итог, можно сказать, что обращение к JS-функциям через адресную строку — это рабочий, но специфический инструмент отладки. Основное правило: используйте префикс javascript:, не забывайте про void(0) для сохранения контекста страницы и всегда учитывайте ограничения безопасности современных браузеров при вводе таких команд вручную.