К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как сделать игру в 1С: практическое руководство

Разбираем, как создать игру на платформе 1С:Предприятие 8.3: подготовка конфигурации, игровое поле, логика на встроенном языке, таймеры и типичные ошибки.

Создание игры на платформе 1С:Предприятие — необычная, но вполне реальная задача. Встроенный язык 1С, управляемые формы, табличный документ и обработчики ожидания дают всё необходимое для простых аркад, головоломок, викторин и пошаговых игр. Такой проект часто делают как учебное упражнение, демонстрацию для коллег или способ глубже понять механизмы платформы.

Важно сразу понимать ограничения: 1С не является игровым движком. Нет аппаратной графики, звуковой подсистема минимальна, а производительность интерфейса рассчитана на бизнес-формы, а не на 60 кадров в секунду. Поэтому оптимальны жанры с дискретной логикой: «Змейка», «Тетрис», «Сапёр», «Крестики-нолики», «Морской бой», викторины и текстовые квесты.

Ниже разобран полный цикл: от создания пустой конфигурации до работающей игры с полем, логикой, подсчётом очков и обработкой ошибок. В качестве сквозного примера используется «Змейка» на табличном документе — самый показательный вариант.

Выбор жанра и оценка возможностей платформы

Первый шаг — честно оценить, что платформа умеет. Управляемая форма обновляется при вызове сервера или по обработчику ожидания, минимальный практический интервал которого — около 0,1–1 секунды. Это исключает динамичные экшены, но отлично подходит для всего пошагового.

Для отрисовки есть три рабочих варианта. Первый — табличный документ: ячейки можно красить, менять текст и фон, это идеальная «пиксельная сетка». Второй — набор элементов формы (декорации, кнопки), создаваемых программно. Третий — поле HTML-документа, внутри которого можно разместить JavaScript-игру, а 1С использовать как оболочку и хранилище рекордов.

Способы отрисовки игрового поля

Табличный документ

Простая раскраска ячеек, идеален для «Змейки» и «Сапёра». Ограничение: медленная перерисовка больших полей.

Элементы формы

Кнопки и декорации с обработчиками нажатий, удобно для викторин и «Крестиков-ноликов». Ограничение: сложно делать анимацию.

Поле HTML-документа

Полноценный JavaScript внутри 1С, максимум возможностей. Ограничение: нужно знать JS и настраивать обмен данными с формой.

Для первого проекта берите табличный документ и поле 10×10 или 15×15 ячеек. Этого достаточно, чтобы отработать весь цикл: инициализацию, ввод, логику, отрисовку и завершение игры.

Подготовка конфигурации и внешней обработки

Есть два пути. Первый — создать пустую конфигурацию в конфигураторе (Конфигурация → Создать новую) и разрабатывать игру внутри неё. Второй, более практичный — сделать внешнюю обработку (.epf), которую можно открыть в любой базе через Файл → Открыть без изменения конфигурации. Для учебной игры внешняя обработка удобнее: не нужно обновлять конфигурацию базы и не затрагиваются рабочие данные.

Порядок создания внешней обработки: в конфигураторе выберите Файл → Новый → Внешняя обработка, добавьте основную форму (тип — управляемая). На форму поместите реквизит «Поле» типа «ТабличныйДокумент» и перетащите его в дерево элементов — получите область для отрисовки. Добавьте команды «НоваяИгра» и кнопки управления.

Порядок создания заготовки игры
  1. 1
    Создайте новую внешнюю обработку в конфигураторе
  2. 2
    Добавьте управляемую форму и реквизит Поле типа ТабличныйДокумент
  3. 3
    Выведите поле на форму, добавьте кнопку Новая игра
  4. 4
    Напишите процедуру инициализации поля с раскраской ячеек
  5. 5
    Запустите обработку в режиме предприятия и проверьте отрисовку

Проверка на этом этапе простая: при нажатии кнопки «Новая игра» табличный документ должен очищаться и заполняться сеткой нужного размера с одинаковой высотой строк и шириной колонок. Если ячейки «пляшут» по размеру — задайте фиксированные значения программно.

Построение игрового поля на табличном документе

Игровое поле удобно хранить в двух местах: визуально — в табличном документе, логически — в реквизите формы, например в соответствии или двумерном массиве, где каждой клетке сопоставлено состояние (пусто, змейка, еда, стена). Дублирование сознательное: перечитывать цвета из табличного документа для логики медленно и неудобно.

Инициализация выглядит так: очистить документ, в цикле по строкам и колонкам задать размеры и фоновый цвет пустой клетки. Для «Змейки» поле 15×15 комфортно: видно всё поле без прокрутки и перерисовка не тормозит.

Процедура ИнициализироватьПоле()

Поле.Очистить();

Для Стр = 1 По 15 Цикл

Поле.Область(Стр,, Стр).ВысотаСтроки = 18;

Для Кол = 1 По 15 Цикл

Ячейка = Поле.Область(Стр, Кол);

Ячейка.ШиринаКолонки = 3;

Ячейка.ЦветФона = WebЦвета.Белый;

КонецЦикла;

КонецЦикла;

КонецПроцедуры

Чтобы исключить мерцание при перерисовке, меняйте цвет только тех ячеек, состояние которых изменилось: голова змейки закрашивается, хвост очищается. Полная перерисовка всего поля каждый «тик» — частая причина визуальных лагов.

Игровой цикл: обработчик ожидания и ввод пользователя

Сердце игры — цикл, который с заданным интервалом двигает змейку, проверяет столкновения и перерисовывает поле. В 1С для этого служит метод ПодключитьОбработчикОжидания("ИгровойТик", 0.5), где 0.5 — интервал в секундах. Процедура «ИгровойТик» должна быть объявлена с директивой &НаКлиенте.

Внутри тика: вычислить новую позицию головы по текущему направлению, проверить выход за границы и столкновение с телом, при попадании на еду — увеличить длину и счёт, добавить новую еду в случайную свободную клетку, затем обновить отображение. При столкновении — отключить обработчик ожидания через ОтключитьОбработчикОжидания и показать итог.

Ввод с клавиатуры — самое слабое место. Штатного перехвата стрелок на управляемой форме нет, поэтому используют обходные пути: кнопки направления на форме, сочетания клавиш на командах формы или поле ввода, куда пользователь вводит W/A/S/D. Для учебного проекта достаточно четырёх кнопок «Вверх/Вниз/Влево/Вправо».

1c
&НаКлиенте
Процедура ИгровойТик()
    СдвинутьЗмейку();
    Если Столкновение() Тогда
        ОтключитьОбработчикОжидания("ИгровойТик");
        ПоказатьПредупреждение(, "Игра окончена! Счёт: " + Счёт);
    КонецЕсли;
КонецПроцедуры

Важный нюанс: обработчик ожидания работает только на клиенте и только пока форма открыта. При закрытии формы отключайте все подключённые обработчики в событии ПриЗакрытии, иначе возможны ошибки обращения к уже закрытой форме.

Игровая логика, счёт и хранение рекордов

Состояние змейки удобно хранить в реквизите формы типа «СписокЗначений» или массиве структур с координатами X и Y: первый элемент — голова, последний — хвост. Движение — это вставка новой головы в начало и удаление хвоста, если еда не съедена. Такая модель проста и легко отлаживается через отладчик конфигуратора.

Счёт ведите в числовом реквизите формы и выводите в надпись. Для таблицы рекордов есть варианты: хранилище общих настроек (ХранилищеОбщихНастроек.Сохранить) — самый простой способ, не требующий объектов метаданных; либо собственный регистр сведений, если игра встроена в конфигурацию. Для внешней обработки используйте хранилище настроек — оно доступно без изменения конфигурации.

Контрольные точки

Как проверить корректность игры

Движение змейки
Норма

Голова смещается каждый тик, хвост следует без разрывов

Тревожный признак

Появляются лишние сегменты или змейка «разрывается»

Столкновения
Норма

Игра завершается при ударе о стену и о тело

Тревожный признак

Змейка проходит сквозь себя или край поля

Генерация еды
Норма

Еда появляется только в свободных клетках

Тревожный признак

Еда спавнится внутри тела змейки

Завершение
Норма

Обработчик отключён, показан финальный счёт

Тревожный признак

Тики продолжаются после проигрыша, ошибки платформы

Тестируйте граничные случаи: разворот на 180 градусов (его нужно запрещать — иначе мгновенный проигрыш), быстрые двойные нажатия между тиками, заполнение почти всего поля змейкой. Именно на этих сценариях учебные реализации чаще всего ломаются.

Альтернатива: HTML и JavaScript внутри формы 1С

Если хочется плавной анимации, звука и управления с клавиатуры, разместите на форме поле HTML-документа и загрузите в него страницу с игрой на JavaScript. Полный игровой движок живёт внутри HTML, а 1С отвечает за запуск, сохранение рекордов и интеграцию с данными базы — например, викторина может брать вопросы из справочника номенклатуры или сотрудников.

Обмен данными между 1С и JavaScript зависит от клиента и версии платформы; в современных версиях доступны механизмы взаимодействия с полем HTML-документа, но поведение в тонком и веб-клиенте может отличаться. Обязательно тестируйте игру в том клиенте, в котором её будут запускать пользователи.

Маршрут решения

Как выбрать подход

Нужна простая пошаговая игра и минимум технологийТабличный документ + обработчик ожидания, вся логика на встроенном языке
Нужна анимация, звук, управление с клавиатурыПоле HTML-документа с игрой на JavaScript, 1С как оболочка
Игра должна использовать данные базы (вопросы, товары, сотрудники)Любой вариант отрисовки, данные получать на сервере и передавать в форму
Игра — учебный проект для портфолиоВнешняя обработка с табличным документом: проще показать и передать коллегам

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Полная перерисовка поля каждый тик — мерцание и тормоза; обновляйте только изменённые ячейки
02
Серверные вызовы внутри игрового цикла — лаги; вся логика тика должна быть клиентской
03
Не отключён обработчик ожидания при закрытии или рестарте — ошибки и двойная скорость игры
04
Логика читает состояние из цветов ячеек — медленно и хрупко; храните модель в реквизитах
05
Отсутствие запрета разворота змейки на 180 градусов — мгновенный нечестный проигрыш

Проверка результата и публикация игры

Готовую игру проверьте по чек-листу: запуск из режима предприятия без прав конфигуратора, корректный старт и рестарт, завершение без ошибок платформы, сохранение рекорда между сеансами. Прогоните игру минимум под двумя пользователями с разными правами — внешние обработки могут требовать включённого режима использования внешних отчётов и обработок.

Распространять игру удобно файлом .epf — его достаточно передать коллегам. Если игра встроена в конфигурацию, подготовьте инструкцию по обновлению и убедитесь, что новые объекты не пересекаются по именам с существующими.

Итог

Что важно запомнить

Игра в 1С — это управляемая форма, модель состояния в реквизитах, отрисовка табличным документом и цикл на обработчике ожидания. Логику держите на клиенте, перерисовывайте точечно, всегда отключайте обработчики при завершении. Для сложной графики встраивайте JavaScript через поле HTML-документа.

Частые вопросы

Можно ли сделать в 1С игру с плавной анимацией?

Штатными средствами — практически нет: обработчик ожидания и перерисовка формы не дают плавности. Для анимации используйте поле HTML-документа с JavaScript, где доступны requestAnimationFrame и CSS-анимации.

Что лучше для первой игры: обработка или конфигурация?

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

Как организовать управление с клавиатуры без кнопок?

Назначьте командам формы сочетания клавиш в свойствах команды — так работают, например, стрелки или WASD. Полный перехват произвольных клавиш штатно недоступен; для него нужен HTML-вариант игры.

Где хранить таблицу рекордов?

Проще всего — в хранилище общих настроек через ХранилищеОбщихНастроек.Сохранить/Загрузить: не нужны объекты метаданных, работает и для внешней обработки. Для игры внутри конфигурации подойдёт регистр сведений.

Почему игра ускоряется после каждого рестарта?

Причина почти всегда в повторном подключении обработчика ожидания без отключения предыдущего. Перед ПодключитьОбработчикОжидания вызывайте ОтключитьОбработчикОжидания с тем же именем процедуры.

Можно ли использовать данные рабочей базы в игре?

Да, например брать вопросы викторины из справочников. Получайте данные одним серверным вызовом при старте игры и дальше работайте с ними на клиенте, чтобы не нагружать сервер во время игрового цикла.