Разработка игровых механик на платформе 1С — это отличный способ глубоко изучить возможности динамического управления интерфейсом и программного формирования элементов формы. В данной статье мы рассмотрим три основных подхода к реализации игры «Морской бой»: использование динамических кнопок, работу с табличным документом и встраивание HTML-контента.
Для реализации игрового поля 10х10 на управляемых формах нецелесообразно добавлять 100 кнопок вручную в конфигураторе. Проанализируем, как создать их программно. Весь процесс должен происходить на сервере в процедуре ПриСозданииНаСервере.
Разберем по шагам алгоритм создания сетки:
Посмотрим на пример программного кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем родительскую группу для поля
ГруппаПоле = Элементы.Добавить("ГруппаПолеБоя", Тип("ГруппаФормы"), ЭтаФорма);
ГруппаПоле.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаПоле.Отображение = ОтображениеОбычнойГруппы.Нет;
Для Ряд = 1 По 10 Цикл
// Создаем группу для горизонтального размещения кнопок в ряду
ИмяРяда = "Ряд_" + Ряд;
ГруппаРяд = Элементы.Добавить(ИмяРяда, Тип("ГруппаФормы"), ГруппаПоле);
ГруппаРяд.Вид = ВидГруппыФормы.ГруппаКолонок;
Для Кол = 1 По 10 Цикл
ИмяКнопки = "Клетка_" + Ряд + "_" + Кол;
Кнопка = Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), ГруппаРяд);
Кнопка.Заголовок = " "; // Пустая клетка
Кнопка.ИмяКоманды = "ОбработатьВыстрел";
// Важно: передаем координаты через параметр команды
Кнопка.ПараметрКоманды = ИмяКнопки;
Кнопка.Ширина = 3;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
В обработчике команды ОбработатьВыстрел на клиенте мы сможем получить имя нажатой кнопки через параметр и определить, в какую именно клетку попал игрок. Это позволяет использовать один фрагмент кода для всех 100 элементов.
Этот метод часто используется для создания шахмат или сапера, так как табличный документ предоставляет больше возможностей для визуализации (цвета, узоры, картинки). Выясним, в чем преимущество данного подхода.
Преимущества табличного документа:
Для реализации взаимодействия необходимо использовать событие Выбор (двойной клик или нажатие Enter). Проанализируем код обработки клика:
&НаКлиенте
Процедура ПолеБояВыбор(Элемент, Область, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отменяем стандартное редактирование ячейки
Ряд = Область.Верх;
Кол = Область.Лево;
// Проверяем, что клик в пределах игрового поля 10х10
Если Ряд <= 10 И Кол <= 10 Тогда
Результат = ПроверитьПопаданиеНаСервере(Ряд, Кол);
ОбновитьОтображениеКлетки(Область, Результат);
КонецЕсли;
КонецПроцедуры
Внутри функции ОбновитьОтображениеКлетки мы можем менять ЦветФона ячейки или устанавливать в неё текст (например, "Х" при попадании или "●" при промахе). Это позволяет создать наглядное игровое поле без нагромождения элементов управления.
Если ваша задача — сделать игру визуально привлекательной, с анимациями и плавными переходами, рассмотрим использование Поля HTML-документа. В 1С 8.3 это полноценный браузерный контейнер.
Вы можете подготовить HTML-строку с использованием CSS Grid для отрисовки сетки. Взаимодействие с кодом 1С организуется через JavaScript. Выясним, как передать данные о клике из HTML обратно в 1С:
onclick.window.external (в новых версиях — механизм оповещений), чтобы вызвать процедуру 1С.Пример простейшей структуры HTML-поля:
// В коде 1С
ТекстHTML =
"<html>
|<body>
|<div style='display: grid; grid-template-columns: repeat(10, 30px);'>
| <div onclick='fire(1,1)' style='border: 1px solid blue; height: 30px;'></div>
| ...
|</div>
|<script>
| function fire(r, c) {
| // Вызов процедуры 1С
| window.location.href = 'battle:click?r=' + r + '&c=' + c;
| }
|</script>
|</body>
|</html>";
В процессе обсуждения часто всплывает проблема: как открыть старые наработки (например, шахматы или морской бой, написанные 15 лет назад), если нет старой версии платформы? Рассмотрим технический лайфхак.
Если файл базы данных .dt или .1CD не открывается новой версией платформы, можно воспользоваться hex-редактором. Проанализируем заголовок файла, чтобы определить точный номер релиза, на котором он был создан. В большинстве случаев достаточно установить соответствующую «технологическую» платформу (например, 8.1 или 8.2) для первичной конвертации в формат 8.3.
Важный нюанс: при переносе кода из старых версий (особенно из 7.7) логику отрисовки интерфейса придется переписать полностью, так как современные управляемые формы работают по принципу строгого разделения на клиент и сервер, в то время как в старых версиях отрисовка и расчеты часто были перемешаны в одном модуле.
Подводя итог, можно сказать, что 1С — это мощная среда, производительности которой вполне хватает для реализации логических игр и даже простых движков. Выбор метода реализации зависит от ваших целей: динамические кнопки хороши для простых задач, табличный документ — для классического «олдскульного» вида, а HTML — для создания современного интерфейса.