При разработке интерфейсов в 1С часто возникает задача вывести список связанных документов не в виде стандартной таблицы, а компактно — в одну строку, где каждый номер документа будет являться активной гиперссылкой. Это особенно актуально для информационных панелей, подвалов форм или реестров. Разберем подробно несколько способов реализации этой задачи: от динамического создания элементов формы до использования современного объекта ФорматированнаяСтрока.
Этот метод считается наиболее эффективным и правильным для управляемых форм. Вместо того чтобы загромождать форму десятками отдельных элементов, мы создаем одну декорацию (надпись), содержимое которой формируется программно. Рассмотрим, как это реализовать.
Для начала проанализируем ситуацию: у нас есть массив ссылок на документы, которые нужно вывести. Нам необходимо обойти их в цикле, создать для каждой текстовое представление и упаковать в специальный объект ФорматированнаяСтрока. Выясним, как выглядит программный код для такой задачи:
&НаСервере
Процедура ВывестиСсылкиНаФорму()
// Допустим, у нас есть массив ссылок МассивДокументов
МассивЭлементовСтроки = Новый Массив;
Для Каждого ДокСсылка Из МассивДокументов Цикл
// Если это не первая ссылка, добавим запятую как обычный текст
Если МассивЭлементовСтроки.Количество() > 0 Тогда
МассивЭлементовСтроки.Добавить(", ");
КонецЕсли;
// Создаем гиперссылку для конкретного документа
ТекстСсылки = Строка(ДокСсылка);
НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(ДокСсылка);
// Добавляем объект Гиперссылка в массив элементов
МассивЭлементовСтроки.Добавить(Новый Гиперссылка(ТекстСсылки, НавигационнаяСсылка));
КонецЦикла;
// Формируем итоговую форматированную строку
ЭтаФорма.Элементы.ДекорацияСсылки.Заголовок = Новый ФорматированнаяСтрока(МассивЭлементовСтроки);
КонецПроцедуры
Рассмотрим важные нюансы этого метода. Объект Гиперссылка внутри форматированной строки принимает два параметра: отображаемый текст и навигационную ссылку. Функция ПолучитьНавигационнуюСсылку преобразует ссылку на объект базы данных во внутренний формат 1С (вида e1cib/data/...). Это позволяет платформе автоматически понимать, какой объект открывать при нажатии. Для изучения работы с такими объектами подойдёт материал по форматированному документу и форматированной строке.
Чтобы переход по ссылке сработал, нам нужно настроить обработку события у элемента декорации. Разберем по шагам:
ОбработкаНавигационнойСсылки.Проанализируем код обработчика нажатия:
&НаКлиенте
Процедура ДекорацияСсылкиОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
// Отменяем стандартное поведение, если хотим добавить свою логику
// Или оставляем СтандартнаяОбработка = Истина, чтобы платформа сама открыла объект
СтандартнаяОбработка = Ложь;
ПерейтиПоНавигационнойСсылке(НавигационнаяСсылка);
КонецПроцедуры
Если по каким-то причинам использование форматированной строки невозможно (например, требуется сложная настройка прав или специфическое поведение каждого элемента), мы можем пойти путем программного создания множества элементов типа ДекорацияФормы. Этот метод обсуждался пользователями на форуме как основной вариант решения. Для практического изучения такого подхода подойдёт пример динамического добавления и удаления элементов формы.
Для реализации этого подхода нам понадобится контейнер на форме — Группа с горизонтальной группировкой. Рассмотрим, как программно заполнить такую группу ссылками:
&НаСервере
Процедура СоздатьГиперссылкиПрограммно()
// Удалим старые элементы, если они были созданы ранее
Для Каждого ЭлементДляУдаления Из ЭтаФорма.Элементы.ГруппаДляСсылок.ПодчиненныеЭлементы Цикл
// Здесь должна быть логика очистки, если группа динамическая
КонецЦикла;
Счетчик = 0;
Для Каждого Стр Из ТЗ_Документы Цикл
Счетчик = Счетчик + 1;
ИмяЭлемента = "Гиперссылка_" + Счетчик;
// Добавляем новую декорацию в группу
НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяЭлемента, Тип("ДекорацияФормы"), ЭтаФорма.Элементы.ГруппаДляСсылок);
НовыйЭлемент.Вид = ВидДекорацииФормы.Надпись;
НовыйЭлемент.Гиперссылка = Истина;
НовыйЭлемент.Заголовок = Строка(Стр.ДокументСсылка);
// Устанавливаем действие при нажатии
НовыйЭлемент.УстановитьДействие("Нажатие", "Подключаемый_ОбработкаНажатияНаСсылку");
// Если это не последний элемент, добавим текстовую декорацию с запятой
Если Счетчик < ТЗ_Документы.Количество() Тогда
Запятая = ЭтаФорма.Элементы.Добавить("Разделитель_" + Счетчик, Тип("ДекорацияФормы"), ЭтаФорма.Элементы.ГруппаДляСсылок);
Запятая.Заголовок = ", ";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Разберем ситуацию с обработкой нажатия. Поскольку элементы создаются динамически, нам нужен единый обработчик на клиенте. В этом обработчике мы будем определять, на какой именно элемент нажал пользователь. Посмотрим на пример кода:
&НаКлиенте
Процедура Подключаемый_ОбработкаНажатияНаСсылку(Элемент)
// Здесь нам нужно как-то понять, какую ссылку открывать.
// Можно хранить соответствие ИмяЭлемента -> Ссылка в переменной формы или реквизите.
ПараметрыОткрытия = Новый Структура("Ключ", ПолучитьСсылкуПоИмениЭлемента(Элемент.Имя));
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыОткрытия);
КонецПроцедуры
Проанализируем еще один мощный инструмент — ПолеHTMLДокумента. Этот способ позволяет вывести ссылки с использованием стандартной HTML-верстки. Это дает максимальную гибкость: мы можем менять цвет каждой ссылки, добавлять всплывающие подсказки или даже иконки рядом с номерами документов.
Выясним, как сформировать строку для HTML-поля:
&НаСервере
Функция СформироватьHTMLСсылок(МассивДокументов)
ТекстHTML = "<html><body style='font-family: Arial; font-size: 10pt;'>";
Для Каждого Док Из МассивДокументов Цикл
СсылкаНаОбъект = ПолучитьНавигационнуюСсылку(Док);
ТекстHTML = ТекстHTML + "<a href='" + СсылкаНаОбъект + "'>" + Строка(Док) + "</a>, ";
КонецЦикла;
// Убираем лишнюю запятую в конце и закрываем теги
ТекстHTML = Лев(ТекстHTML, СтрДлина(ТекстHTML) - 2) + "</body></html>";
Возврат ТекстHTML;
КонецФункции
Важный момент: при использовании HTML-поля в управляемых формах 1С умеет самостоятельно перехватывать переходы по навигационным ссылкам. Если атрибут href содержит валидную внутреннюю ссылку 1С, то при клике система автоматически откроет нужный документ без написания дополнительного кода в обработчиках событий.
Рассмотрим подробнее, какой метод выбрать в зависимости от ваших задач:
Выясним типичную причину, почему программно созданные элементы могут быть не видны на форме. Как отмечали пользователи форума, часто программисты забывают настроить свойства размещения. Если вы создаете элементы в цикле, обязательно проверьте свойство Видимость и убедитесь, что родительский элемент (Группа) имеет достаточную высоту и ширину для отображения содержимого.
Также стоит помнить о производительности. Проанализируем ситуацию: если документов в списке более 50, программное создание 100 декораций (50 ссылок и 50 разделителей-запятых) может привести к заметной задержке при открытии формы. В таких случаях ФорматированнаяСтрока будет работать в десятки раз быстрее, так как она обрабатывается платформой как единый текстовый блок.
Используя приведенные выше инструкции, вы сможете реализовать удобный и современный интерфейс для работы со списками документов в ваших конфигурациях.