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