Как программно создать поле в 1С и настроить обработку нажатия по всей его области?

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

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

Метод 1. Программное создание кнопки, стилизованной под поле

Этот метод считается одним из самых надежных, так как кнопка изначально предназначена для обработки нажатий. Нам необходимо программно создать команду формы, а затем привязать её к новой кнопке, настроив её внешний вид так, чтобы она напоминала поле ввода. Рассмотрим этот процесс по шагам.

Во-первых, проанализируем ситуацию: нам нужно создать команду, которая будет выполнять действие, и элемент формы, который будет отображать данные. Для этого в процедуре ПриСозданииНаСервере выполним следующий код:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Создаем команду формы
    ИмяКоманды = "КомандаНажатияПоля";
    НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
    НоваяКоманда.Действие = "ОбработчикНажатияКнопки";
    НоваяКоманда.Заголовок = "Значение поля"; // Здесь может быть ваш текст
    
    // 2. Добавляем кнопку на форму
    ИмяЭлемента = "ИнтерактивноеПоле";
    НовыйЭлемент = ЭтаФорма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), ЭтаФорма.Элементы.ГруппаДляПолей);
    НовыйЭлемент.ИмяКоманды = ИмяКоманды;
    
    // 3. Настраиваем внешний вид под поле ввода
    НовыйЭлемент.Вид = ВидКнопкиФормы.Гиперссылка; // Или обычная кнопка с рамкой
    НовыйЭлемент.РастягиватьПоГоризонтали = Истина;
    НовыйЭлемент.Высота = 1;
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикНажатияКнопки(Команда)
    ПоказатьПредупреждение(, "Нажатие сработало по всей области кнопки!");
КонецПроцедуры

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

Метод 2. Использование события «Выбор» для поля в режиме «Только просмотр»

Если нам принципиально важно использовать именно ПолеФормы вида ПолеВвода, мы можем прибегнуть к хитрости. У поля ввода нет события нажатия, но есть событие Выбор, которое срабатывает при двойном клике (на ПК) или одинарном (на мобильных устройствах), если поле закрыто для редактирования.

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

  1. Создаем программно реквизит формы (если его нет).
  2. Добавляем элемент формы типа ПолеФормы.
  3. Устанавливаем свойство ТолькоПросмотр = Истина.
  4. Привязываем действие к событию Выбор.

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

Теперь при взаимодействии с полем будет вызываться клиентский метод ОбработкаВыбораПоля. Это решение максимально приближено к визуальному стандарту 1С.

Метод 3. Стилизация «Поля надписи» (Декорации) с рамкой

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

Рассмотрим, как сделать Декорацию интерактивной по всей площади:


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

Преимущество этого метода: Мы получаем легкий элемент, который визуально неотличим от поля ввода (благодаря рамке и цвету фона), но имеет прямое событие Нажатие.

Метод 4. Хак с «Кнопкой выбора» и режимом выбора из списка

Существует еще один интересный способ заставить обычное поле ввода реагировать на одинарный клик по всей площади. Для этого мы включаем режим выбора из списка, но перехватываем начало выбора.

Посмотрим на пример настройки такого поля:


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

&НаКлиенте
Процедура ОбработчикНачалаВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь; // Отменяем системное окно выбора
    // Выполняем наш код
    Сообщить("Клик по полю зафиксирован!");
КонецПроцедуры

В данном случае, благодаря свойству РежимВыбораИзСписка, платформа интерпретирует клик по текстовой части поля как команду к началу выбора, что позволяет нам выполнить произвольный код через СтандартнаяОбработка = Ложь.

Итоги и рекомендации

Мы проанализировали четыре различных подхода к созданию интерактивных полей. Выбор конкретного метода зависит от ваших требований к интерфейсу:

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

← На главную