
Думал обойтись комментариями к предыдущей статье, но их там накопилось столько, что заинтересованному читателю уже не выудить изменения из одного места. Поэтому — отдельным текстом.
Предыдущая статья - для тех, кто не читал
Можно ли было сделать за неделю (вечерами) одному человеку столько раньше (в доИИ эпоху) - вопрос риторический.
Внимательный читатель заметит, что прошло уже почти две недели, а не одна (как обещано в заголовке). Что поделать: описание, как всегда, опаздывает и вечно догоняет реализацию. Если скачаете платформу прямо сейчас — обнаружите много того, что здесь не описано, но уже работает. Лимиты ведь надо куда-то девать.
Отдельное спасибо всем, кто присылал PR и issue или просто описывал баги в комментариях. И заранее извиняюсь, если ваш PR пока лежит необработанным: ревьюить спустя рукава не хочу, а на вдумчивый разбор нужно время и те самые лимиты.
OneBase за десять дней: управляемые формы, 14 языков интерфейса, точные деньги и инструменты для разработки с ИИ
OneBase — открытая бизнес-платформа на Go со знакомым учётному разработчику DSL: справочники, документы, регистры, отчёты, проведение, запросы. За десять дней после релиза v0.3.27 (22–31 мая) в проект влилось больше сотни изменений и почти 39 тысяч строк кода. Ниже — что появилось: от полноценных управляемых форм с двусторонним конвертером и точной денежной арифметики на decimal до CLI-инструментов, благодаря которым конфигурацию для платформы может писать связка «разработчик + ИИ».
Зачем это всё
OneBase я развиваю в свободное время как ответ на простой вопрос: можно ли взять привычную учётному разработчику модель (платформа → конфигурация → информационная база, DSL «как у всех») и реализовать её на современном открытом стеке — Go плюс PostgreSQL, веб-интерфейс, всё под git и MIT-лицензией? Прошлая статья на Инфостарте описывала фундамент. Эта — про то, как за одну насыщенную неделю платформа догнала по эргономике ещё несколько «взрослых» возможностей.
Пройдусь по главному.
1. Управляемые формы — теперь по-настоящему

Раньше формы в OneBase были упрощёнными: массив видимых полей в YAML и автогенерируемый рендер. Для CRUD этого хватало, но для реальных прикладных форм — с вкладками, командами и обработчиками событий — уже нет.
За неделю появился полноценный объект метаданных, управляемая форма. Структура описывается декларативно в YAML рядом с DSL-модулем (.form.os), а редактировать её можно прямо в конфигураторе — по тому же паттерну, что и печатные формы: split-pane, слева код и структура в Monaco, справа живой предпросмотр.

Заработал рантайм событий: ПриОткрытииФормы, доступ к объекту и его табличным частям, корректные ISO-даты.

Параллельно управляемые формы получили и обработки (DataProcessors, план 40): табличные части, типы параметров (text, choice, reference, file) и собственные формы.
Пример управляемой формы обработки (да, я нашел на компе древний файл выгрузки клиент банка и сделал обработку загрузки для ПУТ, если нужны другие форматы, шлите пример, ИИ вечерком добавит):

Вообще, конечно, изменения в конфигурациях это отдельная большая тема
И, наконец, конвертер — импорт из XML-формата и экспорт обратно (экспорт пока в разработке). Построен он на нейтральном промежуточном представлении: Form.xml ↔ IR ↔ .form.yaml, с сохранением порядка элементов, локализованных заголовков и round-trip-идентичности (Да, я тоже не знал, что это такое, пока внезапно не узнал).

Оговорюсь сразу: конвертер опирается только на открытые текстовые форматы выгрузки (XML и BSL) и собственные таблицы соответствий. Никаких чужих XSD и никакого реверс-инжиниринга исполнения.
2. Интерфейс на 14 языках и многоязычные синонимы метаданных

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


Язык можно задать не только для всей конфигурации, но и для каждого пользователя отдельно — так что в базе вполне может работать многоязычная команда. В домашней бухгалтерии, конечно, перебор, но возможность есть. Прошу прощения, есть что-то перевёл коряво, проверил выборочно на двух языках, которые более-менее знаю кроме родного.
Интереснее другое: синонимы метаданных теперь многоязычные. Наименование справочника, реквизита, документа, регистра, отчёта, подсистемы можно задать на нескольких языках в блоке titles:, и рантайм подставит нужное по языку пользователя — с откатом на дефолтный title:, если перевода нет. Пока переводы синонимов вписываются в YAML руками, UI-редактор для них ещё в планах.
Чтобы переводы интерфейса не разъезжались, добавил инструмент i18ncheck и повесил его в pre-commit hook — недостающие или лишние ключи в локалях ловятся ещё до коммита.
3. Роли и права (RBAC)

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

4. Инструменты для разработки с ИИ

Вот этим я доволен, пожалуй, больше всего. Узкое место при работе ИИ-ассистента над конфигурацией — не «умение кодить», а петля обратной связи. Без headless-способа увидеть структуру и быстро поймать ошибку ассистент работает вслепую.
Первая итерация сделана по принципу «CLI-first»: команда на вход, текст или JSON на выход, точная ошибка с координатами.
И сверху — команда onebase procrun для офлайн-отладки обработок без поднятия всей базы.
Лучшая проверка инструментов — собрать на них что-то настоящее (или почти настоящее). За эту же неделю связка «разработчик + ИИ» с опорой на check/describe/procrun существенно доработала две конфигурации из examples/ и разработала четыре новые с нуля. Петля «сгенерировал → check поймал ошибку с file:line:col → поправил» позволяла ассистенту вести конфигурацию почти без ручной отладки.
Во всех этих конфигурациях есть обработка, наполняющая пустую базу демоданными (кто мне скажет, почему для своих конфигураций 1С не сделает такую?, тогда не нужно отдельно выкладывать демобазу же...)
*в accounting осознанно не стал добавлять субконто (вообще в платформу не стал) т.к. не для тру бухгалтерии затевалась платформа.
5. DSL стал богаче
Язык дорос ещё на несколько этапов дорожной карты. Появились недостающие строковые, датовые и математические функции, ИнформацияОбОшибке, поиск по реквизиту, методы объектов, функции Символ/Chr/Char, чтение и запись текстовых файлов.
Из крупного:
- модуль менеджера (X.manager.os) — вызовы вида Документы.X.Метод();
- Ссылка.ПолучитьОбъект() возвращает изменяемый объект (спасибо issue #8) — со всей цепочкой исправлений, чтобы ссылки «несли менеджера» и обогащались данными шапки и табличных частей;
- тип ТаблицаЗначений (этап D) с полным набором методов: колонки, добавление строк, Итог, Найти/НайтиСтроки, Сортировать, Свернуть, выгрузка и загрузка колонок, обход Для Каждого;
- чтение регистров накопления прямо из DSL: РегистрыНакопления.X.Остатки(), .Движения(), .ВыбратьПоРегистратору();
- мелкие добивки: Массив.Найти/Установить/ВГраница/Вставить, НайтиФайлы, Вычислить.
Поправил и пару коварных мелочей: Сред без третьего аргумента, присваивание поля структуры через точку, а nil-операнд в арифметике теперь честно трактуется как 0, а не превращает выражение в конкатенацию строк.

И главное для учётной системы — деньги без float. Числа DSL переехали с float64 на shopspring/decimal: литералы, арифметика, сравнения, builtins (Число, Окр с режимами, Абс, Цел, Макс, Мин). decimal живёт сквозь всю границу БД: PostgreSQL NUMERIC ↔ decimal без промежуточного float, SQLite TEXT ↔ decimal по типу поля. Это закрывает тот самый классический 0.1 * 1.05, дающий 0.10500000000000001 — баг, на котором обжигались все. Заодно ЧислоПрописью пересчитывает копейки точным decimal-умножением. На уровне метаданных к этому добавилась разрядность: тип number(10,2) (или decimal(15,2)) задаёт длину и точность, конфигуратор показывает поля «Длина» и «Точность», DDL для PostgreSQL генерирует NUMERIC(L,P), а при записи значение округляется до Scale и проверяется на переполнение по Length.
6. REST API v2 и единый сервис записи
Общую логику записи я вынес в EntityService — единую точку для упсёрта, табличных частей, движений и проведения. Теперь REST API использует тот же сервис, что и UI: одинаковое поведение OnWrite, проведение, версионирование. Заодно закрыл неприятный баг — потерю табличных частей при POST/UPDATE через REST и несброс регистров при отмене проведения. Новое поведение прикрыл интеграционными тестами.
7. SQLite, конкурентность и кодировки
SQLITE_BUSY под конкурентной нагрузкой побеждён (с отдельным concurrency-тестом). Путь к файлу SQLite нормализуется при добавлении базы. А при загрузке файлов теперь автоматически определяется кодировка Windows-1251 — больше не нужно вручную перекодировать выгрузки.
8. Десятки улучшений эргономики и внутренностей
Многое из недели — это мелочи, которых по отдельности не видно, а вместе они и делают платформу удобной:
- виджеты главной страницы настраиваются по подсистемам (раньше была одна общая настройка);
- Рабочая область теперь растягивается по ширине;
- inline-создание элемента справочника прямо из ссылочного поля;

- кнопка-лупа для открытия карточки;

- перемещение баз вверх и вниз в лаунчере;

- перемещение метаданных перетаскиванием — и порядок меняется в самом интерфейсе;
- перемещение групп метаданных (вдруг кто-то хочет видеть подсистемы в самом низу списка);
- поиск по метаданным в дереве;

- оптимистические блокировки документов и справочников;
- настройка размера страницы списков;

- явные стрелки сворачивания в дереве конфигуратора;
- иконки объектов в дереве (справочники 📕, документы 📄).
Плюс длинный хвост багофиксов: от «кнопки не работают из-за локали O'zbekcha» и неработающей кнопки «Пароль» в WebView2 до диалога выбора папки на Windows Server 2019 и регистронезависимых отборов по кириллице.

Отдельно поправил неприятный для автоматизации момент: при headless/CI-запуске любая ошибка команды раньше вылезала модальным окном MessageBox, которое некому было закрыть. Теперь окно показывается только при запуске двойным кликом без консоли, а в пайпе или файле ошибка честно идёт в stderr (флаг --no-gui или переменная ONEBASE_NO_GUI).
9. Конструктор рабочего стола

Виджеты главной страницы из прошлого пункта обзавелись нормальным редактором. У рабочего стола теперь два режима раскладки. «Авто» — виджеты текут потоком по ширине, это поведение по умолчанию. «По рядам» — WYSIWYG-конструктор с перетаскиванием: чипы виджетов таскаются мышью между рядами и пулом неиспользованных, ряды добавляются и удаляются, порядок и группировка сохраняются ровно так, как настроил пользователь.
Тот же визуальный редактор получили рабочий стол подсистемы и глобальная «Главная»; сырой YAML никуда не делся — спрятан в спойлер «Расширенно». Заодно навигация стала нейтральной: при входе на /ui/ больше не подсвечивается «первая попавшаяся» подсистема, активна «Главная», а сайдбар плоский.
Теперь каждая подсистема со своими виджетами

Ну и раз уж заговорили про виджеты, то вот небольшое воспоминание из будущего- в последней платформе в конфигураторе переработан раздел виджетов. Теперь их проще создавать, и есть предпросмотр на реальных данных!

10. Качество: тесты, hardening и фиксация техдолга
Часть недели ушла не на фичи, а на укрепление фундамента — по итогам внутреннего аудита.
Точные деньги (decimal) — это, по сути, тоже hardening, только финансовый, про него уже было выше. Дальше по списку:
- HTTP-таймауты на api- и launcher-серверах (ReadHeaderTimeout, IdleTimeout) — защита от Slowloris и зависших keep-alive. ReadTimeout/WriteTimeout я намеренно не выставлял: они оборвали бы загрузку крупных .obz, SSE-стрим отладчика и скачивание бэкапов, поэтому тело запроса ограничивается отдельными MaxBytesReader.
- Страж глубины рекурсии в DSL — без него бесконечный самовызов процедуры рос стек горутины до краха процесса (panic вне досягаемости Попытки); теперь есть порог MaxRecursionDepth.
- Sandbox файловых путей для файловых builtins (ЧтениеТекста/ЗаписьТекста/НайтиФайлы и прочих) — защита от path traversal. По умолчанию выключен для доверенного desktop и включается в демо-режиме, где обработки исполняет недоверенный пользователь.
- Покрытие тестами критичных путей: многопользовательский auth на SQLite (7.9% → 61.3%) и конвертер из 1С (converter 0% → 63.5%, parser1c 0% → 24.1%).
- Гигиена кодовой базы: снял UTF-8 BOM с 41 .go-файла, а в CI добавил страж, который падает при возврате BOM. Остаток техдолга зафиксировал отдельным планом (43): полный graceful shutdown, единый slog, раскол монолитов, добор покрытия.
Итоги в цифрах
Крупные блоки недели: управляемые формы, i18n на 14 языков, RBAC, AI-инструменты, REST API v2, точная decimal-арифметика, конструктор рабочего стола и hardening по итогам аудита.
OneBase остаётся проектом выходного дня и открыт на GitHub под MIT. Если тема «открытая платформа с привычным DSL на Go» вам близка — заходите, пробуйте, заводите issue. В следующих итерациях: MCP-сервер поверх describe/check, продолжение дорожной карты DSL и разбор техдолга.
Спасибо всем, кто поддерживает проект!
Ссылки:
- 🌐 Сайт проекта: onebase.ivantitov.tech
- 🚀 Демо-база (ПУТ): demo.ivantitov.tech — логин `Демонов` / пароль `12345`
Теперь полноценная база в демо режиме (платформенный механизм), данные автоматически затираются бэкапом каждую ночь. (на PG её ещё не тестировал, так что если будут ошибки - пишите)
Если интересно, как происходит деплой на апельсинку, спрашивайте, расскажу, всё в одно нажатие
(представьте себе, как вы 1С новую версию на "сервер" разворачиваете в один клик?)
- 📦 Releases: github.com/ivanarama/onebase/releases/latest
- 📦 Все обновления с описаниями - обновляются автоматом из гитхаба
- 📖 Документация: `QUICKSTART.md` и `DEVELOPER.md` в репозитории
- 💡 Примеры: `examples/`
- 📦 Полная конфигурация Программа Управления Торговлей (ПУТ) (ожидается ещё ПУП и ПУЗ)
Видео версия:
Ссылка ютуб на видеоверсию (можно скачать, если тут не открывается).
Предыдущие статьи про вайбкодинг и OneBase:
Вайб-кодинг в 1С: как рефакторить код бесплатно с помощью VS Code и Roo Code
Вайб-кодинг в 1С: как заставить ИИ БЕСПЛАТНО писать новый код с помощью MCP-серверов
Вайб-кодинг в 1С: Подключаем локальные MCP-сервера к любой нейросети через MCP SuperAssistant
Вайб-кодинг в 1С: Создаём MCP для 1С 7.7 за вечер и пишем обмен с Бухгалтерией 3
Вайб-кодинг в 1С: Codex Desktop + GPT-5.4 пишет обработку САМ (Скайнет?)
Вайб-кодинг в 1С: Настраиваем эффективный workflow
Вайб-кодинг в 1С: Обходим лимиты поиска в Z AI и Claude: поднимаем свой поисковый движок через MCP
Вайб-кодинг в 1С: Бесплатное выполнение рутинных скиллов Claude Code
PromptPilot: менеджер задач для Claude Code, Codex и других CLI
Claude Note — каждая сессия с Claude Code становится знанием
Вайб-кодинг для 1С-ника: как я собрал персональный сайт за вечер с помощью ИИ
Запускаем OpenClaw на Orange Pi Zero 2 W
OneBase — open-source платформа с 1С-подобным языком для пет-проектов, MVP и домашней бухгалтерии
Спасибо за внимание!
Вступайте в нашу телеграмм-группу Инфостарт