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