В процессе разработки конфигураций на платформе 1С:Предприятие часто возникает задача создать удобную навигацию для пользователя. Одной из таких задач является программное формирование гиперссылки, которая открывала бы список записей регистра сведений, отфильтрованный по конкретному значению (например, по владельцу или объекту). Рассмотрим, как это реализовать, проанализируем стандартные механизмы платформы и разберем наиболее эффективные способы решения.
Когда мы работаем в управляемом приложении, платформа автоматически формирует раздел Перейти в панели навигации формы, если у регистра сведений есть ведущее измерение. Однако программно "вытащить" именно эту команду в виде строки для использования, например, в объекте ФорматированнаяСтрока, напрямую нельзя. Нам необходимо либо воспользоваться встроенными методами генерации ссылок, либо собрать строку e1cib вручную.
Разберем типичную ошибку, которую часто допускают разработчики. Попытка получить ссылку через РегистрСведенийКлючЗаписи, как показано в одном из примеров:
КлючЗаписи = Новый ("РегистрСведенийКлючЗаписи.МойРегистр", Новый Структура("Организация", Объект.Ссылка));
НС = ПолучитьНавигационнуюСсылку(КлючЗаписи);
Проанализируем ситуацию: данный метод не сработает для получения ссылки на список. Объект РегистрСведенийКлючЗаписи предназначен для идентификации конкретной записи регистра. Если в ключе указаны не все измерения, платформа не сможет сформировать корректную ссылку на объект, а если указаны все — ссылка откроет форму записи, а не список с отбором. Нам же требуется именно форма списка.
Платформа 1С предоставляет мощный инструмент для генерации ссылок на списки с заданными настройками. Этот метод доступен только на сервере. Рассмотрим по шагам, как сформировать такую ссылку.
Для этого используется метод ПолучитьНавигационнуюСсылку(), в который передаются настройки компоновки данных. Рассмотрим пример кода:
&НаСервере
Функция ПолучитьСсылкуНаСписокСОтбором(ЗначениеОтбора)
// 1. Указываем объект метаданных, для которого нужна ссылка
МетаданныеРегистра = Метаданные.РегистрыСведений.МойРегистрСведений;
// 2. Создаем настройки таблицы динамического списка
НастройкиТаблицы = Новый НастройкиТаблицыДинамическогоСписка;
// 3. Формируем отбор через компоновщик настроек
ЭлементОтбора = НастройкиТаблицы.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация"); // Имя измерения
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;
ЭлементОтбора.Использование = Истина;
// 4. Получаем навигационную ссылку
// Параметр "Представление" важен для корректной сериализации
Результат = ПолучитьНавигационнуюСсылку(МетаданныеРегистра, НастройкиТаблицы, "Список с отбором");
Возврат Результат;
КонецФункции
Важный нюанс: такие ссылки могут быть достаточно длинными, так как они содержат в себе сериализованные настройки фильтра. Однако это самый "правильный" с точки зрения платформы способ, так как он гарантирует, что при переходе по ссылке пользователь увидит именно тот результат, который ожидал разработчик. Для более глубокого освоения работы со списками пригодится публикация о возможностях системы настроек динамических списков.
Иногда нам не нужно использовать тяжеловесные объекты настроек, и мы хотим получить лаконичную ссылку. Внутренний протокол 1С (e1cib) позволяет передавать параметры отбора прямо в строке URL. Хотя этот метод менее документирован, он широко используется.
Структура такой ссылки выглядит следующим образом: e1cib/list/ИмяОбъекта?Отбор.ИмяПоля=Значение.
Выясним причину, по которой просто подставить ссылку в строку нельзя. Для корректной работы ссылки в формате e1cib значение ссылки должно быть представлено в виде уникального идентификатора (GUID). Посмотрим на пример формирования такой строки:
&НаКлиенте
Функция СформироватьСсылкуВручную(ОбъектСсылка)
ИмяРегистра = "РегистрСведений.ДополнительныеСведения";
ИмяПоляОтбора = "Объект";
// Получаем строковое представление GUID
Идентификатор = Строка(ОбъектСсылка.УникальныйИдентификатор());
// Собираем строку
ТекстСсылки = "e1cib/list/" + ИмяРегистра + "?" + "Отбор." + ИмяПоляОтбора + "=" + Идентификатор;
Возврат ТекстСсылки;
КонецФункции
Этот способ отлично подходит для вставки в ФорматированнаяСтрока. Когда пользователь нажмет на такую ссылку в интерфейсе, платформа автоматически распознает команду e1cib/list, откроет форму списка указанного регистра и применит фильтр по указанному полю. Для быстрого получения и проверки идентификаторов объектов в формах пригодится инструмент для отображения GUID объектов.
Если вы не уверены, как именно должна выглядеть ссылка для сложного случая, проанализируем ситуацию с помощью самой платформы. Выполним следующие действия:
Скопировав эту ссылку, вы сможете понять, какую структуру использует платформа в данный момент. Часто там можно увидеть идентификаторы настроек, которые сохраняются в системных таблицах. Это поможет вам при отладке программного формирования ссылок.
После того как мы получили навигационную ссылку (любым из вышеперечисленных способов), нам нужно вывести её пользователю. Рассмотрим пример создания форматированной строки с гиперссылкой:
&НаСервере
Процедура СоздатьГиперссылкуНаСервере()
СсылкаНаСписок = ПолучитьСсылкуНаСписокСОтбором(Объект.Контрагент);
// Создаем элементы форматированной строки
МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить("Для просмотра истории перейдите в ");
// Добавляем гиперссылку
МассивЭлементов.Добавить(Новый ФорматированнаяСтрока("список записей регистра", , , , СсылкаНаСписок));
// Помещаем результат в реквизит формы с типом ФорматированнаяСтрока
ТекстИнформации = Новый ФорматированнаяСтрока(МассивЭлементов);
КонецПроцедуры
Мы рассмотрели три подхода к получению навигационных ссылок. Первый способ (через НастройкиТаблицыДинамическогоСписка) является наиболее надежным и универсальным, так как он поддерживается платформой на уровне метаданных. Второй способ (ручная сборка e1cib) выигрывает в краткости и удобстве формирования на стороне клиента, но требует внимательности при передаче параметров. Третий способ незаменим при исследовании того, как платформа строит ссылки для сложных системных команд.
Выбирайте метод в зависимости от ваших задач: для сложных отборов используйте настройки компоновки, а для простых переходов по ссылке — прямое формирование URL.