Сел смотреть видео про расчет зарплаты, но, в третий раз уснув, решил немного отвлечься.
Спойлер: в итоге расчету зарплаты ничего не досталось.
Во время просмотра видео в голову почему-то пришел вопрос: можно ли в 1С как-то получать нажатия клавиш, хоть в каком-то виде? Оказалось, что на команды можно в качестве горячих клавиш вешать просто клавиши, без CTRL, ALT, SHIFT.
В общем, расскажу весь процесс разработки по порядку, сразу уточнив - опыта написания "Змейки" на других языках не имею, как в неё играть - особо не помню, написал в целом случайно.
- Создаем внешнюю обработку
- Добавляем управляемую форму
- Добавляем команды для поворота влево, вправо, вверх, вниз и назначаем на них горячие клавиши. Я использую WASD
- В качестве вьюпорта на клиенте получается использовать только ТабличныйДокумент, поэтому сразу добавляем его на форму. Для такой простой игры возможности по рисованию линий в табличном документе не пригодятся, будем просто раскрашивать ячейки
- Изначально я хранил координаты в реквизитах формы и закрашивал одну ячейку после каждого нажатия на клавишу, но в итоге в обработчиках нажатий осталось только изменение направления движения, которое я хранию по-одинэсному, просто текстовой строкой - "Влево"
- Сегменты змейки хранятся в массиве, массив каждый раз копируется в новый, чтобы реализовать перемещение (На мой взгляд, правильная альтернатива - связный список)
- Обновление игрового мира (в нашем случае - перемещение змейки) производится отдельной функцией, которую можно вызывать при нажатии на клавиши (больше для отладки) или по таймеру. Обработка ожидания в 1С, к сожалению, имеет разрешение всего 0.1 секунды, но я оставил её. Третий вариант - игровой цикл, Game loop.
- Добавляем добавление монеток (у меня массив монеток, могу себе позволить добавлять несколько штук сразу)
- Реализуем проверку столкновений с границей, хвостом и монетами
- По факту этой проверки если нужно завершаем игру
- Всё! В итоге получился модуль размером в 340 строк, но это я себе ни в чём не отказывал.
Для тех, кому гитхаб не отключили, выкладываю обработку на github.com. Для этого использую консольный клиент git, OneScript и precommit1c. Так что попутно по шагам расскажу как это делается, благо у меня новый компьютер и гита на нем не было:
- Устанавливаем git (https://git-scm.com/downloads)
- Создаем каталог репозитория, в нем будем хранить обработки
- Заходим в командной строке в каталог репозитория, далее работаем в нём
- Инициализируем репозиторий git init
- Устанавливаем OneScript https://oscript.io/downloads
- Устанавливаем precommit1c opm install precommit1c
- Инициализируем прекоммит в каталоге репозитория precommit1c —install
- Представляемся гиту, что-типа такого:
PS C:\1c\git> git config --global user.email "AlexeyNecro@PochtaAlexeyaNecro.com"
PS C:\1c\git> git config --global user.name "Alexey Necro" - Кладем обработку в каталог репозитория, индексируем файлы:
PS C:\1c\git> git add . - Коммитим:
PS C:\1c\git> git commit
в этот момент precommit1c открывает конфигуратор и распаковывает файлы, то есть, нужна лицензия на файловую базу и желательно открытие обработок без подтверждения. Разрешить открытие обработок без предупреждения можно добавив строку
DisableUnsafeActionProtection=.*
в файл conf.cfg, который лежит в каталоге, куда установлена 1С - После этого локальный репозиторий готов, он уже хранит изменения. Для просмотра в виде исходников удобно использовать Microsoft Visual Studio Code с плагинами для 1с (1C (BSL) Extension Pack) и GitLens.
- Добавляем удаленный репозиторий - можно это сделать на сайте гитхаб, например.
- Затем связываем удаленный репозиторий с локальным
git remote add necro https://github.com/AlexNecro/1C
можно посмотреть список удаленных репозиториев:
git remote -v - Привязываем удаленную ветку к нашей текущей (в этот момент требуется авторизация на сервере):
- git push --set-upstream necro master
- Далее во время работы повторяются следующие шаги:
- Положить (или изменить) обработку в каталоге репозитория
- Проиндексировать файлы git add .
- Коммит git commit
- Отправка в удаленный репозиторий git push
Протестировано на платформах 8.3.19.1138, 8.3.18.1483.