В процессе интеграции с внешними системами, загрузки данных через веб-сервисы, анализа журнала регистрации или истории версий часто возникает задача: в отчет поступает строковое значение навигационной ссылки вида e1cib/data/Справочник.Номенклатура?ref=..., и требуется сделать так, чтобы пользователь мог интерактивно открыть этот объект из отчета СКД или получить полноценную ссылку типа СправочникСсылка или ДокументСсылка.
Разберем по шагам доступные способы реализации: от простого интерактивного перехода без модификации данных до полного восстановления ссылочного типа в схеме компоновки данных.
Если конечная цель заключается исключительно в том, чтобы предоставить пользователю возможность открыть карточку объекта по клику на ячейку отчета, преобразовывать строку в настоящий объект базы данных не требуется. Платформа 1С содержит встроенный клиентский метод, который принимает строковый URL напрямую.
Рассмотрим порядок действий для настройки формы отчета:
ОбработкаРасшифровки.Посмотрим на пример программного кода обработчика:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если ТипЗнч(Расшифровка) = Тип("Строка") И Найти(Расшифровка, "e1cib/") > 0 Тогда
СтандартнаяОбработка = Ложь;
ПерейтиПоНавигационнойСсылке(Расшифровка);
КонецЕсли;
КонецПроцедуры
Проанализируем этот код: параметр СтандартнаяОбработка = Ложь отключает стандартное контекстное меню расшифровки СКД, а метод ПерейтиПоНавигационнойСсылке сразу выполняет открытие формы объекта. Также в конфигурациях на базе БСП можно использовать вызов ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(Расшифровка).
Важная деталь: если отчет формируется в конфигурации, где табличный документ доступен для редактирования, одинарный клик переведет ячейку в режим редактирования. Чтобы ячейка работала как привычная веб-ссылка по одинарному нажатию, результирующему табличному документу необходимо установить свойство ТолькоПросмотр = Истина.
Чтобы визуально показать пользователю, что текст в ячейке является кликабельной ссылкой, настроим пользовательский макет поля непосредственно в схеме компоновки данных.
Гиперссылка в значение Истина.ОбработкаРасшифровки, показанный в Варианте 1.Иногда требуется не просто открыть форму объекта, а получить полноценное ссылочное поле в СКД (например, чтобы обращаться через точку к его реквизитам или задействовать стандартные отборы и группировки). В этом случае навигационную ссылку необходимо преобразовать в УникальныйИдентификатор и вызвать метод получения ссылки менеджера объекта.
Выясним причину сложности прямого парсинга: шестнадцатеричный идентификатор (hex) в параметре ref= не совпадает с последовательностью символов стандартного GUID. В платформе 1С группы байтов переставлены.
Разберем пример функции общего модуля, которая выполняет корректную перестановку байтов и собирает типизированную ссылку из строки:
Функция ПолучитьСсылкуИзНавигационнойСтроки(Знач НавигационнаяСсылка) Экспорт
// Пример ссылки: "e1cib/data/Справочник.Номенклатура?ref=96efac120374ce0c11f05348c3819d09"
ПозицияRef = Найти(НавигационнаяСсылка, "?ref=");
Если ПозицияRef = 0 Тогда
Возврат Неопределено;
КонецЕсли;
HexRef = Сред(НавигационнаяСсылка, ПозицияRef + 5);
Если СтрДлина(HexRef) <> 32 Тогда
Возврат Неопределено;
КонецЕсли;
// Перестановка групп под стандартное представление UUID
СтрокаGUID = Сред(HexRef, 25, 8) + "-" +
Сред(HexRef, 21, 4) + "-" +
Сред(HexRef, 17, 4) + "-" +
Сред(HexRef, 1, 4) + "-" +
Сред(HexRef, 5, 12);
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
// Получение имени объекта метаданных
ЧастьДоRef = Лев(НавигационнаяСсылка, ПозицияRef - 1);
ИмяМетаданных = СтрЗаменить(ЧастьДоRef, "e1cib/data/", ""); // "Справочник.Номенклатура"
МассивИмен = СтрРазделить(ИмяМетаданных, ".");
Если МассивИмен.Количество() <> 2 Тогда
Возврат Неопределено;
КонецЕсли;
ТипОбъекта = ВРег(МассивИмен[0]);
ИмяОбъекта = МассивИмен[1];
Если ТипОбъекта = "СПРАВОЧНИК" Тогда
Возврат Справочники[ИмяОбъекта].ПолучитьСсылку(Идентификатор);
ИначеЕсли ТипОбъекта = "ДОКУМЕНТ" Тогда
Возврат Документы[ИмяОбъекта].ПолучитьСсылку(Идентификатор);
КонецЕсли;
Возврат Неопределено;
КонецФункции
Рассмотрим, как подключить эту функцию к схеме компоновки:
ОбъектСсылка).ИмяОбщегоМодуля.ПолучитьСсылкуИзНавигационнойСтроки(ИсходноеСтроковоеПоле).Ограничение по производительности: вызов функций общего модуля в вычисляемых полях СКД выполняется построчно. На больших объемах данных (десятки тысяч строк) это может вызывать заметные задержки. Если строк много, рекомендуется выполнять парсинг ссылок пакетом на сервере перед компоновкой данных или передавать в СКД предварительно подготовленные таблицы.