Разработка и Конфигурация · 12 мин
Как сделать игру в 1С: практическое руководство
Разбираем, как создать игру на платформе 1С:Предприятие 8.3: подготовка конфигурации, игровое поле, логика на встроенном языке, таймеры и типичные ошибки.
Создание игры на платформе 1С:Предприятие — необычная, но вполне реальная задача. Встроенный язык 1С, управляемые формы, табличный документ и обработчики ожидания дают всё необходимое для простых аркад, головоломок, викторин и пошаговых игр. Такой проект часто делают как учебное упражнение, демонстрацию для коллег или способ глубже понять механизмы платформы.
Важно сразу понимать ограничения: 1С не является игровым движком. Нет аппаратной графики, звуковой подсистема минимальна, а производительность интерфейса рассчитана на бизнес-формы, а не на 60 кадров в секунду. Поэтому оптимальны жанры с дискретной логикой: «Змейка», «Тетрис», «Сапёр», «Крестики-нолики», «Морской бой», викторины и текстовые квесты.
Ниже разобран полный цикл: от создания пустой конфигурации до работающей игры с полем, логикой, подсчётом очков и обработкой ошибок. В качестве сквозного примера используется «Змейка» на табличном документе — самый показательный вариант.
Выбор жанра и оценка возможностей платформы
Первый шаг — честно оценить, что платформа умеет. Управляемая форма обновляется при вызове сервера или по обработчику ожидания, минимальный практический интервал которого — около 0,1–1 секунды. Это исключает динамичные экшены, но отлично подходит для всего пошагового.
Для отрисовки есть три рабочих варианта. Первый — табличный документ: ячейки можно красить, менять текст и фон, это идеальная «пиксельная сетка». Второй — набор элементов формы (декорации, кнопки), создаваемых программно. Третий — поле HTML-документа, внутри которого можно разместить JavaScript-игру, а 1С использовать как оболочку и хранилище рекордов.
Способы отрисовки игрового поля
Простая раскраска ячеек, идеален для «Змейки» и «Сапёра». Ограничение: медленная перерисовка больших полей.
Кнопки и декорации с обработчиками нажатий, удобно для викторин и «Крестиков-ноликов». Ограничение: сложно делать анимацию.
Полноценный JavaScript внутри 1С, максимум возможностей. Ограничение: нужно знать JS и настраивать обмен данными с формой.
Для первого проекта берите табличный документ и поле 10×10 или 15×15 ячеек. Этого достаточно, чтобы отработать весь цикл: инициализацию, ввод, логику, отрисовку и завершение игры.
Подготовка конфигурации и внешней обработки
Есть два пути. Первый — создать пустую конфигурацию в конфигураторе (Конфигурация → Создать новую) и разрабатывать игру внутри неё. Второй, более практичный — сделать внешнюю обработку (.epf), которую можно открыть в любой базе через Файл → Открыть без изменения конфигурации. Для учебной игры внешняя обработка удобнее: не нужно обновлять конфигурацию базы и не затрагиваются рабочие данные.
Порядок создания внешней обработки: в конфигураторе выберите Файл → Новый → Внешняя обработка, добавьте основную форму (тип — управляемая). На форму поместите реквизит «Поле» типа «ТабличныйДокумент» и перетащите его в дерево элементов — получите область для отрисовки. Добавьте команды «НоваяИгра» и кнопки управления.
- 1Создайте новую внешнюю обработку в конфигураторе
- 2Добавьте управляемую форму и реквизит Поле типа ТабличныйДокумент
- 3Выведите поле на форму, добавьте кнопку Новая игра
- 4Напишите процедуру инициализации поля с раскраской ячеек
- 5Запустите обработку в режиме предприятия и проверьте отрисовку
Проверка на этом этапе простая: при нажатии кнопки «Новая игра» табличный документ должен очищаться и заполняться сеткой нужного размера с одинаковой высотой строк и шириной колонок. Если ячейки «пляшут» по размеру — задайте фиксированные значения программно.
Построение игрового поля на табличном документе
Игровое поле удобно хранить в двух местах: визуально — в табличном документе, логически — в реквизите формы, например в соответствии или двумерном массиве, где каждой клетке сопоставлено состояние (пусто, змейка, еда, стена). Дублирование сознательное: перечитывать цвета из табличного документа для логики медленно и неудобно.
Инициализация выглядит так: очистить документ, в цикле по строкам и колонкам задать размеры и фоновый цвет пустой клетки. Для «Змейки» поле 15×15 комфортно: видно всё поле без прокрутки и перерисовка не тормозит.
Процедура ИнициализироватьПоле()
Поле.Очистить();
Для Стр = 1 По 15 Цикл
Поле.Область(Стр,, Стр).ВысотаСтроки = 18;
Для Кол = 1 По 15 Цикл
Ячейка = Поле.Область(Стр, Кол);
Ячейка.ШиринаКолонки = 3;
Ячейка.ЦветФона = WebЦвета.Белый;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Чтобы исключить мерцание при перерисовке, меняйте цвет только тех ячеек, состояние которых изменилось: голова змейки закрашивается, хвост очищается. Полная перерисовка всего поля каждый «тик» — частая причина визуальных лагов.
Игровой цикл: обработчик ожидания и ввод пользователя
Сердце игры — цикл, который с заданным интервалом двигает змейку, проверяет столкновения и перерисовывает поле. В 1С для этого служит метод ПодключитьОбработчикОжидания("ИгровойТик", 0.5), где 0.5 — интервал в секундах. Процедура «ИгровойТик» должна быть объявлена с директивой &НаКлиенте.
Внутри тика: вычислить новую позицию головы по текущему направлению, проверить выход за границы и столкновение с телом, при попадании на еду — увеличить длину и счёт, добавить новую еду в случайную свободную клетку, затем обновить отображение. При столкновении — отключить обработчик ожидания через ОтключитьОбработчикОжидания и показать итог.
Ввод с клавиатуры — самое слабое место. Штатного перехвата стрелок на управляемой форме нет, поэтому используют обходные пути: кнопки направления на форме, сочетания клавиш на командах формы или поле ввода, куда пользователь вводит W/A/S/D. Для учебного проекта достаточно четырёх кнопок «Вверх/Вниз/Влево/Вправо».
&НаКлиенте
Процедура ИгровойТик()
СдвинутьЗмейку();
Если Столкновение() Тогда
ОтключитьОбработчикОжидания("ИгровойТик");
ПоказатьПредупреждение(, "Игра окончена! Счёт: " + Счёт);
КонецЕсли;
КонецПроцедурыВажный нюанс: обработчик ожидания работает только на клиенте и только пока форма открыта. При закрытии формы отключайте все подключённые обработчики в событии ПриЗакрытии, иначе возможны ошибки обращения к уже закрытой форме.
Игровая логика, счёт и хранение рекордов
Состояние змейки удобно хранить в реквизите формы типа «СписокЗначений» или массиве структур с координатами X и Y: первый элемент — голова, последний — хвост. Движение — это вставка новой головы в начало и удаление хвоста, если еда не съедена. Такая модель проста и легко отлаживается через отладчик конфигуратора.
Счёт ведите в числовом реквизите формы и выводите в надпись. Для таблицы рекордов есть варианты: хранилище общих настроек (ХранилищеОбщихНастроек.Сохранить) — самый простой способ, не требующий объектов метаданных; либо собственный регистр сведений, если игра встроена в конфигурацию. Для внешней обработки используйте хранилище настроек — оно доступно без изменения конфигурации.
Как проверить корректность игры
Голова смещается каждый тик, хвост следует без разрывов
Появляются лишние сегменты или змейка «разрывается»
Игра завершается при ударе о стену и о тело
Змейка проходит сквозь себя или край поля
Еда появляется только в свободных клетках
Еда спавнится внутри тела змейки
Обработчик отключён, показан финальный счёт
Тики продолжаются после проигрыша, ошибки платформы
Тестируйте граничные случаи: разворот на 180 градусов (его нужно запрещать — иначе мгновенный проигрыш), быстрые двойные нажатия между тиками, заполнение почти всего поля змейкой. Именно на этих сценариях учебные реализации чаще всего ломаются.
Альтернатива: HTML и JavaScript внутри формы 1С
Если хочется плавной анимации, звука и управления с клавиатуры, разместите на форме поле HTML-документа и загрузите в него страницу с игрой на JavaScript. Полный игровой движок живёт внутри HTML, а 1С отвечает за запуск, сохранение рекордов и интеграцию с данными базы — например, викторина может брать вопросы из справочника номенклатуры или сотрудников.
Обмен данными между 1С и JavaScript зависит от клиента и версии платформы; в современных версиях доступны механизмы взаимодействия с полем HTML-документа, но поведение в тонком и веб-клиенте может отличаться. Обязательно тестируйте игру в том клиенте, в котором её будут запускать пользователи.
Как выбрать подход
Типичные ошибки и ограничения
Самая частая ошибка — попытка делать всю логику на клиенте с обращениями к серверу каждый тик. Каждый серверный вызов — это сетевой обмен, и игра начинает тормозить. Правило: вся логика игрового цикла — на клиенте, сервер нужен только для загрузки начальных данных и сохранения результата.
Вторая группа проблем — ресурсы. Табличный документ с сотнями ячеек, перерисовываемый целиком несколько раз в секунду, заметно нагружает клиент. Держите поле компактным, обновляйте точечно. Третья типичная ошибка — забытые обработчики ожидания: после закрытия формы они могут вызывать ошибки, а при повторном запуске игры — дублироваться, ускоряя тики вдвое.
Проверка результата и публикация игры
Готовую игру проверьте по чек-листу: запуск из режима предприятия без прав конфигуратора, корректный старт и рестарт, завершение без ошибок платформы, сохранение рекорда между сеансами. Прогоните игру минимум под двумя пользователями с разными правами — внешние обработки могут требовать включённого режима использования внешних отчётов и обработок.
Распространять игру удобно файлом .epf — его достаточно передать коллегам. Если игра встроена в конфигурацию, подготовьте инструкцию по обновлению и убедитесь, что новые объекты не пересекаются по именам с существующими.
Что важно запомнить
Игра в 1С — это управляемая форма, модель состояния в реквизитах, отрисовка табличным документом и цикл на обработчике ожидания. Логику держите на клиенте, перерисовывайте точечно, всегда отключайте обработчики при завершении. Для сложной графики встраивайте JavaScript через поле HTML-документа.
Частые вопросы
Можно ли сделать в 1С игру с плавной анимацией?
Штатными средствами — практически нет: обработчик ожидания и перерисовка формы не дают плавности. Для анимации используйте поле HTML-документа с JavaScript, где доступны requestAnimationFrame и CSS-анимации.
Что лучше для первой игры: обработка или конфигурация?
Внешняя обработка. Она открывается в любой базе через Файл → Открыть, не требует обновления конфигурации и не затрагивает рабочие данные. Отдельную конфигурацию имеет смысл делать, только если игра — часть большого учебного проекта.
Как организовать управление с клавиатуры без кнопок?
Назначьте командам формы сочетания клавиш в свойствах команды — так работают, например, стрелки или WASD. Полный перехват произвольных клавиш штатно недоступен; для него нужен HTML-вариант игры.
Где хранить таблицу рекордов?
Проще всего — в хранилище общих настроек через ХранилищеОбщихНастроек.Сохранить/Загрузить: не нужны объекты метаданных, работает и для внешней обработки. Для игры внутри конфигурации подойдёт регистр сведений.
Почему игра ускоряется после каждого рестарта?
Причина почти всегда в повторном подключении обработчика ожидания без отключения предыдущего. Перед ПодключитьОбработчикОжидания вызывайте ОтключитьОбработчикОжидания с тем же именем процедуры.
Можно ли использовать данные рабочей базы в игре?
Да, например брать вопросы викторины из справочников. Получайте данные одним серверным вызовом при старте игры и дальше работайте с ними на клиенте, чтобы не нагружать сервер во время игрового цикла.