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

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

Игра на 1С: как сделать свою игру на платформе 1С:Предприятие

Как создать простую игру на платформе 1С:Предприятие: выбор подхода, управляемые формы, поле HTML-документа, примеры логики, ошибки и проверка результата.

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

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

Ниже разобраны оба подхода, конкретные шаги создания игры в конфигураторе, ограничения платформы и типичные ошибки начинающих. Материал ориентирован на тех, кто уже знаком с основами конфигурирования: созданием справочников, общих модулей и форм.

Какие игры реально сделать на 1С и зачем это нужно

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

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

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

Выбор подхода: встроенный язык или HTML + JavaScript

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

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

Сравнение подходов

Управляемая форма + встроенный язык

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

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

Подходит для аркад, анимации и красивого интерфейса. Ограничение: нужен JavaScript, поведение зависит от версии движка браузера в платформе.

Гибрид: логика в 1С, отрисовка в HTML

Подходит для игр с рейтингами и сохранением результатов в базе. Ограничение: сложнее отладка взаимодействия двух сред.

Подготовка: создаём каркас игры в конфигураторе

Начните с пустой конфигурации или учебной копии рабочей базы — эксперименты в продуктивной базе недопустимы. Создайте обработку (раздел «Обработки» в дереве конфигурации): это самый удобный контейнер для игры, потому что обработку можно открывать внешним файлом и не усложнять структуру конфигурации.

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

Каркас игры на управляемой форме
  1. 1
    Создайте в конфигураторе новую обработку и её основную форму
  2. 2
    Добавьте реквизит формы — например, таблицу значений ПолеИгры с колонками Строка, Колонка, Значение
  3. 3
    Добавьте реквизиты Счет (число) и СообщениеИгроку (строка)
  4. 4
    Программно в ПриСозданииНаСервере создайте элементы формы — кнопки ячеек игрового поля
  5. 5
    Назначьте каждой кнопке общий обработчик НажатиеЯчейки
  6. 6
    Реализуйте процедуры НоваяИгра, ПроверкаПобеды и завершение игры
  7. 7
    Откройте обработку в режиме 1С:Предприятие и проверьте ход игры

Ключевой приём — программное создание элементов формы. Рисовать вручную 100 кнопок для поля 10×10 не нужно: в обработчике ПриСозданииНаСервере циклом создаются элементы через Элементы.Добавить(), им назначаются имена по координатам (Кнопка_3_5) и один общий обработчик. В обработчике имя элемента разбирается обратно в координаты — так определяется, по какой ячейке кликнули.

Пример логики: «Сапёр» на таблице значений

Состояние поля удобно хранить в таблице значений с колонками НомерСтроки, НомерКолонки, ЕстьМина, Открыта, ЧислоРядом. При старте игры таблица заполняется случайной расстановкой мин — для этого используется генератор случайных чисел. Затем для каждой ячейки подсчитывается число мин в соседних восьми клетках.

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

bsl
Процедура РасставитьМины(КоличествоМин)
    Генератор = Новый ГенераторСлучайныхЧисел();
    Установлено = 0;
    Пока Установлено < КоличествоМин Цикл
        Стр = Генератор.СлучайноеЧисло(1, ВысотаПоля);
        Кол = Генератор.СлучайноеЧисло(1, ШиринаПоля);
        ПараметрыОтбора = Новый Структура("НомерСтроки, НомерКолонки", Стр, Кол);
        Найденные = ПолеИгры.НайтиСтроки(ПараметрыОтбора);
        Если Найденные.Количество() > 0 И Не Найденные[0].ЕстьМина Тогда
            Найденные[0].ЕстьМина = Истина;
            Установлено = Установлено + 1;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Игра через поле HTML-документа

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

Взаимодействие JavaScript и 1С работает через объектную модель документа: из встроенного языка доступен Документ поля HTML, можно читать и менять элементы страницы, вызывать функции скрипта. Обратный вызов — из JS в 1С — делается через события поля HTML-документа (например, ПриНажатии) либо через запись результата в невидимый элемент страницы, который 1С периодически опрашивает.

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

Сохранение результатов и рейтинг игроков

Если игра делается не только для развлечения, результаты стоит хранить в базе. Создайте регистр сведений с измерением «Пользователь» и ресурсами «Счёт», «ДатаИгры», «Уровень». Запись выполняется в момент завершения игры — через МенеджерЗаписи регистра.

Таблица лидеров строится запросом: выбрать пользователей с максимальным счётом, упорядочить по убыванию, ограничить выборку первыми десятью строками. Результат выводится в табличное поле на той же форме игры. Для мотивационных механик можно добавить уровни: пороги очков, при достижении которых игроку присваивается новый «ранг» — это просто ещё один ресурс регистра или вычисляемое поле в запросе.

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

Типичные ошибки и ограничения платформы

Самая частая ошибка — попытка сделать «живой» таймер через цикл с ожиданием. Встроенный язык 1С не имеет полноценного sleep в клиентском контексте, а подвешивание формы циклом блокирует интерфейс. Для таймеров используйте ПодключитьОбработчикОжидания с разумным интервалом (не меньше секунды для стабильной работы) — этого хватает для пошаговых игр и обратного отсчёта.

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

Типичные ошибки
01
Блокирующий цикл-ожидание вместо ПодключитьОбработчикОжидания — форма зависает и не реагирует на клики
02
Пересоздание элементов формы на каждый ход — интерфейс тормозит, состояние теряется
03
Смешение логики и отрисовки в одной процедуре — игру невозможно доработать без переписывания кода
04
Разработка и тестирование в продуктивной базе — риск повредить рабочие данные и мешать пользователям
05
Использование сложного JavaScript без проверки на целевой версии платформы — игра работает у разработчика и не открывается у пользователей

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

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

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

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

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

Новая игра после завершённой партии
Норма

Поле очищается, счёт обнуляется, кнопки снова активны

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

Остаются старые значения ячеек или игра не стартует

Клики по уже открытым ячейкам
Норма

Ничего не происходит, счёт не меняется

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

Ходы засчитываются повторно, счёт растёт

Запись результата
Норма

В регистре появляется одна запись с верным пользователем и счётом

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

Дубли записей или пустой пользователь

Работа у другого пользователя
Норма

Игра открывается и играется под другой учётной записью

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

Ошибки прав доступа или отсутствия объекта

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

Итог

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

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

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

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

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

Нужно ли знать встроенный язык 1С, чтобы сделать игру?

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

Можно ли сделать сетевую игру для нескольких пользователей?

Технически да, если база клиент-серверная или файловая с общим доступом: ходы сохраняются в регистре, а форма соперника периодически опрашивает его через обработчик ожидания. Однако задержки опроса делают такой режим пригодным только для неспешных пошаговых игр вроде шахмат или «Морского боя».

Как добавить таймер обратного отсчёта в игру?

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

Где взять картинки для ячеек игрового поля?

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

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

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