Разберем интересную и нестандартную для учетных систем задачу — создание игрового поля (например, для игры в Судоку или Сапер) размером 9х9 ячеек на управляемой форме 1С. Часто при программной генерации интерфейса разработчики сталкиваются с проблемой: элементам назначаются значения, код отрабатывает без ошибок, но текст на форме не появляется. Проанализируем ситуацию по шагам и выясним причину такого поведения платформы.
Посмотрим на пример кода, который использовался для программного добавления элементов на форму:
Для y = 1 По ВысотаИгровогоПоля Цикл
НоваяКнопка = ЭтаФорма.Элементы.Добавить("кн_"+y+"_"+x, Тип("ДекорацияФормы"), Группа);
НоваяКнопка.Вид = ВидДекорацииФормы.Картинка;
НоваяКнопка.Заголовок = "2";
НоваяКнопка.Высота = 2;
НоваяКнопка.Ширина = 4;
НоваяКнопка.Видимость = Истина;
НоваяКнопка.КонтекстноеМеню.Видимость = Истина;
НоваяКнопка.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная, 2);
НоваяКнопка.ЦветРамки = WebЦвета.Золотистый;
НоваяКнопка.Гиперссылка = Истина;
НоваяКнопка.УстановитьДействие("Нажатие", "КнопкаНажатие");
КонецЦикла;
В данном коде создается элемент с типом ДекорацияФормы. Выясним причину, почему присвоение значения свойству Заголовок не дает видимого результата на форме. Ошибка кроется в строке, где устанавливается вид декорации:
НоваяКнопка.Вид = ВидДекорацииФормы.Картинка;
В платформе 1С, если элементу назначен вид Картинка, свойство Заголовок при отрисовке интерфейса полностью игнорируется. Данный вид предназначен исключительно для вывода графической информации. Рассмотрим подробнее, как исправить эту ошибку и какие альтернативные способы реализации сетки существуют.
Если мы хотим оставить визуальное представление в виде квадратиков с числами, нам следует изменить вид декорации на Надпись. Декорации в виде надписей могут функционировать как кнопки, если их правильно настроить.
Разберем по шагам, что нужно изменить в коде:
ВидДекорацииФормы.Надпись.Гиперссылка = Истина.Заголовок в любой момент, чтобы изменить числовое значение ячейки.Пример исправленного кода:
НоваяКнопка = ЭтаФорма.Элементы.Добавить("кн_"+y+"_"+x, Тип("ДекорацияФормы"), Группа);
НоваяКнопка.Вид = ВидДекорацииФормы.Надпись; // Исправленный вид
НоваяКнопка.Заголовок = "5"; // Теперь текст будет виден
НоваяКнопка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
НоваяКнопка.Гиперссылка = Истина; // Делает элемент кликабельным
НоваяКнопка.УстановитьДействие("Нажатие", "КнопкаНажатие");
Если необходимо использовать именно классические кнопки, а не декорации, нам потребуется программно добавлять элементы типа КнопкаФормы. Однако здесь есть важный нюанс: кнопке обязательно нужна команда, иначе она не будет работать.
Посмотрим на алгоритм создания кнопки:
КнопкаФормы.ИмяКоманды нашей кнопки.Проанализируем архитектуру нашего интерфейса. Программное создание сетки 9х9 означает добавление 81 отдельного элемента на форму. Платформа 1С не оптимизирована для работы с сотнями динамических элементов (кнопок или декораций). Это сильно перегружает интерфейс, замедляет отрисовку формы на клиенте и усложняет код.
Рассмотрим лучший подход для реализации подобных задач (Судоку, Сапер, Крестики-нолики) — использование Поля табличного документа.
Разберем по шагам, как это реализовать:
ТабличныйДокумент и выносим его в элементы.ТабДок.Область(y, x).Текст = "2";Выбор (срабатывает при двойном клике или нажатии Enter) или ПриАктивизацииОбласти.Посмотрим на пример обработки клика по ячейке:
&НаКлиенте
Процедура ПолеИгрыВыбор(Элемент, Область, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартное редактирование
// Получаем координаты текущей ячейки
ТекущаяСтрока = Область.Верх;
ТекущаяКолонка = Область.Лево;
// Меняем значение в ячейке
ТекущееЗначение = Элемент.Область(ТекущаяСтрока, ТекущаяКолонка).Текст;
Если ПустаяСтрока(ТекущееЗначение) Тогда
Элемент.Область(ТекущаяСтрока, ТекущаяКолонка).Текст = "1";
Иначе
// Логика изменения числа
КонецЕсли;
КонецПроцедуры
Подведем итог. Использование декораций с видом Картинка не позволяет выводить текст в свойстве Заголовок. Для создания кликабельных ячеек с числами можно использовать вид Надпись с включенной гиперссылкой. Однако, для матриц с большим количеством ячеек наиболее производительным, гибким и профессиональным решением в 1С является использование элемента ТабличныйДокумент.