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

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

При разработке интерфейсов, требующих динамического отображения объектов (например, залы ресторана, столики, складские ячейки или гостиничные номера), программисты часто сталкиваются с тем, что стандартные механизмы управляемых форм 1С пытаются «оптимизировать» пространство. Это приводит к нежелательному сжатию кнопок или их некорректному расположению. В данной статье мы подробно разберем, как программно создавать кнопки, фиксировать их размеры и организовывать логику обработки нажатий.

Почему кнопки уменьшаются и как это исправить

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

Рассмотрим пошагово, какие свойства необходимо установить у программно создаваемого элемента типа КнопкаФормы:

  1. Ширина: Установите конкретное числовое значение. Если оставить 0, платформа будет вычислять ширину автоматически по заголовку.
  2. РастягиватьПоГоризонтали: Это критически важное свойство. Его необходимо установить в значение Ложь. Если оно будет истинным, 1С проигнорирует заданную ширину и будет сжимать или растягивать кнопку в зависимости от контекста группы.
  3. ГоризонтальноеПоложение: Для кнопок внутри контейнера лучше использовать Лево.

Разберем пример кода для установки этих свойств:


НоваяКнопка = Элементы.Добавить("Кнопка_Зал1", Тип("КнопкаФормы"), ГруппаКонтейнер);
НоваяКнопка.Заголовок = "Зал №1 (Основной)";
НоваяКнопка.Ширина = 20; // Указываем фиксированную ширину
НоваяКнопка.РастягиватьПоГоризонтали = Ложь;

Программное создание команд и их связь с кнопками

Важно понимать, что в управляемом интерфейсе кнопка — это лишь визуальное отображение. Чтобы она начала выполнять какое-либо действие, к ней должна быть привязана команда формы. Проанализируем процесс создания связки «Команда — Кнопка».

При программном создании мы должны сначала добавить команду в коллекцию ЭтаФорма.Команды, указать ей имя обработчика (процедуры), а затем создать саму кнопку и связать её с этой командой через свойство ИмяКоманды.

Выясним причину, почему нельзя просто назначить процедуру кнопке. В 1С Управляемые формы разделены на данные, команды и элементы. Элемент (кнопка) ссылается на команду, а команда — на процедуру в модуле формы.

Пример программного создания команды:


ИмяКоманды = "КомандаНажатияЗала_" + ИдентификаторЗала;
НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = "ОбработчикНажатияНаКнопкуЗала"; // Имя экспортной процедуры на клиенте
НоваяКоманда.Заголовок = "Выбрать зал";

НоваяКнопка = Элементы.Добавить("Кнопка_" + ИдентификаторЗала, Тип("КнопкаФормы"), ГруппаЗалы);
НоваяКнопка.ИмяКоманды = ИмяКоманды;

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

Представим ситуацию: у нас 50 залов и 200 столиков. Мы не можем (и не должны) описывать 250 отдельных процедур в модуле формы. Вместо этого мы создадим один универсальный метод, который будет понимать, какая именно кнопка была нажата.

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

Посмотрим на пример реализации такого обработчика:


&НаКлиенте
Процедура ОбработчикНажатияНаКнопкуЗала(Команда)
    
    // Имя команды имеет вид "КомандаНажатияЗала_000001"
    // Извлекаем код зала из имени
    ЧастиИмени = СтрРазделить(Команда.Имя, "_");
    Если ЧастиИмени.Количество() > 1 Тогда
        КодЗала = ЧастиИмени[1];
        // Выполняем логику, например, открываем список столиков для этого зала
        ОткрытьСписокСтоликовЗала(КодЗала);
    КонецЕсли;
    
КонецПроцедуры

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

Решение проблемы с отображением (Скроллинг)

Если мы зафиксировали ширину кнопок и их стало много, они перестанут помещаться на экран. Обычная ГруппаФормы с типом ОбычнаяГруппа не всегда корректно предоставляет полосы прокрутки для кнопок.

Проанализируем варианты решения этой проблемы:

  1. Использование таблицы: Вместо кнопок можно использовать таблицу, связанную с коллекцией данных. Таблицу можно настроить в режиме «Поле списка», где каждый элемент будет выглядеть как карточка или кнопка. Таблица автоматически поддерживает вертикальную и горизонтальную прокрутку.
  2. Многострочное размещение: Если установить у группы свойство Группировка в значение ГоризонтальнаяЕслиВозможно, кнопки, которые не влезли в первый ряд, перенесутся на второй.
  3. HTML-поле: Для создания максимально гибкого интерфейса «карты залов» часто используют поле HTML-документа. В этом случае все кнопки рисуются с помощью div и css, а взаимодействие с 1С происходит через событие onclick.

Стилизация программных кнопок

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


Если СтолЗанят Тогда
    НоваяКнопка.ЦветФона = ЦветаСтиля.ЦветОтрицательногоИтога;
    НоваяКнопка.Шрифт = Новый Шрифт(НоваяКнопка.Шрифт, , , Истина); // Жирный шрифт
Иначе
    НоваяКнопка.ЦветФона = Новый Цвет(0, 255, 0); // Зеленый
КонецЕсли;

Важное замечание: Стилизация может не отображаться, если в настройках операционной системы или платформы включены темы оформления, жестко переопределяющие вид кнопок (например, некоторые версии темы «Такси»). В таких случаях рекомендуется использовать вид кнопки Гиперссылка или ПолеНадписи, которые более податливы к изменению цветов.

Оптимизация: Пул элементов

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

Разберем оптимальную стратегию работы с динамическими кнопками:

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

← На главную