При разработке внешних отчетов и обработок в режиме обычных форм часто возникает задача: отобразить результат запроса в табличном поле и предоставить пользователю возможность открывать формы документов или справочников простым двойным щелчком по соответствующей ячейке. Рассмотрим, как правильно реализовать универсальный механизм открытия любых ссылочных данных из таблицы значений.
Когда мы программно загружаем таблицу значений в элемент формы и вызываем генерацию колонок, платформа по умолчанию не всегда связывает ячейки со стандартными механизмами расшифровки:
Результат = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТЗ.Значение = Результат;
ЭлементыФормы.ТЗ.СоздатьКолонки();
Если в строке таблицы присутствует несколько разных ссылочных реквизитов (например, СсылкаЗаказ, Контрагент, Номенклатура), жесткая привязка к конкретному имени поля не позволит открывать другие объекты. Проанализируем, как решить эту задачу универсально с помощью событий элемента управления.
Разберем основной и самый гибкий способ реализации. Для элемента управления ТабличноеПоле, связанного с таблицей значений, необходимо назначить обработчик события Выбор.
Параметры обработчика содержат всю необходимую информацию о текущем клике:
КолонкаТабличногоПоля).Посмотрим на пример универсального кода, который динамически определяет колонку и открывает значение:
Процедура ТЗВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
// Получаем имя текущей колонки из метаданных элемента
ИмяКолонки = Колонка.Имя;
ЗначениеЯчейки = ВыбраннаяСтрока[ИмяКолонки];
// Проверяем заполненность значения
Если ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
// Проверяем, является ли значение ссылочным типом данных
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ЗначениеЯчейки))
Или Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(ЗначениеЯчейки)) Тогда
// Отключаем стандартный вход в режим редактирования
СтандартнаяОбработка = Ложь;
// Открываем форму объекта встроенным методом платформы
ОткрытьЗначение(ЗначениеЯчейки);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Разберем подробнее ключевые моменты этого кода:
ВыбраннаяСтрока[Колонка.Имя] или ВыбраннаяСтрока[Колонка.Данные] извлекает данные именно из той ячейки, по которой кликнул пользователь.СодержитТип предотвращает попытки открытия примитивных типов данных (чисел, дат, строк).СтандартнаяОбработка = Ложь обязательна, чтобы платформа не пыталась активизировать текстовое редактирование ячейки при двойном клике.ОткрытьЗначение() является универсальной: она автоматически находит и открывает основную форму для переданной ссылки (документа, элемента справочника, плана видов характеристик и др.).Если требуется открыть форму с определенными параметрами или использовать нестандартную форму объекта, можно применить вызов метода ПолучитьФорму() непосредственно у ссылки.
Посмотрим на пример реализации:
Процедура ТЗВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ЗначениеЯчейки = ВыбраннаяСтрока[Колонка.Имя];
Если ЗначениеЗаполнено(ЗначениеЯчейки) И Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(ЗначениеЯчейки)) Тогда
СтандартнаяОбработка = Ложь;
// Получаем и открываем основную форму документа
ФормаДокумента = ЗначениеЯчейки.ПолучитьФорму();
Если ФормаДокумента <> Неопределено Тогда
ФормаДокумента.Открыть();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот способ удобен, когда перед открытием формы необходимо программно передать в нее владельца, настроить уникальность формы через КлючУникальности или заполнить дополнительные реквизиты.
Если в таблице значений колонки имеют строго определенные типы (например, заданные при формировании колонок запросом), можно использовать штатные средства элементов управления:
ТолькоПросмотр = Истина. В этом случае двойной щелчок по ячейке со ссылочным типом будет автоматически инициировать открытие формы объекта.СоздатьКолонки() можно программно включить отображение кнопки открытия:
// Настройка свойств конкретной колонки после создания
КолонкаЗаказ = ЭлементыФормы.ТЗ.Колонки.Найти("СсылкаЗаказ");
Если КолонкаЗаказ <> Неопределено Тогда
КолонкаЗаказ.ЭлементУправления.КнопкаОткрытия = Истина;
КолонкаЗаказ.РежимРедактирования = РежимРедактированияКолонки.НеРедактировать;
КонецЕсли;
При такой настройке в ячейке появится стандартная кнопка с лупой или станет доступно открытие формы по клавише F4.
ЭлементыФормы.ТЗ.СоздатьКолонки() полностью пересоздает коллекцию колонок элемента формы и сбрасывает все ранее заданные настройки отображения. Любые манипуляции со свойствами колонок выполняйте строго после этого вызова.ОткрытьЗначение() вызовет системное исключение. При необходимости защищайте вызов конструкцией Попытка ... Исключение или проверяйте права функцией ПравоДоступа("Просмотр", Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеЯчейки))).