Как в 1С добавить кнопку открытия к полю табличной части в режиме «Только просмотр»?

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

При разработке интерфейсов на управляемых формах 1С часто возникает стандартная дилемма: нам необходимо запретить пользователю редактировать значение в поле табличной части, но при этом оставить возможность открыть карточку справочника или документа, на который это поле ссылается. Если мы просто установим свойство ТолькоПросмотр = Истина, платформа зачастую скрывает кнопку открытия («лупу») или делает ее неактивной. В этой статье мы подробно разберем несколько проверенных способов решения этой задачи, от простых настроек свойств до программной имитации поведения системы.

Способ 1: Использование события «Выбор» таблицы формы

Это самый популярный и надежный метод. Вместо того чтобы пытаться «заставить» кнопку открытия работать, мы перехватываем стандартное действие пользователя — двойной клик по ячейке или нажатие клавиши Enter. Рассмотрим, как это реализовать.

Для начала выделим таблицу формы, найдем в палитре свойств список событий и создадим обработчик Выбор. Внутри этого обработчика мы пропишем логику проверки текущей колонки и открытия значения.


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

Проанализируем этот код: мы используем СтандартнаяОбработка = Ложь, чтобы 1С не пыталась открыть поле для ввода данных. Функция ПоказатьЗначение является универсальной и подходит для большинства случаев открытия навигационных ссылок.

Способ 2: Имитация режима «Только просмотр» через свойства поля

Если нам принципиально важно видеть именно кнопку «лупы» в поле, мы можем пойти другим путем: оставить поле доступным для редактирования (ТолькоПросмотр = Ложь), но программно отключить все возможности изменения данных. Разберем по шагам, какие свойства нужно настроить у элемента формы:

  1. Устанавливаем КнопкаОткрытия = Да (или Истина).
  2. Устанавливаем КнопкаВыбора = Нет.
  3. Устанавливаем КнопкаОчистки = Нет.
  4. Устанавливаем РедактированиеТекста = Ложь.

Для автоматизации этого процесса на больших формах можно использовать процедуру, которая «пробегает» по элементам и настраивает их. Посмотрим на пример такой реализации:


&НаСервере
Процедура СделатьПолеЗаблокированнымНоСКнопкой(Поле)
    
    // Работаем только с полями ввода
    Если Поле.Вид = ВидПоляФормы.ПолеВвода Тогда
        Поле.КнопкаВыбора = Ложь;
        Поле.КнопкаОчистки = Ложь;
        Поле.КнопкаСоздания = Ложь;
        Поле.КнопкаОткрытия = Истина; // Явно включаем кнопку открытия
        Поле.РедактированиеТекста = Ложь;
        Поле.БыстрыйВыбор = Ложь;
        
        // Дополнительно можно запретить выбор через событие НачалоВыбора
        Поле.УстановитьДействие("НачалоВыбора", "ОбработкаНачалоВыбораОтказ");
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3: Использование свойства «Гиперссылка»

Рассмотрим еще один визуально приятный способ. Если у поля в табличной части установить свойство Гиперссылка = Истина, то текст в ячейке станет синим и подчеркнутым. При этом даже если установлено ТолькоПросмотр = Истина, нажатие на этот текст будет восприниматься платформой как команда открытия.

Преимущества этого способа:

Способ 4: Обход через Условное оформление

Это «хитрый» прием, который часто используют опытные разработчики. Суть заключается в том, что в свойствах самого элемента формы (колонки таблицы) мы оставляем ТолькоПросмотр = Ложь. Это гарантирует, что платформа будет рисовать кнопку открытия. Однако, чтобы пользователь не мог ничего поменять, мы накладываем Условное оформление на эту колонку.

Разберем, как это настроить программно в процедуре ПриСозданииНаСервере:


ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыПроизводитель"); // Имя колонки

// Условие можно сделать всегда истинным (например, Производитель заполнен или не заполнен)
// Или оставить пустым, тогда оформление применится ко всем строкам

Выясним причину эффективности этого метода: платформа видит, что на уровне описания интерфейса колонка «редактируемая», и оставляет кнопки активными. Но когда дело доходит до отрисовки конкретной строки, механизм условного оформления блокирует ввод данных. Это позволяет кнопке «лупы» оставаться доступной.

Важные нюансы: Различие «ТолькоПросмотр» и «Доступность»

Проанализируем разницу между этими свойствами, так как их часто путают:

Также стоит проверить Права доступа (Роли). Если у пользователя в правах отсутствует разрешение «Просмотр» для целевого справочника, то никакие программные ухищрения не заставят кнопку открытия появиться. Платформа скрывает ее в целях безопасности, так как пользователь все равно не сможет открыть форму объекта, на который у него нет прав.

Подводя итог, можно сказать, что наиболее универсальным является Способ 1 (Событие Выбор), так как он дает полный контроль над логикой открытия. Если же вам важно минимизировать код, используйте Способ 3 (Гиперссылка) или Способ 4 (Условное оформление).

← На главную