Low-code — это тоже разработка. Как мы перестали настраивать систему мышкой и начали ею управлять
Почему компании стоит относиться к конфигурации ELMA 365 как к коду: контроль, повторяемость и меньше сюрпризов в продакшне
Low-code продают как способ обойтись без программистов. Нарисовал форму, настроил процесс, опубликовал. Первые месяцы это правда.
Потом у компании появляются десятки форм и процессов. Над ними работают несколько человек, внешний подрядчик и, в нашем случае, ИИ-агенты. И в какой-то момент на совещании звучит вопрос: «А что именно поменялось во вторник?» Ответа нет. Изменение сделано мышкой в браузере, следов почти не осталось.
Я руковожу направлением бизнес-приложений в холдинге. Мы строим на ELMA 365 модули для договоров, контрагентов, корреспонденции, доверенностей и облигаций. За последние недели мы перевели разработку этих модулей с «кликаем в браузере» на нормальный конвейер с репозиторием. Расскажу, зачем это бизнесу и что мы нашли по дороге.
Где теряется контроль
В типичном low-code проекте вся логика живёт внутри работающей системы. Формы, поля, права, процессы и скрипты настраиваются в веб-дизайнере. Это удобно для одного человека и опасно для команды.
Нет истории изменений, которую можно прочитать. Нет ревью: никто не смотрит, что именно меняется, до публикации. Нет повторяемости: перенести изменение на тест и в продакшн — отдельная ручная работа. И нет простого способа доказать, что в продакшне работает именно то, что проверяли.
Для руководителя это риск, а не техническая деталь. Сломанный процесс согласования договоров стоит денег. Потерянная доработка стоит времени и доверия к ИТ.
Что мешало
У ELMA 365 есть утилита, которая выгружает решение в файлы. Выгрузка работает хорошо: формы, процессы, права и скрипты превращаются в набор файлов, которые можно хранить в git.
Загрузка обратно работала для форм и подписей. Но не для скриптов виджетов. Официальная позиция вендора простая: такой код пишется в браузерном дизайнере, другого документированного пути нет.
Можно было принять это как данность. Мы решили сначала понять, что происходит за кнопками «Проверить» и «Опубликовать».
Что оказалось за кнопкой
За кнопкой оказался обычный компилятор TypeScript, который запускается на сервере через очередь задач. Для каждого виджета сервер готовит описание типов: какие поля есть у формы и у приложения. Компилятор проверяет код и, если всё в порядке, собирает его.
Раз компилятор обычный, его можно повторить. Мы запустили его у себя с теми же версиями и настройками. А потом доказали, что результат совпадает: прогнали все 74 виджета модуля договоров через свой компилятор и через серверный. Результат побайтно одинаковый.
Для бизнеса это означает простую вещь. Код можно писать и проверять в репозитории, с ревью и историей, и получать ровно тот результат, который дала бы кнопка в браузере.
Три находки, которые стоит знать всем
Пакет не подписан. Мы долго думали, что ручную правку не пускает подпись. Нет. Пакет с изменённой буквой проходит проверку. Обратно не загружается из-за другого правила: сервер, где решение создано, не принимает новую версию собственного виджета из файла. Сервер, где решение просто установлено, принимает. Значит, это вопрос архитектуры сред, а не взлома.
Успех может быть ложным. Если в пакете не отмечена новая версия объекта, загрузка молча пропускает его и рапортует об успехе. А скомпилированный код сервер берёт из пакета как есть, не пересобирая. Значит, текст и работающий код могут разойтись незаметно. Поэтому после каждой установки мы выгружаем решение обратно и сравниваем. И держим автоматическую проверку, что исполняемый код соответствует исходнику.
Обновление может удалить вашу работу. Нам пришла новая версия модуля от внешнего поставщика. Перед установкой мы сравнили формы и увидели: в обновлении нет блока с нашей доработкой. Поставили бы как есть — доработка тихо исчезла бы. Никакой злой воли, поставщик просто про неё не знал. Теперь сравнение форм перед любым обновлением обязательно.
Как выглядит процесс теперь
Изменение проходит один и тот же путь. Выгружаем текущее состояние. Правим код в репозитории. Компилируем локально против типов нужного сервера. Смотрим дифф. Ставим на тестовый сервер. Выгружаем снова и сверяем с тем, что отправляли. Только после этого изменение считается сделанным.
Среды разделены по ролям. Есть техническая песочница для экспериментов. Есть общий сервер разработки. Дальше тест и продакшн, куда изменения переносит партнёр по своему регламенту. Продакшн для наших ИИ-агентов только на чтение: смотреть можно, менять нельзя.
Для переноса появился простой реестр. На каждое готовое изменение — карточка: что меняется, как проверить на тесте, как убедиться в продакшне. Статусы: «Ожидает переноса», «На Test», «На PROD». Скучно? Очень. Зато ни одна доработка больше не лежит забытой две недели.
Временный путь и правило про роботов
Пока компилятор не был готов, публиковать скрипты приходилось через браузер. Мы научили робота нажимать кнопки в дизайнере вместо человека. Это работало, но хрупко: после обновления платформы кнопка публикации оставалась активной даже при ошибках компиляции. Робот мог опубликовать сломанный код, пока мы не научили его читать ответ компилятора.
Отсюда правило, которое я теперь предлагаю всем: автоматизировать интерфейс только там, где нет командной строки или API. Робот в браузере — запасной путь, а не основа процесса.
Что это даёт компании
Контроль. Любое изменение видно в истории: кто, что, когда и зачем.
Повторяемость. Одно и то же изменение одинаково проходит тест и продакшн, без ручного повторения кликов.
Меньше риска. Мы проверяем не «команда завершилась», а фактическое состояние сервера. Ложные успехи ловятся до того, как их заметят пользователи.
И ещё одно. ИИ-агенты становятся полезными. Агенту нужен файл, а не браузер. Как только код живёт в репозитории, агент может писать его, а человек — проверять дифф. Без этого шага ИИ в low-code остаётся игрушкой.
Low-code экономит время на старте. Но если компания строит на нём важные процессы, ей нужна та же дисциплина, что и в обычной разработке: репозиторий, ревью, проверяемая установка. Платформа не обязана давать это из коробки. Это можно построить самим.