1. Назначение и позиционирование
jFabula — браузерный клиент «Оперативный учёт». Исторически это перенос десктопного приложения на MS Access на web-платформу. Среда исполнения — обычный браузер; доступ — интернет/интранет.
- Классический SaaS — код и БД на стороне хоста.
- Гибрид — код с сервера производителя, БД у заказчика; локальный AwwS (Access Windows Web Server) — HTTP/прокси к MDAC/MDB, кэш модулей.
db.tbl.*,
фильтры/расчёты/печать выполняются на клиенте; расширение — через iframe-плагины и спецформы add/sf.
2. Архитектура и стек
| Слой | Компоненты | Роль |
|---|---|---|
| Shell | jFabula/forms/main.html, main.js | Вкладки, глобальный фильтр, статус-бар, login iframe, PWA manifest |
| Домен | Fabula.js (jf), Fabula.mm.js, Fabula.ext.js, Fabula-tables.js, fabula.min.js (fa) | Документы, движения, свойства, плагины, формулы |
| UI | lib/wi.*, lib/mi5.* | uiTable, wiProperties, комбо, календарь, диалоги, форум, ФС |
| Данные | lib/db.js (db_Client) | Query / apiTbl / getReferences, Profile, isAdmin, Access↔MSSQL, db + dbsys |
| Сервер | AwwS / host | HTTP API /db/{dbName}/…, auth /auth/…, опционально WebSocket |
Кодировка UI: Windows-1251. Язык интерфейса: русский. PWA: jFabula/manifest.json (display: standalone). Полноценный offline (service worker) в просмотренном коде не обнаружен.
3. Запуск, Auth, bootstrap
Точки входа
- /jFabula → forms/main.html
- /jFabula/db/{dbName} — конкретная база (пример:
well) - index.html — хаб продуктов (Фабула, PM, АРМы…)
- login.html + login.js — iframe-логин
Auth (jAuth)
- Cookie:
Login,dbName,Sha1(SHA1 от login+password; Guest — фиксированный hash). - POST
/auth/{dbName}/login.htmlс Base64-телом{ Sql:'Auth', Login, Sha1, … }. - Успех →
db_Client,Rights,Users; вызовmain.Start(или pm/sb/am…). Login=="Agent"→ в UI показываетсяLogin2.?reload=Y— ускоренный вход по cookie Sha1.
main.Start
- Ожидание
coreLib,mainTbls,docs. - Guards:
User=="0"→/;isAdmin("N")без полного admin →/pm. mainTbls(db); apiTbl (GandsIco, formula); getReferences (Sys, Gands, Firms…).- Profile → Tabs +
wi.mainFilter→GotoTab(mainTab). - Цепочка ядра: Fabula.js → Fabula.mm.js / fabula.min.js / Fabula.ext.js.
4. Модель данных
Метамодель: Fabula-tables.js (mainTbls), Fabula.mm.js, ReStru.js.
| Сущность | Смысл | Связи |
|---|---|---|
| Docs | Хоз. документ / заказ: тип, статус, филиал, агент, фирмы, суммы, долги, НДС, даты | 1—N Movement; N—M Property; платежи через PartPay |
| Movement / Moves | Строки: GS, кол-во/цена, CodeOp, фазы MMFlag, MMPID, исполнитель, даты работ | N—1 Gands; связь с PM по MMID |
| Firms / ClientFIO | Юрлица и физлица, контакты, холдинг Parent_ID | Props; movements |
| Gands (+ Sys) | Номенклатура / системные коды SY*; иерархия кодов | GandsExt → formula, plugins, KKT, отчёты |
| Property | EAV: ExtClass (DOCS/FIRMS/Gands…), ExtID, pid | pid=0 шапка; pid=MMID строка |
| Money / Bank / Cash / Salary + PartPay | Платежи и разнесение на документы | PayID ↔ PPPayID; PPDocID ↔ DocID |
| Profile / Talk | UI-профиль пользователя; обсуждения задач | Profile в GandsExt; Talk — лента PM |
5. Модуль «Заказы» (docs)
Файлы: forms/docs.html|js, docs.tabs.js, docs.print.js, docs.rep.js.
Статусы документа
| Код | Смысл | Эффект |
|---|---|---|
| Df | Черновик | Удаление без F только на Df; выход → MMFlag=1 для GSFlag «У» |
| Rs | Резерв | Символ в statusSymb |
| Wk | Проведён | non-admin: isEdit=false |
| Ax / OK | Архив / lock | non-admin lock; merge/import skip |
| Bl | Принудительный edit | isEdit=true; ставит только admin F |
Доп. гейты: ReadOnly config; чужая заявка; ДатаЗапрета; formula disDocAVR / disDocCompany / disDocType.
Жизненный цикл
- DocsNew — типы SYОП*; copy с режимами перенос(3)/копия(4)/склад(5)/закупка(6)/производство(7).
- DocsMerge — слияние отмеченных в текущий DocID (запрет Ax без F; >9 авансов _KKT).
- Импорт — Menu SYВкОпИм → setPlugin / sEval из SysExts.
Шапка
DocID, Company, DocType, Agent/Manager, FirmContract/FirmCustomer/Person, RegDate / DateAVR / DateAcc / TxtAcc, ParentDoc, Sum1/Sum2, Debt/Debt2, НДС/спецналог, Discount/Margin. Currency в UI закомментирован, поля в SQL остаются.
Строки Movement
- docs.move — продукция (Doc==DocID).
- docs.move2 — операции/затраты; фильтр П/М/Р/Б/Г/1 (подрядчики / материалы КОП 8* / работы 01–09 / бух Flag D / главные / подч.).
- MMPID — дерево; MMFlag: 0 / 1 / 9✓ / A✕ / B❄ / X. Удаление обычно на фазе 1.
- NewItem → editMoveForm / calc → insertMoveForm.
Подвкладки документа
| Tab | Содержание |
|---|---|
| Продукция | docs.move |
| Операции | docs.move2 + move2Set |
| Оплаты | PartPay; AutoPay/ForcePay; ККТ; переход в money |
| Затраты | сводка банк/касса + zp/% |
| Макеты | wiImgList из picture-props |
| SpecForm | HTML из DocTypes.SpecForm (в разметке TH может отсутствовать) |
Фильтры / Mode0 / HideCosts
DocsFilter: тип, долг, подчинённые, даты, товар/спец, gf.*, заказчик/платёж, propFilter.
Mode «оф.» показывает Sum2; jf.Mode0 принудительно включает Mode для non-F;
HideCosts прячет колонки и вкладки Операции/Затраты.
6. Модуль «Задачи» (pm)
Файлы: forms/pm.js, pmm.html. Может работать standalone на /pm.
- Список задач на базе Moves; фазы MMFlag; wiProperties.
- Forum: wiForum / Talk.
- Сигналы pmSignal0..2 в title-баре (переход / возврат / оплата).
- Таймеры TimeRefreshTalk / TimeRefreshMMID; chart по Talks.
- Config в Profile «PM»; связь с docs через goLink.
7. Модуль «Деньги» и ККТ
PayType → таблицы
| PayType | Назначение | Таблица |
|---|---|---|
| де | Касса | Cash |
| эк | Эл.касса | Cash |
| рс | Банк | Bank |
| эд | Эл.деньги | Bank |
| чк | Чеки | Bank |
| ба | Бартер | Cash |
| zp | Проценты | Cash |
| зп | Зарплата (нужен FZ) | Salary |
ID платежа: {Company}{Y}{PayType}{#####}. В архиве — MoneyAll / PartPayAll / …
Операции
- NewItem (CFZ), Merge (FZ), CorrectMoney (SumRest), DelItem с ограничениями (_KKT / kkt:).
- PartPay: payDoc/doPay — разнесение на долги Docs.
- ForcePay (FBZ) из вкладки оплат документа.
- Импорт: importMoney.fun_* (1S, Yandex, Qiwi, CloudPayments, RNCB, RNKB, GenBank, VTB, CSV, Robokassa, Common…). Список в UI — из SY-меню БД.
ККТ / atol (add/exts/ext.kkt.js)
- KKT из GandsExt GSExType=KKT; команды из atol + formula kkt%.
- Профиль Касса / Эквайринг (Company → касса/ККТ).
- Команды: Отгрузка/sale, Аванс/advance, возврат; Flag A→Online, K→PayKeeper, R→RBSoft (+ close смены).
- Результат в Property
_KKT/ Noticekkt:. Отладка: add/sf/atol.html.
8. Контрагенты и номенклатура
Firms
Типы FirmTypes; список + форма Firms/ClientFIO; props; контакты; связанные движения; поиск по ИНН/ОГРН; адрес/карта; холдинг Parent_ID; действие «Обновить ЭДО: Астрал».
Gands (кратко)
Иерархический справочник кодов GSID (2/4/6/8 символов) плюс отдельное дерево ~SYSTEM (SY…) — системные справочники и настройки приложения. Подробности — в § Номенклатура и ~SYSTEM.
Номенклатура и ~SYSTEM — подробное описание
Файлы UI: forms/gands.html|js. Метамодель:
Fabula-tables.js (db.tbl.Sys / Gands / SysExts / formula).
Live-цифры БД well: Sys ≈ 1+4+34+471 узлов (L2/L4/L6/L8); formula ≈ 469;
производные кэши DocTypes 30, CodesOp 371, Agents 406, Storage 16, Regions 89…
1. Как устроена вкладка
- Левое дерево
#gandsList— уровни раскрытия кнопками 1/2/3/4 (gands.Draw(2|4|6|8)): код GSID длины 2→4→6→8. - Правая карточка
#gandsExt— имена уровней, артикул/КОП/единицы/флаги, свойства (wiProperties), расширения GandsExt, файлы/иконки, движения по GS, действия «Изменить код», «Инвентаризация», «Амортизация», стикер. - Фильтры: глобальный фильтр; Группа (Gands4); Склад (Storage); Флаги (gandsFlag); расширения Тип/Имя/Значение; «хитрый» prop-filter.
Left(GSID,2) <> 'SY' → db.tbl.Gands) и системная
(Left(GSID,2)='SY' → db.tbl.Sys, корень SY = ~SYSTEM).
formula (Preview, QR, …) — тот же механизм, что db.tbl.formula.2. Код GSID и уровни
| Длина | Смысл | UI |
|---|---|---|
| 2 | Корень раздела (для system — SY) | уровень 1 |
| 4 | Раздел / крупная группа | уровень 2 |
| 6 | Подраздел / тип | уровень 3 |
| 8 | Лист: конкретный вид / запись справочника | уровень 4 |
Поля записи: GSKindName/GSName, GSCodeNumber (артикул/таб.№), GSCOP, GSUnit, GSFlag,
FirmDefault, цены, Sort/Sort4. Расширения — таблица GandsExt
(GSExType/Name/Attr1/Attr2/Flag), свойства — Property (ExtClass=Gands).
3. Дерево ~SYSTEM (live well)
~SYSTEM (SY) ├── ВКЛАДКИ (SYВк) — меню/действия модулей UI и плагины ├── СПРАВОЧНИКИ (SYСП) — классификаторы, конфигурация, параметры, филиалы ├── ТИПЫ ОПЕРАЦИЙ (SYОП) — DocTypes (продажи/закупки/производство/склад/прочее) └── СОТРУДНИКИ (SYСо) — оргструктура → Agents/Users/Profile
3.1. SYВк — ВКЛАДКИ
Конфигурация пунктов меню вкладок приложения (не товар). L6 → модуль; L8 → конкретное действие/отчёт/фильтр/плагин.
| Код L6 | Модуль | Примеры L8 (well) |
|---|---|---|
| SYВкАП | Андроид приложение | АРМ водителя (Ав), АРМ кладовщика (Ск) |
| SYВкПл | Деньги | Действия/Импорт, Назначение платежа, Отчеты, Хитрый фильтр |
| SYВкДп | Дополнительно | Документы, ФИС; здесь же узел плагинов + GSExType=plugin |
| SYВкЗа | Задачи | Действия, Отчеты, Хитрый фильтр |
| SYВкОп | Заказы | Действия (импорт/меню DocsNew), Отчеты, Хитрый фильтр |
| SYВкКо | Контрагенты | Действия, Отчеты, Хитрый фильтр |
| SYВкНо | Номенклатура | Действия, Отчеты, Хитрый фильтр |
Типы расширений на вкладках: import (меню импорта), query/query2 (отчёты),
plugin (URL в Attr1 через formula), property, fis, help…
3.2. SYСП — СПРАВОЧНИКИ (ядро настроек)
| L6 | Название | L8 / содержимое | Кэш в db.tbl |
|---|---|---|---|
| SYСПКл | Классификаторы | ЕИ, Регионы России, Страны, ЭДО | gandsUnit (53), Regions (89), providerEDO (52), state/countries |
| SYСПBP | Конфигурация | Команды, Константы, Меню строки, Подстановки, Фазы | autoSql, template, меню/подстановки строк; фазы связаны с pmState |
| SYСПКТ | Параметры | главная «панель настроек» системы (см. ниже) | CodesOp, Status, Storage, Tags, Pathes, Domain, gandsFlag, KKT/atol, pmState… |
| SYСПФи | Филиалы | Листья SYСПФиXX (XX=код филиала: Fi, Ве, АО, Фо…) |
Companes (14); реквизиты/подписи/НДС/р/с → ourBank, Taxes |
SYСПКТ — Параметры (L8, well):
| Код | Название | Что питает |
|---|---|---|
| SYСПКТАИ | Автоисправления | Правила AutoCorrect / ReStru |
| SYСПКТДМ | Домены | db.tbl.Domain + динамические Domain(имя) — списки для props (Адрес, КД, КОП, Пункт выдачи…) |
| SYСПКТRB / Ат | ККТ RBSoft / Атол | KKT, atol-команды (GSExType KKT/atol) |
| SYСПКТCH | Контекстная помощь | help-тексты |
| SYСПКТКП | КОП | CodesOp (~371): иерархия кодов операций — подробно §6 |
| SYСПКТМП | Макро-пути | Pathes: [makets], [docs], [bank], [gands]… → сетевые каталоги |
| SYСПКТКф | Общие | Общие константы/режимы (Mode0, DateArx, MainCompany… через formula/config) |
| SYСПКТСК | Склады | Storage (О1 Основной, Р1 Рулонка, Н1 Наружка…) |
| SYСПКТСт | Статус | Status: Df/Wk/Ax/Bl/Rs/No/nP |
| SYСПКТТг | Теги | Tags: [1c], [isp], [email], [kop]… разметка UI/печати |
| SYСПКТФа | Фазы задач | pmState (~28): 1 Черновик… 8/7п/6т… |
| SYСПКТФН | Флаги номенклатуры | gandsFlag (D/S/U/А0…) |
| SYСПКТФЗ | Фоновые задания | task / фоновые сценарии |
| SYСПКТШа | Шаблон | template — шаблоны сообщений/текстов |
Филиал SYСПФиXX несёт в GandsExt/Property: ИНН/КПП/ОГРН/адреса/телефоны/email, подписи 1-я/2-я, налоги (НДС с датами → Taxes), расчётные счета (р/с → ourBank + привязка KKT), настройки ЭДО. Разбор по well — §7.
3.3. SYОП — ТИПЫ ОПЕРАЦИЙ (DocTypes)
Каждый L6 — семейство документов; L8 — конкретный DocType (ключ = последние 2 символа кода).
При создании заказа меню берётся отсюда (DocsNew / SYОП*).
| L6 | Семейство | Примеры DocType (well) |
|---|---|---|
| SYОПОт | ПРОДАЖА | По Полиграфия, НИ Наружка.Изготовление, Ус Услуги, До Доставка, Га Газеты, НА Out of Home |
| SYОППо | ПРИОБРЕТЕНИЕ | Газеты, Услуги (закупка) |
| SYОПВП | ПРОИЗВОДСТВО | Дизайн, Изготовление, Сборка, Сдельщина, Транспорт, Некондиция, Самореклама… |
| SYОПСк | СКЛАД | Приход/Расход накладная, Инвентаризация, Амортизация |
| SYОППр | ПРОЧЕЕ | CRM, Авансовый отчёт, Зарплата, Проекты |
| SYОПЧО | Частные объявления | отдельный контур ЧО |
На типе документа в Exts задаются: фильтры номенклатуры (Фильтр/Фильтр2), подчинённые документы, SpecForm, печатные формы, правила поведения строк.
3.4. SYСо — СОТРУДНИКИ
Оргструктура → Agents / Users. L6 = отдел; L8 = сотрудник (GSCodeNumber = ID пользователя).
| L6 | Отдел (well) |
|---|---|
| SYСо10 | Администрация |
| SYСо20 | Бухгалтерия |
| SYСо30 | Дизайн |
| SYСо40 | Продажи |
| SYСо50 | Закупки |
| SYСо61…69 | Производство: Рулонное / Широкоформат / Наружка / Полиграфия / Постобработка / Сувенирка |
| SYСо70 | Водители |
| SYСо80 | Zaprintom (внешний канал/агенты) |
| SYСоСл / Ув / 00 / 99 | Служебные / Уволенные / Числятся / Чужие |
У сотрудника в property: подмена/просмотр (расширение списка Users), склад, контакты, фото. Profile пользователя хранится как GandsExt на его SYСо*-узле (GSCodeNumber=User): Main/Filters/PM/Касса/Эквайринг… (SHA1/Rights в SysExts специально скрываются из общей выборки).
4. Как System «разворачивается» в кэши клиента
При загрузке mainTbls:
GandsWHERE Left(GSID,2)<>'SY' — товары.SysWHERE Left(GSID,2)='SY' — system-дерево; из листьев собираются DocTypes, Companes, Agents, Users…SysExts/sys-import— все GandsExt с GSExID LIKE 'SY%' (кроме formula/config в отдельном потоке).funTblsраскладывает Exts в специализированные таблицы: plugins, KKT, Storage, Status, Tags, CodesOp, pmState, Pathes, Domain, Regions, Assigning, providerEDO, gandsUnit, ourBank, Taxes, autoSql, template, localReport…formula(+ formula2 из sys) — ~469 текстовых правил/SQL-фрагментов/шаблонов UI.
5. Товарная номенклатура (не SY)
- Те же 4 уровня кода, но корни — товарные группы (не SY).
- Склады/флаги/единицы берутся из System-параметров; движения и остатки — из Movement.
- Спецдействия: инвентаризация, амортизация, стикер, импорт, отладка Zaprintom/спецформы.
- Live: кассы/точки как отдельные GS (ФоКасса-*, ФоПушкина-*, ФоСклад, zaprintom.fo…).
6. Подробно: SYСПКТКП — КОП (коды операций)
Узел System SYСПКТКП («Параметры. КОП»). Записи GandsExt с этим GSExID (кроме property/help)
загружаются в db.tbl.CodesOp. Live well: 371 кода
(L1: 9 · L2: 56 · L3: 208 · L4: 98).
Семантика и флаги
- КОП пишется в строках Movement (
CodeOp) и платежах; фильтрgf.CodeOp; разнесение PartPay по КОП долга. - В коде:
Flagс буквой A →AVR=true(участвует в АВР/учёте выручки); I →percIn(проценты); D — документооборот/бух; T/Z — спец. режимы (работы/зарплата); префикс d часто у «детализируемых» групп. - Иерархия: 1 символ → класс; 2 → группа; 3–4 → конкретная операция (в т.ч. работы 01xx).
- В UI затрат
docs.move2: КОП8*≈ материалы;01*–09*≈ работы (см. moveExt).
Классы L1 (well)
| Код | Класс | Флаг |
|---|---|---|
| 0 | Вспомогательные операции | |
| 1 | РЕКЛАМНАЯ ПРОДУКЦИЯ (A) | dA |
| 2 | УПАКОВКА И ЭТИКЕТКА (A) | A |
| 3 | РАЗМЕЩЕНИЕ (A) | dA |
| 5 | ПРОЧЕЕ (A) | dA |
| 6 | ЗАРПЛАТА И НАЛОГИ | |
| 7 | НАКЛАДНЫЕ РАСХОДЫ | |
| 8 | ТМЦ (A) | A |
| 9 | ПРОЧИЕ ОПЕРАЦИИ |
Группы L2 — обзор по классам
| Диапазон | Смысл (примеры well) |
|---|---|
| 00–03 | Документооборот (D), работы реклама/этикетка, услуги |
| 10–19 | Продажи/производство рекламы: дизайн, ШФ, текстиль, наружка, карты, сувенирка, полиграфия, плоттер, УФ |
| 21 | Этикетка |
| 30–38, 51 | Размещение: ЧО, OOH, эфир, пресса, доставка, интернет, медийка, аэропорт |
| 61–66 | Проценты, сдельщина, трудовые, налоги, страхование, зарплата (Z) |
| 70–79 | Накладные: производство, ОХР, транспорт, а/м, PR, подотчёт, сторонние услуги |
| 80–89 | ТМЦ/ОС: НМА, компьютеры, оргтехника, транспорт, здания, станки, сырьё, запчасти, МБП |
| 90–99 | Резерв, вложения, деньги в пути, инвентаризация, займы, отсроченные налоги, внереализационные, капитал |
Примеры детализации
00 Документооборот → 001 УПД покупатели, 002 поставщики, 003/004 кассовые ордера, 005 счёт поставщика, 006 материалы, 007 топливо, 00F web Fabula, 00S Zaprintom…
10 Дизайн (A) → 100 почасовой, 101 разработка, 109 предпечатная подготовка.
01 Работа реклама (A) (флаг TA) → 010 макетирование, 0100 креатив, 0101 макетирование, 0120 ШФ, 0140 монтаж наружки, 0142 лазер… — «трудовые» КОП производственных строк.
12 Широкоформат (A) → 120 собственная / 121 сторонняя / 122 ДТФ.
SYСПКТКП с GSExType=код операции и именем;
после перезагрузки справочников код появится в комбо CodeOp. Менять флаги A/I осторожно —
влияют на АВР, проценты и отчёты.
7. Подробно: SYСПФи — филиалы (наши юрлица)
Листья SYСПФиXX (XX = 2-символьный код филиала) → db.tbl.Companes.
Расширения филиала (property / «Подпись» / «Налог» / «р/с» / ЭДО / KKT) собираются в
Companes + ourBank / Taxes / hash KKT.
Карточка филиала — что хранится
| Группа Ext | Поля | Куда попадает |
|---|---|---|
| property | ИНН, КПП, ОГРН/ОКПО, Адрес, Адрес юр., Телефоны, E-mail, Дата АВР, Color, _GUID | Companes.INN/KPP/… |
| Подпись / 1-я, 2-я | должность + ФИО | Fst*/Snd* для печати счетов/АВР |
| Налог / НДС, Прибыль | ставка, период d1–d2 | ndsTax(d), profitTax, Taxes |
| р/с | номер счёта, БИК, банк, KKT в Attr2, Flag A=default | ourBank / ourBankBr / ourBankHide; RS/BIC на Companes |
| KKT (часто на SYСПФи* или Параметры) | имя кассы, cfg JSON (server, users…) | db.tbl.KKT.hash |
Филиалы well (Companes)
| Код | Название | ИНН | Default р/с | Банк | profitTax | р/с всего |
|---|---|---|---|---|---|---|
| Fi | ФИЛИАЛ (тест) | 910200282829 | 0000 | Тест Филиал | — | 7 |
| АО | Очень Хорошо | 9102004850 | 40702810452720003074 | Сбербанк | 4 | 10 |
| Фо | ИП Фомичева Л.В. | 910200294870 | …2622 | Сбербанк | 5 | 28 |
| Ел | ИП Елсуков А.Ю. | 910200282829 | …2624 | Сбербанк | 5 | 31 |
| РР | Ручная работа | 9102049146 | …4778 | Сбербанк | 4 | 8 |
| РП | РПП | 9102048784 | …97565 | ВТБ | 4 | 6 |
| ДМ | Дом Рекламы | 9109004874 | …2047 | Сбербанк | — | 9 |
| Ве | Верант | 9102162180 | …1913 | ВТБ | 6 | 2 |
| РО | РА ОХ | 2301094285 | …16573 | Сбербанк Кр. | 1 | 1 |
| ПО | Взаимное обеспечение | 9102219849 | …0464 | Сбербанк | — | 3 |
| Ко/ЛН/Си/РА | *ликвидированные | … | … | … | 7/…/7/20 | мало |
У многих юрлиц заполнены GUID 1С (Code1C), цвет филиала в UI, email (zaprintom.ru / vwell.su / vwell.biz).
Расчётные счета и ККТ
ourBank≈ 114 счетов по филиалам; Flag: A — счёт по умолчанию, h — скрыт в части списков, E — эквайринг, n — варианты hide-списков; в Attr2 может быть имя KKT.- На Fi (тест): 0000 + эквайринг/VTB/Best2pay/РНКБ/UniTeller → KKT «Тест-RBSoft» / «Тест-Онлайн».
- Боевые кассы привязаны к Ел/Фо/РР: ФоКасса-*, zaprintom.fo/el, RB-Fo/Zap/РР, *-Онлайн (atol online),
локальные
/atol/…/api/v2и прямой IP192.168.3.178:16732. - Профиль пользователя «Касса» / «Эквайринг» выбирает кассу по коду Company текущего филиала документа.
Как это стыкуется с документами
Docs.Company = код филиала (Fi/АО/Фо/…) → Companes[Company] даёт реквизиты печати, НДС, default RS → ourBank фильтруется по Gr=Company → KKT из профиля Касса/Эквайринг для этого Company → Mode0 / MainCompany (formula) влияют на «официальный» филиал
8. Практический смысл для сопровождения
- Новый тип заказа → лист под SYОП* + Exts (фильтр GS, печать, SpecForm).
- Новый пункт меню вкладки / плагин → SYВк* + Ext type import/query/plugin.
- Новый КОП / фаза / склад / тег → соответствующий лист SYСПКТ*.
- Новый филиал / р/с / ККТ → SYСПФиXX + property/р/с/KKT.
- Новый сотрудник → SYСо** + Profile Exts; права — строка Rights (не всегда видна в дереве).
- Бизнес-правила печати/SQL/режимов → formula (и ConfigLoc), не обязательно отдельный JS.
9. Права, Profile, Config, formula
Буквы Rights (db.isAdmin(tag))
Проверка: sIn(Rights, tag.split("")) или полный admin 'A'. В коде часто комбо: CFZ, FBZ, BFL, CWF…
| Буква | Контекст |
|---|---|
| A | Суперправа |
| B | Бухгалтерия / 1С / ЭДО / фильтры Agent |
| C | Касса / KKT / AutoPay / чеки |
| D | АРМ водителей; ATS |
| E | Money: ограничения User; del рс/эд |
| F | Полный админ UI |
| L | Запись Profile (BFL); combo Agent |
| N | Только /pm |
| R | Combine; docs Bl |
| S | Сборная печать |
| V | AdminTools / AutoCorrect |
| W | Склад arm-stock |
| Z | Финансы / зп / проценты |
| P / T / U | ATS / forum / редко — слабо задокументированы в JS |
Profile / Config
- Profile в GandsExt: Main, Filters, PM, Money, Firms, Gands, doc.report.setup*, Касса, Эквайринг, Tag…
getConfig(Prop) ≡ formula(Prop); setConfig → Property Config/ConfigLoc.- ReStruConfig: Version, Mode0, ExtURL/2, MainCompany, ДатаЗапрета, Таймер выхода…
Механизм db.tbl.formula
Runtime-конфигурация и мини-язык выражений: бизнес-правила живут в БД (GandsExt),
клиент подставляет/вычисляет их через глобальную formula() (Fabula.mm.js).
Live well: ~469 строк → ~425 уникальных ключей в hash.
formula (имя + атрибут с {…} / P[1]).Хранение и загрузка
GandsExt WHERE GSExType = 'formula'
→ db.tbl.formula (Src: main)
Sql: SELECT GEIDC, GSExName AS Key,
GSExAttr1 + iif(Flag LIKE '%d%' AND Attr2 NOT NULL, Attr2, '') AS Val,
GSExFlag
funAfterLoad: hash[Key] = r; при дублях имени Val += Val
db.tbl.formula2 — копия схемы, Src: sys (системная БД; в well hash пуст)
db.tbl.atol — тот же паттерн для GSExType='atol' (команды ККТ)
- Формулы не обязаны висеть только на SYСПКТ*: Type=
formulaвстречается наSY,SYВк*,SYСо,SYСПКТ*, ХФ и др. Ключ — GSExName. - В общем
SysExtstype formula/config отфильтрованы; отдельный preload / apiTbl / mainTbls. - Flag d (~256 шт. в well): к Val дописывается Attr2 (длинные шаблоны в двух полях).
- Имена с
*— часто шаблоны печати/черновики (оферта, cashAVR…), всё равно в hash. - Редактирование: номенклатура/~SYSTEM → Ext type formula; сброс кэша
dbReloadTbl(db,"formula")/ смена фазы может инвалидировать hash.
API formula(parm, isEval, n, args)
| Вызов | Поведение |
|---|---|
formula("MainCompany") |
Lookup hash.MainCompany.Val; если нет {…} — вернуть текст as-is
(напр. [filial]Fi[/filial]) |
formula("docSale(DocID)") |
Lookup docSale, подставить аргументы в P[1], P[2]… → результат-строка
(часто фрагмент SQL) |
formula(text, true) |
«Раскрыть» вложенные {expr}: lookup имени / sEval JS-выражения;
рекурсия до отсутствия { или глубины >100 |
formula("a,b,c", true) |
Если все ключи есть в hash — sEval(formula(каждого)) подряд (пакет) |
formula("{iif(…)}") / вложенные |
Вычислить содержимое скобок (доступны $0…$9, fa, db, mi5…) |
Мини-язык внутри Val
{…}— блок вычисления или ссылка на другую formula по имени ({docSale},{PayCompany(cash, firm)}).P[1]…P[n]— позиционные параметры вызоваname(arg1,arg2)или массивargs/isEval-массив подстановок.$0…$9— временные глобалы (mi5.browser.js);$$()сохранить/восстановить,$$(1)очистить. Типичный паттерн шаблона:{$1=…, $2=fa.Cur(), … , "SELECT "+$1}.[end]→,""(обрыв цепочек iif в шаблонах).- Комментарии SQL/JS снимаются через
sComment; HTML-entities>и т.п. нормализуются передsEval. {input}— плейсхолдер (хитрые фильтры / отчёты), не вычисляется внутри formula.
// пример: предикат «продажа»
docSale.Val ≈ Mid( {"P[1]" || "DocID"}, 4, 2) IN ('ру','рг','по',…)
formula("docSale(DocID)", true)
→ Mid( DocID, 4, 2) IN ('ру','рг',…)
// пример: константа филиала
MainCompany → [filial]Fi[/filial]
DateArx → 01.01.25
// пример: конфиг ЭДО
Astral.Doki → таблица Fi|Ко|Ел|Фо… → globalId | org id
Классы формул (по применению)
| Класс | Примеры ключей | Роль |
|---|---|---|
| Константы / режимы | Mode0, MainCompany, DateArx, ExtURL, noProps | филиал по умолчанию, архив, URL |
| SQL-предикаты | docSale, docBuy, sql* | WHERE в отчётах и фильтрах |
| Проверки / гейты | chkEDO*, chkPay, disDoc*, bad*, need* | блокировки UI, валидация |
| ККТ | kktTemplate, kktNDS, kktClient, kktOper… | сборка JSON чека |
| ЭДО / оплаты | Astral.Doki, PayCompany, Payroll* | ящики, выбор филиала оплаты |
| Хуки жизненного цикла | afterDoc, afterMove, change-mov-mmflag, Фазы-* | действия после записи / смены фазы (~48 «Фазы*») |
| Шаблоны печати/UI | *Оферта.*, Счет.*, Меню*, Анкета* | тексты/меню через Format |
| Автоисправления | correctSumDoc, moneyMerge + autoSql | пакетные SQL-фиксы |
Well: ~278 с {, ~138 «простых» строк, Flag пуст ~101 / d ~256 / h/hd/dh — скрытие/режимы в UI редактора.
Связь с остальным клиентом
db.getConfig(p)→formula(p); архив/филиал вlib/db.js(DateArx,MainCompany).- Отчёты / ХФ / plugins URL / Tags span — почти везде
formula(…, true)перед показом или SQL. autoSqlможет брать тело изdb.tbl.autoSqlи прогонять через formula.- Смена MMFlag: pre/do-скрипты из Base64 + formula; меню фаз — formula с ключом GS.
- Вкладка задач (pmm): чекбокс перезагрузки «формулы» вместе с Sys/SysExts.
formula(..., true) и блоки {…} выполняют sEval в контексте страницы —
это и сила (полный доступ к fa/db), и риск. Опечатка в formula ломает отчёты/чеки/ЭДО без деплоя JS.
Дубли имён склеивают Val — следить за уникальностью GSExName.
10. Ядро fa / db / фильтр / WebSocket
fa — текущий контекст
Нет единого store: объект берётся из активной вкладки + кэш fa.doc / fa.move.
| API | Поведение |
|---|---|
| fa.Doc | Текущий документ (docs/pm/arm/acc) |
| fa.Move | Строка Movement; Props.X → Property |
| fa.Cur | money или Doc |
| fa.Money | money.tbl.Cur() |
| fa.Props | EAV по pid=0 / MMID |
db.Query
formReq → Ajax /db/{dbName}/{CacheName}; Src sys → dbsys; *Src — параллельные запросы.
apiTbl — GET готовых таблиц; getReferences — пакетный Preload.
Архив: DateArx + gf.Arx → *ARX / *All.
MainFilter
switch(вкладки) → docs/pm/gands/firms/money.Filter. Общие gf.*: Date1/2, Arx, CodeOp, Company, Firm, Agent, WorkerType.
Persist Filters в Profile. fa.getFilter — SQL-фрагменты.
WebSocket
db.ws → /ws/{db}/{user}. Команды: ping, setflag/settalk → pm.signalPM; msg/reload/tel/signdoc/update.
Live в основном для задач/Talk; полный refresh Docs/Money — частичный.
11. Плагины, интеграции, спецформы
В Fabula слово «плагин» означает три разных механизма:
- Кнопки вкладки «Плагины» (
#main.Plugins) — полноценные iframe-приложения в зоне#supp. Конфиг:SYВкДп+GSExType=plugin. См. § ниже. setPlugin(url, firm, doc, mmid)— модальный диалог-iframe поверх заказа (счёт, оплата, печать, calc из строки…). Контекст в hash Base64:mmid;doc;docid;firm. Внешние http(s)/kontur открываются вwindow.open.add/exts/*.js— встроенные расширения ядра (1С, ЭДО, ККТ, маркировка), не кнопки вкладки.
Кнопки вкладки «Плагины» (toolbar)
#main.Plugins (без всей строки вкладок).
Где в UI
- Шестая «вкладка» в
TabsMainTitle: иконка hub + подпись Плагины (onclick=addMenu— мини-меню на узких экранах) + контейнер#main.Pluginsс кнопками-иконками. - Клик по кнопке →
SubTabs(this): выделяет кнопку, пишетProfile Main.subTab = URL, показывает#suppи вставляет<iframe src="URL">(подстановки[user]/[db]). - Первая кнопка «Закрыть все» — чистит iframe’ы и
subTab. - На ширине <800px блок
main.Pluginsскрывается (main.Resize); доступ через «Плагины» →addMenu.
Откуда берётся реестр
GandsExt на SYВкДп, GSExType = "plugin"
→ Fabula-tables.js funTbls:
db.tbl.plugins.rec.push({
Key: GSExID, // "SYВкДп"
Val: GSExName, // подпись (title картинки)
ImportName: formula(GSExAttr1), // URL
Ico: GSExAttr2, // путь или {icon8("…")}
Flag: GSExFlag // права / скрытие
})
→ SubTabs() строит кнопки из plugins.rec
Фильтры показа кнопки
| Условие | Эффект |
|---|---|
имя пустое или начинается с * (sEq0(Val,"*")) | не попадает в toolbar (скрытый/архивный плагин) |
Flag задан | кнопка только если db.isAdmin(Flag) (буквы Rights) |
| Flag пуст | видна всем |
Live well, User=140, Rights=A: на панели 9 плагинов (+ «Закрыть все»).
В SysExts всего 18 записей type=plugin; 9 скрыты префиксом * и/или флагом h.
Каталог well — видимые кнопки
| Подпись | URL (ImportName) | Flag | Назначение |
|---|---|---|---|
| Спецформа (встр.) | /add/sf/calc.html?[db] |
— | Калькулятор/анкеты продукции; основной встроенный calc в iframe-зоне supp |
| Файл-сервер | /add/sf/fs.html |
— | Файловый менеджер (макеты/документы по путям Pathes) |
| Задачи для водителей | /add/am |
— | АРМ водителя (доставка/полевые задачи) |
| Кабинет агента | /acc |
— | Агентский кабинет (accept / витрина агента) |
| Сборная печать | /add/sf/sborka.html?[db] |
SF | Раскладка/сборка печати; право S или F (сборка) |
| Атол ККТ | /add/sf/atol.html |
CFW | Консоль команд ККТ Атол; права касса/админ/склад |
| Интернет-магазин | https://zaprintom.ru?fabagentid={db.User} → после formula ≈ …=140 |
— | Внешняя витрина Zaprintom, привязка к агенту |
| Автопроверка макетов | http://192.168.3.152:4000/ |
— | Локальный сервис проверки макетов (интранет) |
| ФИС | /add/sf/fis.html |
— | Финансовая аналитика: баланс / прибыль / капитал / ОСВ деньги·покупатели… |
Скрытые в реестре (* / Flag h) — well
| Имя | URL | Заметка |
|---|---|---|
| *Препресс | /view? + Base64 путь к sborka170 | старый просмотр препресса |
| *Управление задачами | /jFabula/specforms/pm.html | легаси PM-форма |
| *Таблица заказов | …/page-proofs.html | легаси вёрстка |
| *Wiki-Well | /add/sf/wiki.html?WW | wiki |
| *АТС | /add/sf/ats.html | Flag h PVF — телефония |
| *Наружная реклама | …/narujka.html | отдельный контур OOH |
| *Сайт «Тильда» | http://bord.com.ru | внешний сайт |
| *Сайт «Очень хорошо» | http://www.vwell.biz | внешний сайт |
| *Тех. поддержка | /add/sf/forum.html?[db] | форум/help |
Как добавить / изменить кнопку
- В номенклатуре →
~SYSTEM→ ВКЛАДКИ → Дополнительно (SYВкДп). - Ext type
plugin: Name = подпись; Attr1 = URL (можно[db],[user], formula{db.User}); Attr2 = иконка (/path.pngили{icon8("name")}); Flag = буквы Rights или пусто; имя с*— скрыть с панели, оставить в данных. - Перезагрузка справочников / сессии → кнопка в
main.Plugins.
?[db] после подстановки становится ?well (имя БД).
Внешние http(s) в toolbar открываются внутри iframe supp (не через window.open —
в отличие от setPlugin("https://…") из заказа).
Отличие от setPlugin из заказа
| Кнопка toolbar | setPlugin(…) | |
|---|---|---|
| Контейнер | #supp на всю рабочую область | модальный .dialog поверх |
| Контекст doc/mmid | нет (форма сама берёт db/cookie) | hash Base64 с doc/firm/mmid |
| Источник URL | db.tbl.plugins / SYВкДп | код модуля, SpecForm, SysExts import, печать |
| Примеры | ФИС, Атол-консоль, fs, Zaprintom | bill, pay, docs.print, calc из строки |
Интеграции ядра (add/exts)
Подключаются из Fabula.ext.js (_require): edo, 1C, marka, kkt.
ЭП (ext.eds.js) подгружается лениво из ЭДО при локальной подписи.
Внешние HTTP чаще идут через серверный прокси /curl/… + Base64 curl-команды
(секреты в {Config.*} / Profile, не в клиентском git).
Карта «кто кого зовёт»
Fabula.ext.js ├─ ext.edo.js (_Astral) ← firms «Обновить ЭДО», bill/УПД, tasks │ └─ ext.eds.js (EDS) ← КриптоПро CAdES при signDocLocal ├─ ext.1C.js (_1C) ← иконка [1c] в документах/номенклатуре, ExportDoc ├─ ext.marka.js (Marka) ← ЧЗ/СУЗ, коды в Props, чек с КМ └─ ext.kkt.js (atol) ← Аванс/Отгрузка/возврат; Preview чека; atol.html
1С — ext.1C.js (_1C)
- Транспорт: OData REST 1С через
/curl; URL/ключ —{Config.1c-url},{Config.1c-key}(Basic). - Связка объектов: GUID в GandsExt
_GUID/ Companes.Code1C; на документе Property_1Cс тегами[1s]тип[/1s]. - Основные методы:
GUID— сверка номенклатуры по артикулу;viewCatalog/viewDoc— просмотр в UI;findCatalog(ИНН/КПП) /findDocument;ExportDoc/offDocument— выгрузка Реализация / Счёт на оплату;offMaterials,nextUPD,Connect,Catalog,Get. - UI: иконка 1С в разметке документа (
Fabula.js) →_1C.viewDoc/viewCatalog.
ЭДО Астрал — ext.edo.js (_Astral)
- API:
https://api.doc.astral.ru(боевой); тестовый/Fi —api.1cdocs.cloud.astral-dev.ru. - Ящики филиалов: formula
Astral.Doki→fil → gbID|orgID; токен в ProfileAstral-Doki/@astral.token. - Карточка фирмы: Property
_ЭДО.Астрал(контакты, приглашения, globalId); кнопка live «Обновить ЭДО: Астрал» →importFirm(counterparties/contacts, invitations in/out, globalIds по ИНН/КПП). - Документы: создание/отправка УПД и связанных пакетов, события в Talk,
проверки через formula (
chkEDO*,hasEDO,firmEDO,Diadoc.Kontur…). - Операторы ЭДО: справочник
providerEDO(~50 кодов 2xx: Контур, СБИС/Тензор, Такском, Калуга-Астрал, Сберключ…) — расшифровка ID оператора в UI. - Также подключается из
bill.js/bill2.js/tasks.js.
ЭП КриптоПро — ext.eds.js (EDS)
- Загрузка
/lib/cpro/cadesplugin_api.js; нужен Chrome-плагинcpcsp_chrome_nmcades. Init— Store сертификатов;getCert— выбор;signDoc— CAdES-BES (подпись времени + имя документа), attach/detach.- Вызов из ЭДО при локальной подписи исходящих пакетов; похожий код в
tasks.jsдля фоновых сценариев.
ККТ — ext.kkt.js (atol)
- Реестр касс:
db.tbl.KKTиз SysExts (имя → cfg JSON: server, users, Authorization…); live well ≈ 24 кассы (Фо*/Ел*/РР*, zaprintom.*, Тест-RBSoft/Онлайн, RB-*…). - Протоколы: Атол API (POST JSON + опрос uuid /
rePlay); Flag R → веткаatol.RBSoft; также VTB/QRM для эквайринговых чеков/refund. - Операции UI:
atol.KKT— Аванс / Отгрузка / возврат / закрытие смены;Build— шаблон чека из formula (kktTemplate,kktNDS,kktClient…); результат в Property_KKT;Preview/Show— просмотр + ссылка ОФД. - Консоль: плагин
/add/sf/atol.html— список команд,atol.Doна выбранной кассе. - Права: буква C; консоль toolbar — Flag CFW. Связь с маркировкой:
CheckMarks/[marka].
Маркировка / Честный знак — ext.marka.js (Marka)
- GTIN на номенклатуре (GandsExt
GTINпо филиалу); OMS/токены на Companes. - Коды в Property документа (тег
[marka]); сканерfromScaner. - СУЗ / True API: заказ кодов, буферы, utilisation, проверка в ЧЗ, печать КМ.
CreateDoc/CheckDoc— документы СУЗ из строк заказа;MarkaAtol— короткий код для чека.
Онлайн-оплаты и банк
Платёжная форма /pay — add/sf/pay.js
Открывается через setPlugin("/pay?doc=…") (docs, accept, am, tasks). Провайдеры:
| Ключ | Тип | Endpoint (prod) | Подпись |
|---|---|---|---|
| Robokassa | money | auth.robokassa.ru/… | SHA1 /getsha1, Config Robokassa-{fil}-Pwd |
| Uniteller | card | wpay.uniteller.ru | MD5, return → /hookpay |
| VTB / PayKeeper | vtb | {login}.server.paykeeper.ru | Basic Config |
| Best2Pay | b2p | pay.best2pay.net/webapi | MD5 |
| Rnkb | rnkb | mpi.rncb.ru | order JSON + hookpay |
| QRM | sbp | app.wapiserv.qrm.ooo | СБП |
hookpay.js — callback после оплаты: определяет провайдера по query, проверяет подпись,
проводит платёж/PartPay. Return URL-ориентир: https://bord.com.ru.
Импорт банка / эквайринг
- Меню импорта:
jf.MenuImport+ SysExts type import (SYВкПл…). - Шаблоны назначения:
db.tbl.Assigning(→ CodeOp + FirmPay). tasks.jsфоном обрабатывает Robokassa / Best2p / UniTel / CloudP / VTB / СБП и при необходимости чеки ККТ.
Спецформы add/sf (подробнее)
| Форма | Роль | Открытие | Заметки |
|---|---|---|---|
| calc | Калькулятор/анкета продукции | toolbar + setPlugin из docs | calc-fun.min.js |
| bill / bill2 | Счёт, оферта, УПД-контур | setPlugin / печать | тянет ext.edo.js; bill2 — упрощённый Start |
| pay / hookpay | Онлайн-оплата + callback | setPlugin /pay | см. § оплаты |
| accept → /acc | Кабинет агента | toolbar /acc | оплата, счёт, delivery |
| am → /add/am | АРМ водителя | toolbar | полевые задачи, оплата |
| arm-stock | АРМ склада | /add/stock | право W |
| sborka | Сборная печать | toolbar (SF) | читает parent main.Plugins |
| fis | Фин. аналитика | toolbar | Баланс / Прибыль / Капитал / ОСВ… |
| atol.html | Консоль ККТ | toolbar (CFW) | обёртка atol.Do |
| fs.html | Файл-сервер | toolbar | пути Pathes |
| tasks | Фоновые задания | служебно / SYСПКТФЗ | ККТ close, hook-оплаты, ЭП |
| forum / wiki / ats | поддержка, wiki, АТС | скрытые plugin * | в SYВкДп, не на панели |
| i-sprint / vizitka.* / ox.isprint | витрины / статусы | спец. URL | контур Zaprintom / интернет-заказов |
Конфиг интеграций (где крутить)
| Место | Что хранит |
|---|---|
| formula | Astral.Doki, kkt*, chkEDO*, PayCompany, шаблоны чеков/проверок |
| Config / ConfigLoc | 1c-url, 1c-key, пароли Robokassa/Uniteller/VTB по филиалу |
| Profile | токен Астрал; Касса / Эквайринг по Company |
| Companes Exts | Code1C, OMS, р/с+Attr2→KKT, подписи |
| SysExts SYВкДп | кнопки плагинов |
| providerEDO / Assigning / KKT | операторы ЭДО, шаблоны назначения платежа, кассы |
/curl — единая точка выхода; отладка почти всегда с лога curl в console.
12. Печать, отчёты и хитрые фильтры
Печать текущего документа
- Pipeline:
docs.Reports→setPlugin(docs.print.html)→dr/ DocsReports. - Список печатных форм: GandsExt на
SYВкОпОтсGSExType <> 'query'и именем без ведущего*(см.docs.print.jsthisQuery). - Шаблоны: jFabula/rep/; опции drep.* (гл/подч, MarkDoc, noCost, Stamp, Sum2, noNDS…).
- Экспорт: PDF
/load/pdf?, PNG/html2canvas, Excel, печать браузера.
Отчёты — узлы SYВк..От
Кодировка узлов
| Узел | Вкладка | ImportName вкладки | Live well |
|---|---|---|---|
SYВкОпОт | Заказы (docs) | docs | 35 записей (query + печать/договора/реестры) |
SYВкЗаОт | Задачи (pm) | pm | 14 query (ЗП, брак, макеты, склад…) |
SYВкПлОт | Деньги (money) | money | 28 query (поток, займы, ЗП, остатки…) |
SYВкКоОт | Контрагенты | firms | 4 query |
SYВкНоОт | Номенклатура | gands | 17 query (склад, 1С, formula Stat…) |
Два UI-канала
| Канал | Кнопка / вызов | Что берёт из SYВк*От |
|---|---|---|
| Печать документа | docs.Reports → docs.print |
Только SYВкОпОт, типы не query, имя без *:
Документы / Договора / Реестры / Служебные / ЧО |
| SQL-/аналитические отчёты | gf.LocalReports → localReport() (lib/wi.js) |
Все GSExType=query с текущей вкладки
(fa.getGands(Left(GSExID,6), ImportName) == main.Tabs.idx);
имя без ведущего * (если не admin) |
| Универсальный report UI | forms/reports.js (listGS) |
Все Exts узла (включая query), дерево по GSExType=группа |
Поля Ext отчёта
GSExType— группа в дереве: для печати «Документы», «Договора»…; для аналитики обычноquery.GSExName— подпись (+ опционально[ico]…[/ico]); ведущий*— скрыт в обычном меню.GSExAttr1(+ Attr2) — тело: URL шаблона/jFabula/rep/…,[file]…, SQL-шаблон с{opt(…)}/fa.getFilter, илиfunction (…) => ….GSExFlag— права (после снятия служебныхh/d): буквы Rights;dчасто = «динамический»/фильтр-aware;h— доп. скрытие в части меню.
Язык query-отчётов
{opt(1,"!Дата2") + opt("filter","Dates,CodeOp,Company,Firm,Agent")
,opt(2,"Незавершёнка"), …}
SELECT … FROM Moves/Docs …
{fa.getFilter("Dates","GSDt")} {fa.getFilter("Company")}
…
opt/formula собирают UI-переключатели и WHERE из глобального фильтра вкладки.
Результат гоняется через wiSql / wiReport.preRender (кнопка LocalReports).
Каталог well — печать (SYВкОпОт, не-query)
| Группа | Примеры |
|---|---|
| Документы | Счет, Акт выполненных работ, Заявка на приобретение, Лист заказа (*Счет на оплату — скрыт) |
| Договора | Поставка товара, Размещение наружной рекламы → [file][makets]/… |
| Реестры / Служебные | в основном * (скрыты) + Flag F |
| Частные объявления | ЧО. Реестр, ЧО. Экспорт |
Каталог well — query по вкладкам (видимые без *)
| Узел | Примеры отчётов |
|---|---|
| ОпОт | Обороты: Активность / Средний чек / Работы; Топливо; Списанные материалы; Марки на балансу; Стимулирование; Деление базы 2025… |
| ЗаОт | ЗП дизайнерам / сдельно / ОТК / транспорт; Брак; Макеты динамика/отменённые; Склад ГП; загрузка исполнителей |
| ПлОт | Деньги. Поток / Подотчет / Транзит / Инкассация / Депозиты; Займы.*; ЗП.*; RoboKassa; Остатки по счетам; движение по КОП |
| КоОт | Мёртвые клиенты; Ответственные; Рекламные компании |
| НоОт | Склад: Остатки / Инвентаризация / Фотоформы / Выгрузка; Листопроходы; Синхронизация с 1С; formula Stat; Марки… |
query2 → таблица db.tbl.localReport (отдельный канал); в общем SysExts
узлы SY%ХФ не грузятся (GSExID NOT LIKE 'SY%ХФ') — только через SmartFilter.
Хитрые фильтры — узлы SYВк..ХФ
Назначение
Не «отчёт на экран», а готовый SQL-предикат для списка текущей вкладки:
выбирается в комбо «Ещё…» / title «Хитрый фильтр» справа у prop-фильтра и добавляется в WHERE
(propFilter.getFilterSF() → AND к Filter вкладки).
Привязка код ↔ System
| Модуль | SmartFilterGS | Таблица кэша | Контейнер UI |
|---|---|---|---|
| docs | SYВкОпХФ | smFilterDoc | dpFilter.SM |
| pm | SYВкЗаХФ | smFilterPM | ppFilter.SM |
| money | SYВкПлХФ | smFilterMoney | mpFilter.SM |
| firms | SYВкКоХФ | smFilterFirm | fpFilter.SM |
| gands | SYВкНоХФ | smFilterGands | gpFilter.SM |
Реализация: wiPropFilter в lib/wi.combo.js.
Загрузка: SELECT … FROM GandsExt WHERE GSExID=… AND Left(Name,1)<>'*' AND Type<>'formula'.
Дерево: GSExType = группа (часто «[red]Ошибки[/red] …»), листья = пункты фильтра.
Как собирается WHERE
- Пользователь выбирает один/несколько пунктов в Tree-комбо SM (value через
;). getFilterSFдля каждого пункта берётFiltWhere= Attr1 (или Attr, если Flag содержитd).- Плейсхолдер
{input}→ prompt;**→%; затемformula(sf). - Модуль:
wh += AND (sf)вместе с обычным prop-фильтром (Свойство=Значение) и глобальнымmain.filter.
Счётчики [2]/[] в имени — live-статистика (funStat / CountSql модуля):
сколько записей попадёт под фильтр.
Каталог well — хитрые фильтры
| Узел | N | Группы / пункты |
|---|---|---|
| ОпХФ | 14 | Ошибки в оплате: можно слить оплаты, неправильный долг, ФИО ЧЛ, нет связи с платежом; в строках: не задан Товар/КОП/Дата, плохое подчинение; в шапке: затраты (подряд/проценты/деньги), N заявки, повтор свойств, пустые строки, сумма≠строки; + formula correctSumDoc (не в комбо Type≠formula) |
| ЗаХФ | 1 | Ошибки: Повторение свойств |
| ПлХФ | 8 | Задвоение номера; слить банк/кассу/проценты; неправильный остаток;
несовпадение контрагента/ФИО/филиала; плохой номер; + formula moneyMerge |
| КоХФ | 3 | Задвоение ИНН / Названия; «Не было движения» |
| НоХФ | 1 | Был отрицательный остаток |
formula на ХФ —
служебные правила (correctSumDoc, moneyMerge), не пункты комбо.
Как добавить отчёт или хитрый фильтр
- Печатная форма заказа: Ext на
SYВкОпОт, Type=«Документы» (или Договора…), Attr1=путь HTML/[file], без*в имени. - Аналитика вкладки: Ext на соответствующий
SYВк*От, Type=query, Attr1=SQL/{opt…}; Flag=буквы прав;*в имени — черновик/скрытый. - Хитрый фильтр: Ext на
SYВк*ХФ, Type=группа («Ошибки…»), Name=подпись [n], Attr1=SQL-условие по ключу списка (DocID / MMID / PayID / FirmID / GSID); без Type=formula.
13. Live UI (сессия БД well)
Проверено в браузере агента: http://localhost:9000/jFabula/db/well?reload=Y
(User=Миланин А.А., v.12-01). Загружается ~34 script-модуля (common/core/wi/Fabula/forms…).
Скриншоты сохранены в Fabula.doc.img/.




Заказы
- Список № / Фирма / Сумма / Долг / Затраты; глобальный фильтр (даты±архив, филиал, КОП, фирма, сотрудник, роль).
- Действия документа: создать / копировать·разделить / удалить; печать «Счёт», «Счёт на оплату (эксп)», «Ком предложение»; «Перевозки. Создать ЭПЭ».
- Подвкладки: Продукция (N), Операции, Оплаты, Затраты, Макеты; calc-строки, быстрые задачи, ККТ, пересчёт сумм.
- Пример:
Fi6pa00008(амортизация/техника, ~1.42 млн, 79 позиций продукции).
Задачи (PM)
- Плотная производственная лента: фазы, исполнители, даты+дни, история смены фаз, свойства/макеты.
- Типовой ассортимент live: рулонная этикетка, визитки, брошюры, пластиковые карты, баннер, таблички, ДТФ/сублимация, фотокниги, УПД ЭДО, доставка/курьер, проверка макета, предпечатка, ламинация, порезка…
- Бренд/канал в задачах: Zaprintom; счётчик порядка ∑ 155 391 301 / 5 287 634; пагинация «по 4000».
- Действия: «Создать задачу», «Проверка макета»; деталь задачи с Talk/историей и свойствами (пункт выдачи, слияние заявок, макеты PDF).
Деньги
- Фильтры Тип / начисл. / выдача; Приход / Расход / Остаток; «объединять»; поиск по № документа/задачи/платежа.
Контрагенты
- Создать фирму; поиск ИНН/ОГРН; юр. название/адрес; свойства; Excel/печать; «Обновить ЭДО: Астрал».
Номенклатура
- Дерево 1–4 уровней; отдельно корень ~SYSTEM (см. подробный §).
- Фильтры: группа/склад/флаги/расширения; стикер; загрузка файлов; остатки.
- Live-справочники касс/точек: ФоКасса-*, ФоПушкина-*, ФоСамокиша-*, ФоСклад, zaprintom.fo…
- Кнопки «Отладка Zaprintom», «Отладка спецформы».
Плагины (кнопки title → URL)
Краткий снимок live; полный разбор UI/конфига/скрытых — §11 кнопки «Плагины».
| Название | URL / путь | Flag |
|---|---|---|
| Спецформа (встр.) | /add/sf/calc.html?[db] | — |
| Файл-сервер | /add/sf/fs.html | — |
| Задачи для водителей | /add/am | — |
| Кабинет агента | /acc | — |
| Сборная печать | /add/sf/sborka.html?[db] | SF |
| Атол ККТ | /add/sf/atol.html | CFW |
| Интернет-магазин | https://zaprintom.ru?fabagentid={db.User} | — |
| Автопроверка макетов | http://192.168.3.152:4000/ | — |
| ФИС | /add/sf/fis.html | — |
14. Экосистема и развёртывание
| Приложение | URL / путь | Назначение |
|---|---|---|
| Фабула | /jFabula | Основной клиент |
| PM | /pm | Управление проектами (standalone) |
| АРМ водителя | /add/am | Мобильные/полевые задачи |
| Кабинет агента | /acc | Агентский кабинет |
| АРМ склада | /add/stock | Кладовщик |
| Сборная печать | /sb | Производство / раскладка |
| Спецформа calc | /add/sf/calc.html | Калькулятор |
| Интернет-магазин | :8000 | Витрина |
| Wiki-Well | /add/sf/wiki.html | База знаний |
| Файл-менеджер | /add/sf/fs.html | Файлы |
| Mobula | Mobula.apk | Android WebView-оболочка АРМ |
Мобильная версия: наличие и особенности
Короткий вердикт: отдельной «мобильной Фабулы» как переписанного responsive-клиента нет. Основной jFabula — толстый десктопный UI с узкими адаптациями под телефон/планшет. Реальная мобильная работа строится на отдельных АРМ (+ Android APK Mobula), а не на полном наборе вкладок docs/pm/money.
1. Что есть в основном клиенте (jFabula)
- Детектор
window.AA(lib/mi5.browser.js, также login): UA-sniff Android / iPhone / iPad / … При live-обходе в Pixel-эмуляцииAA === true. - Ширина окна:
WinSize()выставляет флагиw800/w1200/w1600иisVert(портрет). Адаптация идёт больше по ширине, чем по «это телефон». main.Resize(forms/main.js) приw800:- скрывает блок статуса
Status3; - скрывает ленту кнопок
#main.Plugins(плагины уходят в мини-менюaddMenuпо клику «…»); - укорачивает подписи вкладок (
sLeft(title2, 0)— фактически иконки без текста); - уменьшает именованные иконки (20px вместо 24).
- скрывает блок статуса
- Плагины / спецформы (
setPluginв Fabula.js): приAAiframe открывается на весь экран (left:0; top:0; width/height:100%), без десктопных 5%/80%. - PWA-заготовка: jFabula/manifest.json
(
display: standalone, иконки 48/96/512), в main.html —viewport,theme-color,apple-touch-icon, link на manifest. Service worker / offline-кэш в коде не подтверждены → «добавить на экран» возможно, автономной работы нет.
2. Чего нет
- Нет отдельного mobile-роута / мобильного CSS-лейаута модулей docs/pm/money/firms/gands.
- Нет touch-first навигации, карточных списков вместо гридов, жестов — UI остаётся табличным.
- На узком экране полный ops-контур формально открывается, но practically неудобен (горизонтальный скролл таблиц, мелкие контролы).
3. Настоящий мобильный контур = АРМ + APK
| Канал | Где | Особенности |
|---|---|---|
| АРМ водителя | /add/am, add/sf/am.html + am.js |
Упрощённый UI задач/гео; в Start принудительно window.AA = 1.
Флаг isMobula: !!window.AndroidFunction — мост в нативную оболочку. |
| АРМ склада | плагин → arm-stock.html / /add/stock |
Складские операции на планшете/терминале, не полный jFabula. |
| Кабинет агента | /acc |
Отдельное лёгкое приложение агента. |
| Mobula.apk | раздача с index.html → /downloads/Mobula.apk |
Android-клиент под полевые АРМ (WebView + AndroidFunction).
Рядом опционально Browser APK; GeoFabula/fabula.apk в раздаче закомментированы. |
| Плагины из основной Фабулы | кнопки «Задачи для водителей», склад и т.п. (SYВкДп) |
С десктопа можно открыть мобильный АРМ в iframe/вкладке supp; на телефоне — fullscreen при AA. |
4. Практическая модель использования
Офис / широкий экран → полный jFabula (docs, pm, money, firms, gands, SYSTEM) Узкий браузер → тот же jFabula + ужатие shell (w800); полный учёт «на коленке» Поле / склад / агент → /add/am, arm-stock, /acc ± Mobula.apk (AndroidFunction)
Итог для внедрения: мобильность — это линейка узких АРМ и оболочка Mobula, а не паритет функций с десктопной Фабулой. PWA-манифест — задел «иконка на домашний экран», не offline-ERP.
15. Сквозные сценарии
Заказ → оплата → чек
DocsNew (SYОП*) → NewItem/calc строки → статус Wk → docs.pay AutoPay/ForcePay → PartPay → atol.KKT (Аванс/Отгрузка) → Property _KKT → печать Счёта/АВР
Строка → задача PM
Movement + MMFlag → docs.move.toPM / goLink(pm, MMID) → фазы, Talk, сигналы → goLink(docs, doc&mmid)
Импорт банка → разнесение
MenuImport → importMoney.fun_* → Bank/Cash → money.pay.payDoc → PartPay → CorrectMoney
Плагин из документа
SpecForm / Bill / calc / внешний URL → setPlugin(form, firm, doc, mmid) → iframe Start()
16. Ключевые файлы и символы
| Символ | Файл | Роль |
|---|---|---|
| jf / jFabula | Fabula.js | Доменный фасад, плагины, Mode0, goLink |
| fa | fabula.min.js | Контекст Doc/Move/Cur/Props |
| db_Client | lib/db.js | Query, справочники, Profile, isAdmin, ws |
| wi / uiTable | lib/wi.* | UI-контролы и гриды |
| formula | GandsExt | Runtime-конфиг из БД |
| main.Start | forms/main.js | Bootstrap вкладок и фильтра |
| setPlugin | Fabula.js | Запуск спецформ/плагинов |
| docs / pm / money / firms / gands | forms/* | Основные модули UI |
| atol | ext.kkt.js | ККТ |
17. Ограничения разбора
- Полный справочник Status и семантика OK/Bl кроме lock/unlock выведены из ветвлений кода.
- Полный список банков импорта и URL плагинов живут в данных БД (GandsExt), не в JS.
- Буквы U/P/T вне узких мест слабо задокументированы.
money.setConfig→configDocsвыглядит как легаси/баг.- Ветка
fa.Propsдля gands может ссылаться на необъявленный props. - Service worker / полноценный offline PWA не подтверждён.
18. Преимущества и недостатки текущего проекта
Оценка по коду + live-сессии well. Это зрелая отраслевая система «под производство», а не зелёный greenfield-продукт.
Преимущества
- Полный операционный контур в одном клиенте: заказ → строки/калькулятор → фазы производства (PM) → оплаты/ККТ → печать/ЭДО.
- Глубокая предметная модель Docs/Movement/Property/PartPay закрывает сложные полиграфические и сервисные сценарии (материалы, работы, подряд, макеты, доставка).
- Расширяемость без переписывания ядра: плагины iframe, спецформы, formula/GandsExt, SysExts — бизнес-правила часто в данных, не только в коде.
- Гибрид SaaS + локальная БД (AwwS) — ответ на требования по связи и хранению данных у заказчика.
- Экосистема АРМ: водитель, склад, агент, сборка, магазин, Mobula, автопроверка макетов, ФИС.
- Интеграции «в бою»: 1С, Астрал ЭДО, КриптоПро, Атол ККТ, маркировка, онлайн-оплаты, импорт банков.
- Права-теги и Profile позволяют тонко резать UI/операции по ролям без отдельных приложений.
- Долгая эксплуатация (2013–2025) и живая нагрузка: тысячи задач, крупные суммы, многофилиальные кассы.
- Толстый клиент: после прогрева справочников работа с фильтрами/таблицами отзывчива; часть логики не ждёт round-trip на каждое действие.
Недостатки
- Устаревший фронтенд-стек: vanilla JS, Windows-1251, декларативный HTML+eval-паттерны, нет современного фреймворка/типизации — высокий порог входа для новых разработчиков.
- Монолитные файлы (docs.js / Fabula.js / money.js на тысячи строк) усложняют тестирование, ревью и безопасный рефакторинг.
- UI «десктоп 2000-х» в браузере: плотные таблицы, сокращённые подписи вкладок, слабая мобильная адаптация основного shell (отдельные АРМ компенсируют частично).
- Скрытая конфигурация в БД (formula, plugins URL, права-буквы) — поведение системы трудно воспроизвести «из git»; документация прав неполная.
- Техдолг и легаси-ловушки: закомментированный UI, подозрительные ветки (money→configDocs), мёртвый/хрупкий код, eval/sEval, Base64-контексты плагинов.
- Безопасность/современные практики: Sha1 пароля, cookie-auth модели эпохи, смешение SQL на клиенте — требует осторожности при публикации в открытый интернет.
- Наблюдаемость и качество: нет явного слоя автотестов/CI в клиенте; отладка через console/«Отладка Zaprintom»; регрессии ловятся вручную.
- Масштабирование команды: знания «в голове автора» и в формулах БД; онбординг дорогой.
- PWA/offline заявлены слабо: manifest есть, полноценный offline не подтверждён; зависимость от доступности сервера/прокси.
- Плотность live-UI (пагинация по 4000, огромные гриды) — риск деградации на слабых машинах/сетях без жёсткого paging/virtualization.
Итоговая оценка
Сильная сторона — соответствие реальному производственному процессу (полиграфия/реклама) и богатство интеграций. Слабая сторона — стоимость сопровождения и эволюции из‑за толстого legacy-клиента и конфигурации «в данных». Рациональная стратегия: не «переписать всё», а окантовывать ядро (спецформы/плагины/API), постепенно выносить горячие модули, фиксировать formula/права в репозитории и наращивать регрессионные сценарии по заказу→PM→оплате.