При разработке интерфейсов, требующих динамического отображения объектов (например, залы ресторана, столики, складские ячейки или гостиничные номера), программисты часто сталкиваются с тем, что стандартные механизмы управляемых форм 1С пытаются «оптимизировать» пространство. Это приводит к нежелательному сжатию кнопок или их некорректному расположению. В данной статье мы подробно разберем, как программно создавать кнопки, фиксировать их размеры и организовывать логику обработки нажатий.
В управляемом интерфейсе 1С 8.3 за компоновку элементов отвечает автоматический алгоритм. Если суммарная ширина кнопок превышает ширину формы, платформа начинает пропорционально уменьшать элементы, чтобы они влезли в экран. Чтобы предотвратить это поведение и заставить форму отображать кнопки в их истинном размере, проанализируем настройки свойств расположения.
Рассмотрим пошагово, какие свойства необходимо установить у программно создаваемого элемента типа КнопкаФормы:
Ложь. Если оно будет истинным, 1С проигнорирует заданную ширину и будет сжимать или растягивать кнопку в зависимости от контекста группы.Лево.Разберем пример кода для установки этих свойств:
НоваяКнопка = Элементы.Добавить("Кнопка_Зал1", Тип("КнопкаФормы"), ГруппаКонтейнер);
НоваяКнопка.Заголовок = "Зал №1 (Основной)";
НоваяКнопка.Ширина = 20; // Указываем фиксированную ширину
НоваяКнопка.РастягиватьПоГоризонтали = Ложь;
Важно понимать, что в управляемом интерфейсе кнопка — это лишь визуальное отображение. Чтобы она начала выполнять какое-либо действие, к ней должна быть привязана команда формы. Проанализируем процесс создания связки «Команда — Кнопка».
При программном создании мы должны сначала добавить команду в коллекцию ЭтаФорма.Команды, указать ей имя обработчика (процедуры), а затем создать саму кнопку и связать её с этой командой через свойство ИмяКоманды.
Выясним причину, почему нельзя просто назначить процедуру кнопке. В 1С Управляемые формы разделены на данные, команды и элементы. Элемент (кнопка) ссылается на команду, а команда — на процедуру в модуле формы.
Пример программного создания команды:
ИмяКоманды = "КомандаНажатияЗала_" + ИдентификаторЗала;
НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = "ОбработчикНажатияНаКнопкуЗала"; // Имя экспортной процедуры на клиенте
НоваяКоманда.Заголовок = "Выбрать зал";
НоваяКнопка = Элементы.Добавить("Кнопка_" + ИдентификаторЗала, Тип("КнопкаФормы"), ГруппаЗалы);
НоваяКнопка.ИмяКоманды = ИмяКоманды;
Представим ситуацию: у нас 50 залов и 200 столиков. Мы не можем (и не должны) описывать 250 отдельных процедур в модуле формы. Вместо этого мы создадим один универсальный метод, который будет понимать, какая именно кнопка была нажата.
Рассмотрим механизм идентификации через имя команды. При создании команды мы закладываем в её имя уникальный идентификатор (например, ссылку или код зала). Внутри обработчика мы извлекаем этот идентификатор.
Посмотрим на пример реализации такого обработчика:
&НаКлиенте
Процедура ОбработчикНажатияНаКнопкуЗала(Команда)
// Имя команды имеет вид "КомандаНажатияЗала_000001"
// Извлекаем код зала из имени
ЧастиИмени = СтрРазделить(Команда.Имя, "_");
Если ЧастиИмени.Количество() > 1 Тогда
КодЗала = ЧастиИмени[1];
// Выполняем логику, например, открываем список столиков для этого зала
ОткрытьСписокСтоликовЗала(КодЗала);
КонецЕсли;
КонецПроцедуры
Такой подход позволяет масштабировать интерфейс без изменения программного кода модуля. Мы просто добавляем данные в справочник, а форма сама генерирует нужное количество элементов.
Если мы зафиксировали ширину кнопок и их стало много, они перестанут помещаться на экран. Обычная ГруппаФормы с типом ОбычнаяГруппа не всегда корректно предоставляет полосы прокрутки для кнопок.
Проанализируем варианты решения этой проблемы:
Группировка в значение ГоризонтальнаяЕслиВозможно, кнопки, которые не влезли в первый ряд, перенесутся на второй.div и css, а взаимодействие с 1С происходит через событие onclick.Пользователи часто просят выделить занятые столики красным цветом, а свободные — зеленым. В управляемых формах возможности стилизации стандартных кнопок ограничены, но они есть. Мы можем программно менять цвета:
Если СтолЗанят Тогда
НоваяКнопка.ЦветФона = ЦветаСтиля.ЦветОтрицательногоИтога;
НоваяКнопка.Шрифт = Новый Шрифт(НоваяКнопка.Шрифт, , , Истина); // Жирный шрифт
Иначе
НоваяКнопка.ЦветФона = Новый Цвет(0, 255, 0); // Зеленый
КонецЕсли;
Важное замечание: Стилизация может не отображаться, если в настройках операционной системы или платформы включены темы оформления, жестко переопределяющие вид кнопок (например, некоторые версии темы «Такси»). В таких случаях рекомендуется использовать вид кнопки Гиперссылка или ПолеНадписи, которые более податливы к изменению цветов.
Выясним важный технический момент: частое удаление (Элементы.Удалить) и добавление элементов на форму — это ресурсозатратная операция, которая может вызывать «мерцание» интерфейса.
Разберем оптимальную стратегию работы с динамическими кнопками:
Видимость = Ложь).Таким образом, мы рассмотрели полный цикл управления динамическими кнопками: от фиксации размеров до создания гибкой системы обработки событий. Используя эти приемы, вы сможете создавать профессиональные и удобные интерфейсы для любых отраслевых решений на базе 1С.