Платформа, яка пережила все
6 / 21

Розділ 5. Лофт на Глибочицькій

Частина II · Розділ 5

Лофт на Глибочицькій

1

Назара я знайшов через Reddit. У треді про перехід з Node.js на 1С хтось дописав злу тираду — а Назар відповів спокійно, по пунктах, як людина, яка справді змінила стек і не пожалкувала. Я написав йому в особисті. Він відповів через двадцять хвилин: «Зустріньмось у Creative States на Глибочицькій, я там у п'ятницю ввечері зазвичай сиджу до десятої».

У п'ятницю ввечері я знайшов його у скляній переговорній на третьому поверсі. Чорна футболка з логотипом якоїсь хмарної конференції, MacBook, два монітори навколо, склянка з латте, очі — як у людини, яка тиждень не виходила нікуди далі кав'ярні внизу.

Назару двадцять сім. До 1С він три роки писав на Node.js — стартап на Глибочицькій, бек-офіс для маркетплейсу, потім якесь FinTech-API, потім fintech закрили, він пішов на фріланс. У 2023-му випадково взяв замовлення на «доробити невелику базу 1С» для логістичної компанії. Доробив за тиждень. Зрозумів, що годинні ставки в 1С такі ж, як у Node.js, а конкуренція менша на два порядки. За рік перейшов повністю.

— Я не закохався, — каже він одразу. — Я тверезо вирішив. У мене не було ілюзій, що це краща технологія, ніж Node. Це інша технологія. У неї дешевший вхід, дорожчий вихід, і повністю інша філософія. Я це зрозумів за перший місяць. І потім просто вирішив, що мене це влаштовує.

2

— А філософія в чому?
— У тому, що в 1С код — це доповнення до метаданих, а не навпаки.

Він повертає до мене один з моніторів. На екрані — Конфігуратор. Дерево об'єктів. Назар наводить курсор.

— Дивися. У мене зараз pet-project. Невеликий: для маленької кав'ярні на Подолі вести облік закупок, продажів, зарплат бариста. Я почав це робити, щоб самому розібратися, без клієнта над душею. Ось — Довідник «Контрагенти». Я просто додав об'єкт. У мене з'явилося:

Він починає клацати, відкриваючи різні розділи платформи. Я бачу:

— Колонка Найменування у формі — є. Я її не писав. Колонка в БД — є. Я не писав міграцій. Форма списку — є. Я не верстав. Форма елемента — є. Реквізити перекинуті автоматично. У звітах СКД цю сутність вже видно як джерело — я можу зробити звіт «Закупки по контрагентах» без жодного рядка коду. Через стандартний механізм. У REST API типової — цей довідник уже експортується. Як OData. Як HTTP-сервіс. Я нічого не робив.

Він дивиться на мене.

— Тепер уяви, скільки б це коштувало мені на Node. Sequelize-міграція. Express-роут CRUD. React-сторінка списку. React-форма редагування. Окремий компонент select для випадного списку. JWT-захист. Якийсь admin-розділ. А тут — я просто сказав платформі: тут має бути сутність "Контрагенти". Усе решта — її проблема.

3

— Це Active Record на стероїдах, — кажу я. — Або Salesforce.
— Це Salesforce, — погоджується Назар. — Тільки російською, і за десять тисяч гривень замість десяти тисяч доларів. Серйозно. Архітектурно — той самий патерн. Декларативна метамодель, на яку платформа автоматично нав'язує всю інфраструктуру: UI, БД, API, права, інтеграції. Salesforce назвав це «Customizable Multi-Tenant Cloud». 1С назвав це нічим — він просто це робить з 2003-го.

— А Django Admin?
— Django Admin — ближче. Але Django Admin — це інтерфейс для внутрішніх користувачів, бекенд-адмін. Він некрасивий, обмежений, не для кінцевого користувача. У 1С те, що ти бачиш через Конфігуратор, — це не адмін. Це продакшн-інтерфейс. Бухгалтер у тебе в кав'ярні цим користується. Він не знає, що це згенерована форма. Він просто заводить контрагентів.

— А WordPress із Custom Post Types?
— WordPress занадто примітивний. У нього немає об'єктної моделі. Поста — навіть кастомного типу — недостатньо, щоб написати реальну бізнес-логіку з проводками. У 1С понад тридцять типів метаданих, і кожен — це окрема архітектурна форма.

Я переглядаю його екран. Дерево містить пункти, які я вже бачив у Артема в офісі над магазином автозапчастин: Довідники, Документи, Журнали документів, Перелічення, Звіти, Обробки, Плани видів характеристик, Плани рахунків, Плани видів розрахунку, Регістри відомостей, Регістри накопичення, Регістри бухгалтерії, Регістри розрахунку, Бізнес-процеси, Завдання, Загальні модулі, Підсистеми, Ролі, Підписки на події, Регламентні завдання, Зовнішні джерела даних, HTTP-сервіси, Web-сервіси...

— Скільки тут всього типів?
— Десь сорок. Залежно як рахувати. Кожен — це не просто шаблон. Це окремий примітив платформи зі своєю поведінкою. Регістр накопичення накопичує — він знає, як зібрати залишок на дату. Регістр бухгалтерії робить проводки — знає кореспонденцію. Документ — знає, як проводитись і як відкочуватись. Бізнес-процес — знає графи переходів. Завдання — знає чергу виконавців.

Він задумується.

— Це, по суті, онтологія бізнесу, вшита у виконуване середовище. Не модель даних. Не фреймворк. Онтологія.

4

— А що тоді робить програміст? — питаю я. — Якщо платформа сама знає все це.

Назар сміється.

— Програміст пише те, чого платформа знати не може. Тобто — специфіку конкретного бізнесу. Які саме реквізити має твій контрагент. Які саме рухи робить твій документ. Які саме звіти треба твоєму користувачу. Який саме регламент проведення.

Він відкриває «Модуль об'єкта» документа «РеализацияТоваров» — і показує мені процедуру ОбработкаПроведения. Двадцять рядків коду.

— Ось де живе бізнес-логіка. Тільки тут. Усе решта — конфігурація. Я не пишу контролер. Я не пишу шаблон форми. Я не пишу SQL. Я пишу: «коли цей документ проводиться — створи такі-то рухи в таких-то регістрах».

— Двадцять рядків?
— Для типового бізнес-сценарію — двадцять. Для нетипового — двісті. Для дуже складного — дві тисячі. Але це завжди про специфіку. Не про інфраструктуру.

Він показує мені модулі, які прив'язуються до різних місць у системі.

— Модуль форми — код для конкретної форми. Натиснули кнопку, обробили подію. Модуль об'єкта — код для життєвого циклу об'єкта. Модуль менеджера — статичні методи на типі. Загальні модулі — бібліотеки коду без прив'язки. Підписки на події — слухачі, які реагують на події інших об'єктів. Регламентні завдання — крон.

— Це схоже на CMS, якщо забрати з CMS контент, — додає він. — Платформа знає про сутності, типи, події, життєві цикли. Розробник додає специфіку. Усе інше — автоматичне.

5

— А темна сторона?

Я очікую довгий монолог про російські ключові слова, російське походження, неможливість Git, повільність типових. Я готовий до всього цього. Назар відповідає інакше.

— Темна сторона — це vendor lock-in глибший за SAP.

Він робить паузу.

— SAP — система, з якої важко піти. Бо дані важко вивезти, бо інтеграції, бо процеси. Але ABAP — це врешті-решт мова з компілятором. Якщо завтра SAP зникне, теоретично ABAP-код можна перенести у відкритий інтерпретатор. Він читабельний. Він стандартизований. Він не залежить від конкретного середовища.

— 1С — інакше. Моя конфігурація — це XML-описи метаданих плюс модулі мовою 1С. Без платформи це нічого не запускає. Платформа — закрита, її код не відкритий, ніхто не зробить її open-source клона за рік. Якщо завтра 1С (компанія) припинить існування — у тебе залишається купа XML і модулів, які ти можеш прочитати, але не зможеш виконати.

— А BAS?
— BAS — це форк платформи, легальний, з ліцензією. Але це той самий двигун. Якщо умовно завтра весь стек 1С/BAS зникне — мільйони українських баз перетворяться на музейні експонати. Як ENIAC. Дані прочитаєш, обробити не зможеш.

— Це сценарій реальний?
— Він не сценарій сьогодні. Але він — теоретично можливий. І це, як на мене, — філософська проблема платформи. Ти не просто пишеш код. Ти орендуєш онтологію в одного постачальника. На дуже довго.

6

— Ще одна темна сторона, — додає Назар. — Платформа — це чорна скринька.

Він пояснює. Коли в Node.js у тебе щось не працює, ти лізеш у node_modules, читаєш бібліотеку, бачиш, де баг. Можеш зробити форк, патч, PR в апстрім. У JavaScript-світі усе — відкрите.

У 1С — навпаки. Платформа — proprietary, закрита, без сорців. Якщо у тебе документ проводиться повільно — ти не можеш подивитися, як саме реалізована проводка. Ти бачиш свій код, бачиш свою конфігурацію — а далі починається порожнеча, у яку ти зазираєш через профайлер і логи технологічного журналу. І сподіваєшся, що те, що ти подумав про поведінку платформи, — правда.

Іноді — ні. Іноді платформа поводиться інакше, ніж ти очікував. І ти не маєш способу це перевірити, окрім емпіричних експериментів.

— Це інверсія прозорості порівняно з open-source, — каже він. — У Node ти бачиш усе вниз до libuv. У 1С ти бачиш свій код і обриваєшся на API. Те, що під API — для тебе невідомо.

— Як ти з цим живеш?
— Звикаю. Як будь-хто, хто переходить із open-source в проприєтарне середовище. Salesforce-розробники теж так живуть. Apex-розробники — теж. ServiceNow — теж. Це окремий жанр інженерії: писати поверх чорної скриньки. Він не для всіх. Але для багатьох — комфортний, бо знімає половину проблем.

7

— Філософське питання, — кажу я. — Метадані як перший клас — це геніально чи це обмеження?

Назар довго мовчить.

— Це інженерний компроміс. Якщо твоя задача потрапляє в модель платформи — це геніально. Ти за день робиш те, на що в Node пішов би місяць. Якщо твоя задача не потрапляє в модель — це боляче, бо ти боротимешся з платформою. Платформа не дозволить тобі зробити свою архітектуру. Вона нав'яже свою.

— Як часто завдання потрапляють?
— Для бухгалтерського, торговельного, виробничого, кадрового обліку — майже завжди. Це те, під що 1С робилась. У цьому домені платформа — найкраща у світі за співвідношенням швидкість/вартість. Для нестандартних задач — рідше. Для веб-додатків зі складним UX — ні. Для real-time систем — ні. Для AI-pipelines — ні. Платформа знає те, на що її проектували. Бухгалтерію країни.

Він дивиться на свій pet-project — кав'ярня, контрагенти, документи.

— У сенсі цієї кав'ярні — все потрапляє в модель. У сенсі моєї попередньої FinTech-роботи — нічого б не потрапило. У 1С я б не написав торгового бота, який щомілісекунди обчислює ціну ордера. Це інша індустрія.

8

Я зачинив записник.

— Дякую, Назаре. Ти, здається, єдиний у цій книзі, хто прийшов у 1С не за обставинами, а за вибором.

Він знизує плечима.

— Може бути. Я з покоління, у якого вибір технології — це раціональне рішення. Я подивився на ринок, на свої навички, на вартість часу. 1С виграла за всіма пунктами. Я не патріот платформи. Я не апологет. Я просто там, бо там вигідно. Якщо завтра вигідно стане десь ще — я піду туди.

Я виходжу з лофту на Глибочицьку. Ввечері тут паркуються електросамокати, у барах через дорогу починається п'ятничний натовп. У вікнах коворкінгу — десятки таких самих Назарів, кожен зі своїм екраном, своїм стеком, своєю онтологією.

Я думаю про те, що Назар сказав: «я орендую онтологію в одного постачальника на дуже довго». Це фраза, яку я довго ще обмірковуватиму.

У наступному розділі я повернусь до однієї деталі, яку Назар лише мимохідь згадав і не розгорнув. Деталі, від якої залежить більше, ніж здається. Це деталь — мова. У 1С вона говорить російською. І це — частина історії, яку треба розповісти повільно і чесно. Без емоцій. Без замовчувань.

Це наступний розділ.