Как в СКД открыть объект по строковой навигационной ссылке или преобразовать ее в ссылку?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе интеграции с внешними системами, загрузки данных через веб-сервисы, анализа журнала регистрации или истории версий часто возникает задача: в отчет поступает строковое значение навигационной ссылки вида e1cib/data/Справочник.Номенклатура?ref=..., и требуется сделать так, чтобы пользователь мог интерактивно открыть этот объект из отчета СКД или получить полноценную ссылку типа СправочникСсылка или ДокументСсылка.

Разберем по шагам доступные способы реализации: от простого интерактивного перехода без модификации данных до полного восстановления ссылочного типа в схеме компоновки данных.

Вариант 1. Перехват события расшифровки в форме отчета

Если конечная цель заключается исключительно в том, чтобы предоставить пользователю возможность открыть карточку объекта по клику на ячейку отчета, преобразовывать строку в настоящий объект базы данных не требуется. Платформа 1С содержит встроенный клиентский метод, который принимает строковый URL напрямую.

Рассмотрим порядок действий для настройки формы отчета:

  1. В схеме компоновки данных выводим поле с навигационной ссылкой в отчет или передаем его в параметр расшифровки нужного поля представления.
  2. Создаем управляемую форму отчета (если отчет использует стандартную форму, создаем свою и назначаем ее основной).
  3. Находим на форме элемент табличного документа (поле отчета) и создаем для него обработчик события ОбработкаРасшифровки.

Посмотрим на пример программного кода обработчика:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    Если ТипЗнч(Расшифровка) = Тип("Строка") И Найти(Расшифровка, "e1cib/") > 0 Тогда
        СтандартнаяОбработка = Ложь;
        ПерейтиПоНавигационнойСсылке(Расшифровка);
    КонецЕсли;
    
КонецПроцедуры

Проанализируем этот код: параметр СтандартнаяОбработка = Ложь отключает стандартное контекстное меню расшифровки СКД, а метод ПерейтиПоНавигационнойСсылке сразу выполняет открытие формы объекта. Также в конфигурациях на базе БСП можно использовать вызов ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(Расшифровка).

Важная деталь: если отчет формируется в конфигурации, где табличный документ доступен для редактирования, одинарный клик переведет ячейку в режим редактирования. Чтобы ячейка работала как привычная веб-ссылка по одинарному нажатию, результирующему табличному документу необходимо установить свойство ТолькоПросмотр = Истина.

Вариант 2. Оформление ячейки в виде гиперссылки через макет поля СКД

Чтобы визуально показать пользователю, что текст в ячейке является кликабельной ссылкой, настроим пользовательский макет поля непосредственно в схеме компоновки данных.

  1. Переходим на вкладку Макеты в схеме компоновки данных.
  2. Добавляем Макет поля, выбираем группировку и требуемое поле.
  3. В свойствах ячейки макета устанавливаем флаг Гиперссылка в значение Истина.
  4. В параметрах макета для ячейки указываем:
    1. Текст — связываем с параметром выражения (например, строковое наименование или сама ссылка).
    2. Параметр расшифровки — связываем с исходным полем, содержащим навигационную ссылку.
  5. В модуле формы отчета оставляем обработчик ОбработкаРасшифровки, показанный в Варианте 1.

Вариант 3. Восстановление ссылочного типа данных через вычисляемое поле

Иногда требуется не просто открыть форму объекта, а получить полноценное ссылочное поле в СКД (например, чтобы обращаться через точку к его реквизитам или задействовать стандартные отборы и группировки). В этом случае навигационную ссылку необходимо преобразовать в УникальныйИдентификатор и вызвать метод получения ссылки менеджера объекта.

Выясним причину сложности прямого парсинга: шестнадцатеричный идентификатор (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];
    
    Если ТипОбъекта = "СПРАВОЧНИК" Тогда
        Возврат Справочники[ИмяОбъекта].ПолучитьСсылку(Идентификатор);
    ИначеЕсли ТипОбъекта = "ДОКУМЕНТ" Тогда
        Возврат Документы[ИмяОбъекта].ПолучитьСсылку(Идентификатор);
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции

Рассмотрим, как подключить эту функцию к схеме компоновки:

  1. Помещаем функцию в общий модуль с признаками Сервер и Вызов сервера.
  2. В СКД на вкладке Вычисляемые поля добавляем новое поле (например, ОбъектСсылка).
  3. В колонке Выражение указываем: ИмяОбщегоМодуля.ПолучитьСсылкуИзНавигационнойСтроки(ИсходноеСтроковоеПоле).

Ограничение по производительности: вызов функций общего модуля в вычисляемых полях СКД выполняется построчно. На больших объемах данных (десятки тысяч строк) это может вызывать заметные задержки. Если строк много, рекомендуется выполнять парсинг ссылок пакетом на сервере перед компоновкой данных или передавать в СКД предварительно подготовленные таблицы.

← На главную