Как открыть документ или справочник по ссылке из таблицы значений в обычных формах 1С

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

При разработке внешних отчетов и обработок в режиме обычных форм часто возникает задача: отобразить результат запроса в табличном поле и предоставить пользователю возможность открывать формы документов или справочников простым двойным щелчком по соответствующей ячейке. Рассмотрим, как правильно реализовать универсальный механизм открытия любых ссылочных данных из таблицы значений.

Причина возникновения сложности

Когда мы программно загружаем таблицу значений в элемент формы и вызываем генерацию колонок, платформа по умолчанию не всегда связывает ячейки со стандартными механизмами расшифровки:


Результат = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТЗ.Значение = Результат;
ЭлементыФормы.ТЗ.СоздатьКолонки();

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

Решение 1. Использование события «Выбор» и процедуры «ОткрытьЗначение»

Разберем основной и самый гибкий способ реализации. Для элемента управления ТабличноеПоле, связанного с таблицей значений, необходимо назначить обработчик события Выбор.

Параметры обработчика содержат всю необходимую информацию о текущем клике:

  1. Элемент — сам элемент управления формы (табличное поле).
  2. ВыбраннаяСтрока — строка таблицы значений, по которой произведен клик.
  3. Колонка — объект колонки табличного поля (КолонкаТабличногоПоля).
  4. СтандартнаяОбработка — булев флаг, управляющий штатным поведением платформы при выборе.

Посмотрим на пример универсального кода, который динамически определяет колонку и открывает значение:


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

Разберем подробнее ключевые моменты этого кода:

  1. Обращение через ВыбраннаяСтрока[Колонка.Имя] или ВыбраннаяСтрока[Колонка.Данные] извлекает данные именно из той ячейки, по которой кликнул пользователь.
  2. Проверка типов через СодержитТип предотвращает попытки открытия примитивных типов данных (чисел, дат, строк).
  3. Установка СтандартнаяОбработка = Ложь обязательна, чтобы платформа не пыталась активизировать текстовое редактирование ячейки при двойном клике.
  4. Процедура ОткрытьЗначение() является универсальной: она автоматически находит и открывает основную форму для переданной ссылки (документа, элемента справочника, плана видов характеристик и др.).

Решение 2. Открытие формы через метод ссылки «ПолучитьФорму»

Если требуется открыть форму с определенными параметрами или использовать нестандартную форму объекта, можно применить вызов метода ПолучитьФорму() непосредственно у ссылки.

Посмотрим на пример реализации:


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

Этот способ удобен, когда перед открытием формы необходимо программно передать в нее владельца, настроить уникальность формы через КлючУникальности или заполнить дополнительные реквизиты.

Решение 3. Настройка колонок табличного поля без написания кода в событии

Если в таблице значений колонки имеют строго определенные типы (например, заданные при формировании колонок запросом), можно использовать штатные средства элементов управления:

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

// Настройка свойств конкретной колонки после создания
КолонкаЗаказ = ЭлементыФормы.ТЗ.Колонки.Найти("СсылкаЗаказ");
Если КолонкаЗаказ <> Неопределено Тогда
    КолонкаЗаказ.ЭлементУправления.КнопкаОткрытия = Истина;
    КолонкаЗаказ.РежимРедактирования = РежимРедактированияКолонки.НеРедактировать;
КонецЕсли;

При такой настройке в ячейке появится стандартная кнопка с лупой или станет доступно открытие формы по клавише F4.

Важные замечания

  1. Метод ЭлементыФормы.ТЗ.СоздатьКолонки() полностью пересоздает коллекцию колонок элемента формы и сбрасывает все ранее заданные настройки отображения. Любые манипуляции со свойствами колонок выполняйте строго после этого вызова.
  2. Если у текущего пользователя базы данных отсутствуют права на просмотр целевого объекта, метод ОткрытьЗначение() вызовет системное исключение. При необходимости защищайте вызов конструкцией Попытка ... Исключение или проверяйте права функцией ПравоДоступа("Просмотр", Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеЯчейки))).
← На главную