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

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

Разберем интересную и нестандартную для учетных систем задачу — создание игрового поля (например, для игры в Судоку или Сапер) размером 9х9 ячеек на управляемой форме 1С. Часто при программной генерации интерфейса разработчики сталкиваются с проблемой: элементам назначаются значения, код отрабатывает без ошибок, но текст на форме не появляется. Проанализируем ситуацию по шагам и выясним причину такого поведения платформы.

Анализ исходной проблемы

Посмотрим на пример кода, который использовался для программного добавления элементов на форму:


Для y = 1 По ВысотаИгровогоПоля Цикл
    НоваяКнопка = ЭтаФорма.Элементы.Добавить("кн_"+y+"_"+x, Тип("ДекорацияФормы"), Группа);
    НоваяКнопка.Вид = ВидДекорацииФормы.Картинка;
    НоваяКнопка.Заголовок = "2";
    НоваяКнопка.Высота = 2;
    НоваяКнопка.Ширина = 4;
    НоваяКнопка.Видимость = Истина;
    НоваяКнопка.КонтекстноеМеню.Видимость = Истина;
    НоваяКнопка.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 2);
    НоваяКнопка.ЦветРамки = WebЦвета.Золотистый;
    НоваяКнопка.Гиперссылка = Истина;
    НоваяКнопка.УстановитьДействие("Нажатие", "КнопкаНажатие");
КонецЦикла;

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

НоваяКнопка.Вид = ВидДекорацииФормы.Картинка;

В платформе 1С, если элементу назначен вид Картинка, свойство Заголовок при отрисовке интерфейса полностью игнорируется. Данный вид предназначен исключительно для вывода графической информации. Рассмотрим подробнее, как исправить эту ошибку и какие альтернативные способы реализации сетки существуют.

Способ 1: Использование декорации-надписи

Если мы хотим оставить визуальное представление в виде квадратиков с числами, нам следует изменить вид декорации на Надпись. Декорации в виде надписей могут функционировать как кнопки, если их правильно настроить.

Разберем по шагам, что нужно изменить в коде:

  1. Устанавливаем вид декорации: ВидДекорацииФормы.Надпись.
  2. Для того чтобы надпись реагировала на клик пользователя (как кнопка), обязательно оставляем свойство Гиперссылка = Истина.
  3. Для красоты задаем выравнивание текста по центру.
  4. Программно обращаемся к свойству Заголовок в любой момент, чтобы изменить числовое значение ячейки.

Пример исправленного кода:


НоваяКнопка = ЭтаФорма.Элементы.Добавить("кн_"+y+"_"+x, Тип("ДекорацияФормы"), Группа);
НоваяКнопка.Вид = ВидДекорацииФормы.Надпись; // Исправленный вид
НоваяКнопка.Заголовок = "5"; // Теперь текст будет виден
НоваяКнопка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
НоваяКнопка.Гиперссылка = Истина; // Делает элемент кликабельным
НоваяКнопка.УстановитьДействие("Нажатие", "КнопкаНажатие");

Способ 2: Программное создание настоящих кнопок

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

Посмотрим на алгоритм создания кнопки:

  1. Сначала программно создается Команда формы.
  2. Затем создается сам элемент интерфейса КнопкаФормы.
  3. Имя созданной команды присваивается свойству ИмяКоманды нашей кнопки.
  4. Если нужно вывести и картинку, и текст, настраивается свойство отображения «Картинка и текст».

Способ 3: Оптимальное решение для игр (Использование табличного документа)

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

Рассмотрим лучший подход для реализации подобных задач (Судоку, Сапер, Крестики-нолики) — использование Поля табличного документа.

Разберем по шагам, как это реализовать:

  1. Создаем на форме реквизит с типом ТабличныйДокумент и выносим его в элементы.
  2. В модуле формы (например, при создании на сервере) программно настраиваем сетку. Устанавливаем фиксированную ширину колонок и высоту строк, чтобы получились квадратные ячейки 9х9. Выделяем границы блоков 3х3 (для Судоку) более толстыми линиями.
  3. Вывод и изменение чисел осуществляем путем прямого обращения к ячейкам (областям) табличного документа. Например: ТабДок.Область(y, x).Текст = "2";
  4. Для обработки действий пользователя используем стандартные события табличного документа, такие как Выбор (срабатывает при двойном клике или нажатии Enter) или ПриАктивизацииОбласти.

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


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

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

← На главную