Подставляем только собственные ASCII-метки в storage/{Storage}/{ID}. Путь остаётся строкой, запрос не отправляется.
Где и как запускать
Полный серверный модуль учебной копии КА2 Progress 2.5.20.75; без HTTP, публикации и печати.
Подготовка
Изолированная учебная копия КА2 Progress 2.5.20.75 из C:\claude\KA2\Progress\XML_CF_KA2_PROGRESS, платформа 8.5.1.1343. Создайте серверный общий модуль УчебныеМаршрутыИМакеты.
Вставьте полный модуль одного урока и вызовите УчебныеМаршрутыИМакеты.ВыполнитьПример() своей серверной учебной командой.
Источники: HTTPServices\ПередачаДанных.xml и ПередачаДанных\Ext\Module.bsl; Documents\РеализацияТоваровУслуг\Templates\ПФ_MXL_РеализацияТоваров.xml.
Метаданные только читаются. HTTP-запросы, публикация сервиса, загрузка/удаление файлов хранилища и печать документов не выполняются.
Формируемый путь с guide-owned-storage — учебная строка, не действующий адрес публикации. GET/POST обработчики могут выполнять прикладную работу и здесь не вызываются.
Макет печати получается в память без создания документа реализации и без заполнения его данными. Чтение размера макета не доказывает корректность настоящей печатной формы.
Процедура ВыполнитьПример() Экспорт
Сервис = Метаданные.HTTPСервисы.Найти("ПередачаДанных");
Если Сервис = Неопределено Тогда
ВызватьИсключение "Нет подтверждённого HTTP-сервиса ПередачаДанных";
КонецЕсли;
Шаблон = Сервис.ШаблоныURL.Найти("ХранилищеИИдентификатор");
Если Шаблон = Неопределено Тогда
ВызватьИсключение "Нет подтверждённого шаблона ХранилищеИИдентификатор";
КонецЕсли;
Сообщить(Шаблон.Имя = "ХранилищеИИдентификатор");
Сообщить(Шаблон.Шаблон = "/storage/{Storage}/{ID}");
Сообщить(Шаблон.Методы.Количество() = 2);
Путь = СтрЗаменить(Шаблон.Шаблон, "{Storage}", "guide-owned-storage");
Путь = СтрЗаменить(Путь, "{ID}", "00000000-0000-0000-0000-000000000001");
ОтносительныйURL = "/hs/" + Сервис.КорневойURL + Путь;
Сообщить(ОтносительныйURL = "/hs/dt/storage/guide-owned-storage/00000000-0000-0000-0000-000000000001");
Сообщить(ОтносительныйURL);
Сообщить(Шаблон.Синоним);
Сообщить(Шаблон.Комментарий);
Сообщить(Шаблон.ПолноеИмя());
Сообщить(Шаблон.Представление());
Сообщить(Шаблон.ПринадлежностьОбъекта);
Сообщить(ТипЗнч(Шаблон.ОбъектРасширяемойКонфигурации));
Сообщить(Шаблон.ЕстьИзмененияРасширениямиКонфигурации());
Сообщить(ТипЗнч(Шаблон.РасширениеКонфигурации()));
Сообщить(Шаблон.Родитель() = Сервис);
КонецПроцедурыРазбор по шагам
Найти шаблон внутри подтверждённого сервиса.
Проверить его исходную строку и два метода.
Заменить два именованных параметра собственными заранее заданными ASCII-значениями и добавить /hs/dt.
Вывести точный относительный путь. Родитель шаблона — сервис, не корень конфигурации.
Как проверить результат
Пять фиксированных проверок дают Истина.
Получается /hs/dt/storage/guide-owned-storage/00000000-0000-0000-0000-000000000001. Имени реальной публикации и сетевого вызова нет.
Ожидаемый результат
Конкретный пример разбора шаблона и формирования собственного относительного пути.
На что обратить внимание
Для внешних значений требуется корректное кодирование сегментов URL: этот образец использует только безопасные фиксированные ASCII-метки.
Не подставляйте произвольные /, ?, # в сегменты простой заменой.
Наличие шаблона не доказывает, что пользователь имеет доступ к хранилищу.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.