Реализация графических или игровых механик в среде 1С часто требует нетривиального подхода к стандартным объектам. Одной из классических задач для тренировки навыков работы с интерфейсом является построение шахматной доски заданного размера. В рамках этой статьи мы подробно разберем, как реализовать вывод шахматной доски двумя способами: в ТабличныйДокумент и непосредственно в таблицу на управляемой форме. Мы проанализируем алгоритмы закраски, геометрические особенности ячеек и способы программного управления оформлением.
Для начала разберем работу с объектом ТабличныйДокумент. Основная сложность здесь заключается в правильном позиционировании «курсора» вывода. В 1С существует два ключевых метода: Вывести(), который добавляет область вниз, и Присоединить(), который добавляет область вправо к текущей строке. Чтобы сформировать сетку, нам необходимо использовать их в комбинации внутри вложенных циклов.
Рассмотрим алгоритм формирования доски. Выясним причину, почему простая проверка четности номера строки или колонки по отдельности не подходит. Для классического шахматного порядка нам нужно, чтобы цвет менялся как по горизонтали, так и по вертикали. Математически это выражается через сумму индексов: если сумма номера строки и номера колонки четная, ячейка будет одного цвета, если нечетная — другого.
Разберем пример кода, который реализует эту логику:
&НаСервере
Процедура СформироватьДоскуВТабДоке(КоличествоСтрок, КоличествоКолонок)
ТабДок = Новый ТабличныйДокумент;
// Получаем макет, в котором заранее подготовлены две области: "ЯчейкаБелая" и "ЯчейкаЧерная"
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
ОбластьБелая = Макет.ПолучитьОбласть("ЯчейкаБелая");
ОбластьЧерная = Макет.ПолучитьОбласть("ЯчейкаЧерная");
Для НомСтроки = 1 По КоличествоСтрок Цикл
Для НомКолонки = 1 По КоличествоКолонок Цикл
// Логика шахматной раскраски
Если (НомСтроки + НомКолонки) % 2 = 0 Тогда
ТекущаяОбласть = ОбластьБелая;
Иначе
ТекущаяОбласть = ОбластьЧерная;
КонецЕсли;
Если НомКолонки = 1 Тогда
// Первую колонку строки всегда "выводим" вниз
ТабДок.Вывести(ТекущаяОбласть);
Иначе
// Остальные колонки в этой же строке "присоединяем" вправо
ТабДок.Присоединить(ТекущаяОбласть);
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Настроим отображение
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
КонецПроцедуры
Важный нюанс: чтобы доска выглядела эстетично, ячейки должны быть квадратными. По умолчанию в 1С ширина колонки и высота строки измеряются в разных единицах. Проанализируем ситуацию: для получения визуального квадрата можно программно задать ширину колонок. Рассмотрим способ установки фиксированного размера:
Для Инд = 1 По КоличествоКолонок Цикл
ТабДок.Область(, Инд).ШиринаКолонки = 5; // Значение в пунктах
КонецЦикла;
Для Инд = 1 По КоличествоСтрок Цикл
ТабДок.Область(Инд, ).ВысотаСтроки = 25; // Значение в пунктах
КонецЦикла;
Вторая часть задачи значительно сложнее, так как в управляемом приложении мы не можем напрямую «красить» ячейки таблицы значений в цикле. Здесь нам придется использовать механизм Условного оформления и динамическое создание реквизитов формы.
Посмотрим на последовательность действий, которую нам необходимо выполнить:
Строка для каждой колонки шахматной доски с помощью метода ИзменитьРеквизиты().ПолеФормы, связанные с созданными реквизитами.УсловноеОформление, которые будут определять цвет фона в зависимости от позиции ячейки.Рассмотрим подробнее, как программно создать колонки. Поскольку количество «кубов» задается пользователем, мы не можем нарисовать таблицу заранее в конфигураторе. Проанализируем пример кода для динамического создания структуры таблицы:
&НаСервере
Процедура СоздатьДоскуНаФорме(РазмерДоски)
// 1. Подготовка реквизитов
ДобавляемыеРеквизиты = Новый Массив;
Для К = 1 По РазмерДоски Цикл
ИмяКолонки = "Колонка" + К;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонки, Новый ОписаниеТипов("Строка"), "ТаблицаШахматы"));
КонецЦикла;
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// 2. Создание элементов интерфейса
Для К = 1 По РазмерДоски Цикл
ИмяКолонки = "Колонка" + К;
Элемент = Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), Элементы.ТаблицаШахматы);
Элемент.Вид = ВидПоляФормы.ПолеНадписи;
Элемент.ПутьКДанным = "ТаблицаШахматы." + ИмяКолонки;
КонецЦикла;
// 3. Заполнение данными (индексы для раскраски)
Для СтрНом = 1 По РазмерДоски Цикл
НоваяСтрока = ТаблицаШахматы.Добавить();
Для КолНом = 1 По РазмерДоски Цикл
// Записываем в ячейку признак цвета (0 или 1)
НоваяСтрока["Колонка" + КолНом] = Строка((СтрНом + КолНом) % 2);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Теперь, когда данные в таблице содержат признаки цвета (0 или 1), выясним, как превратить эти цифры в шахматную закраску. Мы воспользуемся объектом УсловноеОформление. Это единственный штатный способ массово изменить цвет ячеек в управляемой форме 1С.
Проанализируем шаги настройки оформления:
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Устанавливаем цвет для "черных" клеток
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаВыделения);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветФонаВыделения); // Прячем текст
// Условие: закрашивать, если значение в ячейке равно "1"
Для К = 1 По РазмерДоски Цикл
Условие = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаШахматы.Колонка" + К);
Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Условие.ПравоеЗначение = "1";
// Добавляем оформляемое поле
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Колонка" + К);
КонецЦикла;
Важно: При выборе способа выделения помните, что «шахматная доска» должна быть заметна с первого взгляда. Кроме цвета фона, вы можете изменять ТолщинаРамки, ЦветТекста или даже выводить спецсимволы Unicode (например, шахматные фигуры ♔, ♟) непосредственно в текст ячейки. Это сделает вашу обработку более функциональной без использования внешних картинок.
Подведем итог нашему разбору. Мы проанализировали два принципиально разных подхода. Работа с ТабличныйДокумент дает больше гибкости в плане печати и сохранения в PDF/Excel, в то время как динамическая ТаблицаФормы лучше подходит для создания интерактивных интерфейсов, где пользователь может взаимодействовать с каждой клеткой отдельно. Выбор метода зависит от финальных требований к вашей обработке.