В разработке на платформе 1С:Предприятие 8.3 часто возникает задача: в форме списка одного справочника отобразить колонку с данными другого справочника и обеспечить переход к этому объекту при нажатии. По умолчанию двойной клик или нажатие Enter в динамическом списке открывает форму основного объекта строки. Разберем подробно, как изменить это поведение и научить систему открывать форму именно того объекта, на который нажал пользователь.
Самый распространенный способ решения задачи — перехват события Выбор у таблицы формы, которая отображает динамический список. Это событие срабатывает при двойном клике мышью или при нажатии клавиши Enter на клавиатуре.
Проанализируем алгоритм реализации этого метода:
Выбор на клиенте.Рассмотрим пример кода для этого события:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Проверяем, что пользователь нажал именно на нужную нам колонку
Если Поле.Имя = "Контрагент" Тогда
// Отменяем стандартное открытие основного объекта строки
СтандартнаяОбработка = Ложь;
// Получаем данные текущей строки
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Открываем форму связанного объекта
ПоказатьЗначение(, ТекущиеДанные.Контрагент);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом примере мы используем параметр СтандартнаяОбработка. Установка его в значение Ложь критически важна, так как она сообщает системе, что мы берем управление на себя и выполнять стандартное открытие основного справочника не нужно. Если этого не сделать, откроются сразу две формы: и основной объект, и связанный реквизит.
С точки зрения пользовательского опыта (UX), более удобным и современным решением является использование гиперссылок. В этом случае текст в колонке подсвечивается синим цветом, а переход осуществляется одиночным кликом. Рассмотрим, как это реализовать.
Выясним последовательность действий:
Гиперссылка в значение Истина.Нажатие для этого поля.Посмотрим на пример реализации кода:
&НаКлиенте
Процедура СписокКонтрагентНажатие(Элемент, СтандартнаяОбработка)
// Отменяем стандартное действие (если оно предусмотрено)
СтандартнаяОбработка = Ложь;
// Получаем текущую строку списка
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(ТекущиеДанные.Контрагент) Тогда
// Открываем форму объекта
ПоказатьЗначение(, ТекущиеДанные.Контрагент);
КонецЕсли;
КонецПроцедуры
Преимущество этого метода в том, что нам не нужно анализировать имя поля через Поле.Имя, так как обработчик привязан непосредственно к конкретной колонке. Это делает код более чистым и понятным.
Проанализируем ситуацию: какой метод открытия формы лучше использовать? Платформа предоставляет как минимум два основных способа.
Метод ПоказатьЗначение является универсальным. Он отлично подходит для большинства задач, так как автоматически определяет основную форму объекта и открывает ее. Более того, этот метод асинхронный и рекомендован для использования в веб-клиенте и на мобильной платформе, так как он не блокирует работу интерфейса.
Метод ОткрытьФорму следует использовать в более сложных сценариях. Например, если нам нужно:
ТолькоПросмотр = Истина).Пример использования метода ОткрытьФорму:
ПараметрыФормы = Новый Структура("Ключ", ТекущиеДанные.Контрагент);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
При реализации подобных механизмов нужно учитывать особенности работы динамических списков. Проверим несколько важных моментов:
Во-первых, убедимся, что реквизит, который мы хотим открыть, включен в запрос динамического списка. Если вы используете произвольный запрос, проверьте, что поле выбрано и его тип определен однозначно. Если поле в запросе является составным типом, 1С может не сразу понять, какую форму открывать, поэтому лучше типизировать его с помощью оператора ВЫРАЗИТЬ в тексте запроса.
Во-вторых, обратим внимание на производительность. Использование метода Элементы.Список.ТекущиеДанные — это самый быстрый способ получить значения полей текущей строки, так как эти данные уже кэшированы на стороне клиента. Не стоит делать дополнительные вызовы к серверу для получения ссылки, если она уже есть в колонках списка.
В-третьих, не забывайте про мобильный клиент. Если ваше решение будет использоваться на мобильных устройствах, использование модальных окон запрещено. Методы с префиксом Показать (такие как ПоказатьЗначение) идеально подходят для работы в мобильном приложении, обеспечивая корректную работу интерфейса.
Мы рассмотрели два основных подхода к открытию связанных форм из динамического списка. Использование события Выбор подходит для классического управления через двойной клик, в то время как свойство Гиперссылка вместе с событием Нажатие обеспечивает более современный интерфейс. В обоих случаях ключом к успеху является правильное использование СтандартнаяОбработка = Ложь и корректное извлечение данных из ТекущиеДанные.