При построении систем интеграции часто возникает задача не просто запустить 1С, а передать в уже открытое окно программы определенные данные. Стандартный механизм запуска через 1cestart.exe с использованием ключа /C отлично работает для инициализации нового сеанса, но оказывается бесполезным, если база уже открыта. В этом случае операционная система просто переключает фокус на активное окно, и ПараметрЗапуска внутри приложения не обновляется. Рассмотрим, как решить эту задачу с помощью параметра /URL и современных возможностей платформы 1С:Предприятие.
Проанализируем механизм работы платформы. Когда мы вызываем команду запуска 1С с ключом /C, данные попадают в глобальную переменную ПараметрЗапуска. Однако инициализация этого параметра происходит строго в момент старта сеанса (событие ПриНачалеРаботыСистемы). Если сеанс уже запущен, повторный вызов 1cestart.exe с тем же ключом не приведет к изменению значения ПараметрЗапуска в активном приложении. Система увидит, что процесс уже запущен, и просто проигнорирует новые данные командной строки.
Использование параметра /URL (навигационной ссылки) работает иначе. При его передаче платформа пытается выполнить "переход" внутри уже существующего окна. Именно эту особенность мы будем использовать для передачи наших данных.
Начиная с версии платформы 8.3.19, разработчики получили официальную возможность добавлять произвольные параметры в навигационные ссылки. Теперь ссылка может выглядеть так: e1cib/app/Обработка.МояОбработка?MyParam=12345. Выясним, как правильно обработать такую ссылку внутри конфигурации.
Для перехвата ссылки нам понадобится обработчик события ОбработкаПереходаПоНавигационнойСсылке, который располагается в Модуле управляемого приложения. Разберем реализацию по шагам:
Рассмотрим пример кода для обработки параметров:
Процедура ОбработкаПереходаПоНавигационнойСсылке(Ссылка, СтандартнаяОбработка)
// Проверим, содержит ли ссылка наш специфический параметр
Если Найти(Ссылка, "MyParam=") > 0 Тогда
// Отключаем стандартный механизм, чтобы 1С не выдала ошибку "Неверная ссылка"
СтандартнаяОбработка = Ложь;
// Извлекаем параметры из строки
ПозицияВопроса = Найти(Ссылка, "?");
СтрокаПараметров = Сред(Ссылка, ПозицияВопроса + 1);
МассивПараметров = СтрРазделить(СтрокаПараметров, "&");
Для Каждого ТекПараметр Из МассивПараметров Цикл
Части = СтрРазделить(ТекПараметр, "=");
Если Части.Количество() = 2 Тогда
Ключ = Части[0];
Значение = Части[1];
// Здесь мы можем вызвать нужную нам функцию или открыть форму
Если Ключ = "MyParam" Тогда
Сообщить("Получен параметр через URL: " + Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Важный момент: установка значения СтандартнаяОбработка = Ложь критически важна. Если этого не сделать, платформа попытается интерпретировать вашу ссылку с произвольными параметрами как стандартный путь к объекту метаданных, что приведет к ошибке "Неверно задана навигационная ссылка".
Если вы работаете на более ранних релизах, где произвольные параметры в /URL вызывают ошибку еще до попадания в код, придется использовать обходные пути. Рассмотрим наиболее надежный метод — использование Регистра Сведений как "почтового ящика".
Схема взаимодействия выглядит следующим образом:
1cestart.exe /URL "e1cib/data/РегистрСведений.ОбменДанными?Ключ=НашИдентификатор".ПриСозданииНаСервере) мы считываем данные, выполняем нужную обработку и программно закрываем форму.Посмотрим, как это выглядит в коде формы регистра:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Ключ.Пустая() Тогда
Возврат;
КонецЕсли;
// Получаем данные, которые были подготовлены заранее
ДанныеДляОбработки = РегистрыСведений.ОбменДанными.СоздатьМенеджерЗаписи();
ДанныеДляОбработки.Ключ = Параметры.Ключ.Ключ;
ДанныеДляОбработки.Прочитать();
Если ДанныеДляОбработки.Выбран() Тогда
// Выполняем полезное действие
ОбработатьПолученнуюИнформацию(ДанныеДляОбработки.ЗначениеПараметра);
// Удаляем запись, чтобы не засорять базу
ДанныеДляОбработки.Удалить();
КонецЕсли;
// Отменяем открытие формы, так как она нам была нужна только как транспорт
Отказ = Истина;
КонецПроцедуры
При проектировании системы обмена данными через навигационные ссылки следует помнить о ряде технических ограничений. Разберем их подробнее:
1. Длина командной строки. В операционных системах Windows существует ограничение на длину строки запуска. Если вы попытаетесь передать через URL огромный объем данных (например, большой JSON), ссылка может быть обрезана. В таких ситуациях правильно передавать только короткий идентификатор, по которому 1С сама заберет данные из внешнего источника.
2. Кодировка символов. Все спецсимволы, кириллица и пробелы в навигационной ссылке должны быть закодированы в формате URL-encode (например, пробел заменяется на %20). Платформа 1С может некорректно воспринять "сырые" данные в строке /URL.
3. Безопасность. Помните, что данные в навигационной ссылке видны в списке процессов ОС. Никогда не передавайте пароли или чувствительную информацию открытым текстом через параметры URL.
Выясним также вопрос с Веб-клиентом. Если ваша база опубликована на веб-сервере, вы можете добавлять параметры прямо в адресную строку браузера после символа &. В этом случае они будут доступны через свойство ПараметрЗапуска, но только при условии, что это предусмотрено в настройках файла публикации default.vrd. Однако для Тонкого и Толстого клиентов через 1cestart.exe этот механизм не является идентичным, и описанный выше метод с событием ОбработкаПереходаПоНавигационнойСсылке остается самым универсальным.
Таким образом, мы проанализировали способы передачи параметров в активный сеанс 1С. Для современных систем лучшим выбором будет использование расширенных навигационных ссылок версии 8.3.19+, а для поддержки старых систем — использование транзитных объектов метаданных или временных файлов.