@haiiro/docuflow 0.0.12 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +41 -9
  2. package/bin/install.mjs +69 -3
  3. package/manifest.json +114 -18
  4. package/package.json +6 -3
  5. package/public/app/docflow-app.css +2 -0
  6. package/public/app/docflow-app.js +95 -0
  7. package/src/front-components/docflow-documents.front-component.mjs +41 -41
  8. package/src/front-components/docflow-documents.front-component.tsx +49 -32
  9. package/src/front-components/docflow-processes.front-component.mjs +34 -34
  10. package/src/front-components/docflow-processes.front-component.tsx +24 -11
  11. package/src/front-components/docflow-tasks.front-component.mjs +40 -39
  12. package/src/front-components/docflow-tasks.front-component.tsx +19 -14
  13. package/src/front-components/launch-process.front-component.mjs +75 -0
  14. package/src/front-components/launch-process.front-component.tsx +270 -0
  15. package/src/front-components/process-steps.front-component.mjs +26 -26
  16. package/src/front-components/process-steps.front-component.tsx +56 -10
  17. package/src/front-components/task-form.front-component.mjs +45 -44
  18. package/src/front-components/task-form.front-component.tsx +12 -1
  19. package/src/logic-functions/bitrix-app.logic-function.mjs +186 -88
  20. package/src/logic-functions/bitrix-app.logic-function.ts +24 -61
  21. package/src/logic-functions/bitrix-event.logic-function.mjs +22 -1
  22. package/src/logic-functions/bitrix-event.logic-function.ts +2 -2
  23. package/src/logic-functions/bitrix-install.logic-function.mjs +26 -12
  24. package/src/logic-functions/bitrix-install.logic-function.ts +2 -5
  25. package/src/logic-functions/complete-task.logic-function.mjs +22 -1
  26. package/src/logic-functions/complete-task.logic-function.ts +2 -2
  27. package/src/logic-functions/docflow-app-session.logic-function.mjs +60064 -0
  28. package/src/logic-functions/docflow-app-session.logic-function.ts +54 -0
  29. package/src/logic-functions/docflow-app.logic-function.mjs +60149 -0
  30. package/src/logic-functions/docflow-app.logic-function.ts +38 -0
  31. package/src/logic-functions/launch-process.logic-function.mjs +134 -40
  32. package/src/logic-functions/launch-process.logic-function.ts +85 -24
  33. package/src/logic-functions/publish-process.logic-function.mjs +32 -11
  34. package/src/logic-functions/publish-process.logic-function.ts +8 -4
  35. package/src/logic-functions/save-launch-fields.logic-function.mjs +194 -17
  36. package/src/logic-functions/save-launch-fields.logic-function.ts +26 -8
  37. package/src/logic-functions/save-step-settings.logic-function.mjs +24 -2
  38. package/src/logic-functions/save-step-settings.logic-function.ts +2 -2
  39. package/src/logic-functions/save-task-form.logic-function.mjs +22 -1
  40. package/src/logic-functions/save-task-form.logic-function.ts +2 -2
package/README.md CHANGED
@@ -14,11 +14,13 @@
14
14
  | Панель задания | вкладки «Задание» (поля и ход) и «Чат», если стоит `@haiiro/chats`: переписка задачи с меню сообщения, как в «Чатах» |
15
15
  | Карточка задачи | вкладка «Задание»: инструкция, поля задания (собрать конструктором, заполнить), «Выполнить» |
16
16
  | Карточка процесса | кнопка «Параметры запуска» вверху (боковая панель): параметры запуска (конструктор полей) и, для шагов «Человеческий ввод» черновика, кто выполняет, срок в днях, обязательные поля; у каждого поля видна переменная, которой его читают следующие шаги |
17
- | Редактор процесса | первый блок «Запуск с параметрами» (ставится сам): параметры, заполненные перед запуском, — его переменные |
17
+ | Редактор процесса | первый блок «Запуск с параметрами» (ставится сам): параметры, заполненные перед запуском, и запись, на которой запустили, — его переменные |
18
+ | Командное меню | «Запустить процесс» (Cmd+K и меню выбранных записей любого объекта): выбор процесса, форма параметров в боковой панели, «Запустить»; запуск открывается в боковой панели, как штатный ручной |
18
19
  | «Процессы» | процессы с ручным запуском раздела «Документооборот»; форма параметров до запуска, «Запустить», «Создать», «Изменить процесс» |
19
20
  | «Документы» | папки, фильтры, поиск по названию и номеру, документ с реквизитами (тип, номер, дата, срок действия, контрагент, описание), файл в поле «Файл» карточки, карточка с источником |
20
21
  | Автоматически | шаг «Человеческий ввод» процесса становится задачей; её выполнение продолжает процесс; файл, приложенный к любой записи, копируется в документы с отметкой, кто, когда и куда его добавил |
21
- | Битрикс24 | страница приложения в портале со списком открытых заданий сотрудника и ссылками в CRM; уведомление исполнителю нового задания |
22
+ | Отдельная страница | `https://<адрес CRM>/s/docflow/app`: «Задания», «Процессы», «Документы» без остальной CRM, вход — тот же, что в CRM |
23
+ | Битрикс24 | та же страница внутри приложения портала, вход через CRM в отдельном окне; уведомление исполнителю нового задания |
22
24
 
23
25
  ## Данные
24
26
 
@@ -42,7 +44,9 @@ npx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ
42
44
 
43
45
  Установщик загружает в CRM опубликованный архив этой версии пакета и устанавливает приложение
44
46
  (как `twenty app:install`), доступ к серверу и его настройки не нужны. Конкретная версия:
45
- `--version 0.0.8`.
47
+ `--version 0.0.8`. Пакет собран под Twenty 2.45: на другой минорной версии установщик
48
+ предупреждает, на другой мажорной останавливается (`--force` — ставить всё равно). После установки
49
+ он сверяет версию в CRM: CRM не ставит версию ниже уже загруженной и говорит об этом прямо.
46
50
 
47
51
  Из исходников (для разработки): `node scripts/reinstall.mjs docuflow --local` в корне репозитория
48
52
  (нужны `CRM_URL` и `CRM_API_KEY` в `.env`).
@@ -52,7 +56,7 @@ npx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ
52
56
  | Переменная | Что указать |
53
57
  |---|---|
54
58
  | `DOCFLOW_ENGINE` | `APP` |
55
- | `CRM_PUBLIC_URL` | адрес CRM компании, например `https://acme.example.ru`; по нему строятся ссылки из Битрикс24 |
59
+ | `CRM_PUBLIC_URL` | адрес CRM компании, например `https://acme.example.ru`; по нему строятся ссылки в CRM с отдельной страницы и из Битрикс24 |
56
60
  | `BITRIX_CLIENT_ID`, `BITRIX_CLIENT_SECRET` | из карточки локального приложения портала; без них Битрикс24 не подключается, остальное работает |
57
61
 
58
62
  **Права людей.** Отвечать на шаг запущенного процесса может только тот, у кого есть право
@@ -69,12 +73,17 @@ npx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ
69
73
  (текст, число, дата, сотрудник, компания, контакт, сделка), обязательность. «Сохранить
70
74
  параметры» делает первым блоком черновика «Запуск с параметрами»: в следующих шагах параметры
71
75
  выбираются как его переменные `{{trigger.<поле>}}` — например «Запуск с параметрами →
72
- Сотрудник → Id» в поле «Исполнитель» задачи. Без параметров процесс начинается с обычного
73
- «Запуск вручную». Опубликуйте процесс. Параметры заполняются в «Процессах» до запуска;
74
- обязательные проверяются и на странице, и на сервере.
76
+ Сотрудник → Id» в поле «Исполнитель» задачи. «Где запускать» — «Откуда угодно, без записи» или
77
+ «На записи: <объект>»: тогда процесс запускают на выбранных записях этого объекта, по запуску
78
+ на каждую, а запись — переменная `{{trigger.record}}` с полями объекта (как у штатного запуска
79
+ вручную на записи). Без параметров и записи процесс начинается с обычного «Запуск вручную».
80
+ Опубликуйте процесс. Запускают его командой «Запустить процесс»: из Cmd+K — процессы без
81
+ записи, на выбранных записях — процессы их объекта и процессы без записи. Процессы без записи
82
+ запускаются и со страницы «Процессы». Обязательные параметры проверяются и в форме, и на сервере.
75
83
 
76
84
  Устройство: своих типов триггеров у приложений Twenty нет, а у «Запуск вручную» редактор
77
- показывает только свои переменные. Поэтому «Запуск с параметрами» — штатный триггер Webhook
85
+ показывает только свои переменные. Штатный пункт меню ручного запуска запускает процесс сразу,
86
+ без формы, и встроиться в него приложение не может. Поэтому «Запуск с параметрами» — штатный триггер Webhook
78
87
  (POST, только с ключом API), поля параметров — его тело. Документооборот запускает такую версию
79
88
  сам; внешняя система (например, мост в Битрикс24) может запустить процесс POST-запросом на адрес
80
89
  вебхука с ключом API и телом из этих полей — тогда проверку обязательных полей делает она.
@@ -116,6 +125,18 @@ npx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ
116
125
  до публикации нового черновика получает новые поля, а переменные убранных полей в ней пусты.
117
126
  - Документ без файла создаётся раньше файла: если закрыть карточку, не прикрепив файл, документ
118
127
  останется с пустым полем «Файл».
128
+ - На отдельной странице и в Битрикс24 карточка записи (задачи, документа, процесса) открывается в
129
+ CRM в новой вкладке: боковой панели CRM там нет. Файл документа прикрепляется там же.
130
+ - Отдельная страница выглядит как штатный Twenty (светлая или тёмная тема по настройке системы):
131
+ скин `@haiiro/interface` на неё не действует.
132
+
133
+ ## Отдельная страница
134
+
135
+ `https://<адрес CRM>/s/docflow/app` — документооборот без остальной CRM: шапка с разделами «Задания»,
136
+ «Процессы», «Документы», кнопки «На весь экран» и «Открыть CRM». Раздел при открытии —
137
+ `?section=processes` или `?section=documents`. Это те же страницы, что в папке «Документооборот»
138
+ сайдбара, с теми же правами: страница работает от имени сотрудника, вошедшего в CRM в этом
139
+ браузере. Если вход не выполнен, она предлагает войти в CRM в соседней вкладке и открывается сама.
119
140
 
120
141
  ## Битрикс24
121
142
 
@@ -137,17 +158,28 @@ npx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ
137
158
  создаётся сам (нужна включённая публичная ссылка-приглашение в «Настройки → Участники») с той же
138
159
  почтой и ФИО из Битрикс24.
139
160
 
161
+ **Вход.** В портале открывается отдельная страница документооборота. Сессия CRM во фрейме портала
162
+ не работает (браузер не отдаёт cookie CRM чужому сайту), поэтому при первом открытии страница
163
+ просит «Войти через CRM»: открывается окно на адресе CRM, оно берёт вход сотрудника в CRM (если его
164
+ нет — ждёт, пока сотрудник войдёт в CRM в соседней вкладке), передаёт его во фрейм и закрывается.
165
+ Дальше страница работает с токеном этого сотрудника (его права в CRM, 30 минут) и сама продлевает
166
+ его, пока открыта; токен хранится в хранилище браузера только для этого портала. Если приложение не
167
+ открывали дольше получаса, «Войти через CRM» нажимают снова — при живом входе в CRM окно закроется
168
+ само. Если в CRM в этом браузере вошёл не тот сотрудник, что в Битрикс24, страница предупреждает.
169
+ Страница работает только во фрейме привязанного портала.
170
+
140
171
  ## Разработка
141
172
 
142
173
  ```bash
143
174
  yarn app dev # следит за src/ и синхронизирует с сервером
144
175
  yarn app dev:function:logs
176
+ yarn build:app # отдельная страница: public/app (yarn build делает это сам)
145
177
  yarn test && yarn typecheck && yarn lint
146
178
  ```
147
179
 
148
180
  Устройство `src/`: `shared/` — общий код (формы, процессы, фильтры REST, Битрикс24); `server/` —
149
181
  обращения к записям и движку процессов из функций; `logic-functions/`; `front/` и
150
- `front-components/` — интерфейс; `objects/`, `fields/`, `views/`, `roles/`, `page-layouts/`,
182
+ `front-components/` — интерфейс; `standalone/` — отдельная страница (те же страницы вне CRM); `objects/`, `fields/`, `views/`, `roles/`, `page-layouts/`,
151
183
  `navigation-menu-items/` — данные и раскладка. Записи читаются и пишутся только через REST API
152
184
  (`server/records.ts`, `front/api.ts`), движок процессов — через две мутации GraphQL
153
185
  (`server/workflow-engine.ts`, `server/launch-step.ts`): при смене версии платформы сверять эти
package/bin/install.mjs CHANGED
@@ -32,6 +32,8 @@ const readOptions = (args) => {
32
32
  options[key.slice(2)] = inlineValue ?? args[++index];
33
33
  } else if (key === '--help' || key === '-h') {
34
34
  options.help = true;
35
+ } else if (key === '--force') {
36
+ options.force = true;
35
37
  } else if (key !== 'install') {
36
38
  fail(`Неизвестный параметр ${key}`);
37
39
  }
@@ -42,6 +44,7 @@ const readOptions = (args) => {
42
44
  apiKey: options['api-key'] ?? process.env.CRM_API_KEY,
43
45
  version: options.version ?? packageJson.version,
44
46
  help: options.help === true,
47
+ force: options.force === true,
45
48
  };
46
49
  };
47
50
 
@@ -55,6 +58,7 @@ ${packageJson.description}
55
58
  --url адрес CRM (или переменная CRM_URL)
56
59
  --api-key ключ API администратора, «Настройки → API и вебхуки» (или CRM_API_KEY)
57
60
  --version версия пакета, по умолчанию ${packageJson.version}
61
+ --force ставить и на версию Twenty, с которой пакет не проверялся
58
62
  `);
59
63
 
60
64
  const callMetadataApi = async ({ url, apiKey }, query, variables) => {
@@ -73,7 +77,7 @@ const callMetadataApi = async ({ url, apiKey }, query, variables) => {
73
77
  const body = await response.json().catch(() => undefined);
74
78
  const [firstError] = body?.errors ?? [];
75
79
 
76
- if (response.status === 401 || firstError?.extensions?.code === 'UNAUTHENTICATED') {
80
+ if (response.status === 401 || ['UNAUTHENTICATED', 'FORBIDDEN'].includes(firstError?.extensions?.code)) {
77
81
  fail('CRM не приняла ключ API: проверьте ключ и что он создан в этой компании');
78
82
  }
79
83
 
@@ -97,7 +101,7 @@ class CrmApiError extends Error {
97
101
  // This version's archive was uploaded to the CRM before (also before an
98
102
  // uninstall): the server keeps it and installs from that copy.
99
103
  get isAlreadyDeployed() {
100
- return /not higher than the currently deployed/i.test(`${this.message} ${this.rawMessage}`);
104
+ return /(not|must be) higher than the currently deployed/i.test(`${this.message} ${this.rawMessage}`);
101
105
  }
102
106
 
103
107
  // The app was installed from the marketplace on this CRM: the server keeps
@@ -155,10 +159,44 @@ const downloadPackageTarball = async (version) => {
155
159
  return Buffer.from(await tarballResponse.arrayBuffer());
156
160
  };
157
161
 
162
+ // The package is built and checked against one Twenty release (the
163
+ // twenty-sdk it is built with). Another minor usually works, so it only
164
+ // warns; another major stops the install unless --force is given.
165
+ const checkServerVersion = async ({ url }, force) => {
166
+ const builtFor = packageJson.devDependencies?.['twenty-sdk'];
167
+ const response = await fetch(`${url}/client-config`).catch(() => null);
168
+ const serverVersion = response?.ok
169
+ ? String((await response.json().catch(() => ({}))).appVersion ?? '').replace(/^v/, '')
170
+ : '';
171
+
172
+ if (builtFor === undefined || !/^\d+\.\d+/.test(serverVersion)) {
173
+ console.log('→ Версию Twenty узнать не удалось, проверку версии пропускаю');
174
+
175
+ return;
176
+ }
177
+
178
+ const [serverMajor, serverMinor] = serverVersion.split('.').map(Number);
179
+ const [builtMajor, builtMinor] = builtFor.split('.').map(Number);
180
+
181
+ if (serverMajor === builtMajor && serverMinor === builtMinor) {
182
+ return;
183
+ }
184
+
185
+ const message = `Пакет собран и проверен на Twenty ${builtMajor}.${builtMinor}, а у CRM ${serverVersion}`;
186
+
187
+ if (serverMajor !== builtMajor && !force) {
188
+ fail(`${message}. Поставьте версию пакета для своей Twenty или повторите с --force`);
189
+ }
190
+
191
+ console.log(`⚠ ${message}: часть возможностей может работать иначе`);
192
+ };
193
+
158
194
  const install = async (options) => {
159
195
  const connection = { url: options.url.replace(/\/+$/, ''), apiKey: options.apiKey };
160
196
  const label = `${packageJson.name}@${options.version}`;
161
197
 
198
+ await checkServerVersion(connection, options.force);
199
+
162
200
  console.log(`→ Скачиваю ${label}`);
163
201
  const tarball = await downloadPackageTarball(options.version);
164
202
 
@@ -192,18 +230,46 @@ const install = async (options) => {
192
230
  { universalIdentifier: manifest.application.universalIdentifier, version: options.version },
193
231
  );
194
232
  } catch (error) {
195
- if (!(error instanceof CrmApiError) || !/already installed/i.test(`${error.message} ${error.rawMessage}`)) {
233
+ const reason = error instanceof CrmApiError ? `${error.message} ${error.rawMessage}` : '';
234
+
235
+ // A newer version stands in the CRM: the platform refuses to go back
236
+ if (/downgrad/i.test(reason)) {
237
+ fail(`В CRM уже стоит версия новее ${options.version}. Поставьте последнюю: npx ${packageJson.name}@latest install`);
238
+ }
239
+
240
+ if (!/is already installed in this workspace/i.test(reason)) {
196
241
  throw error;
197
242
  }
198
243
 
244
+ await checkInstalledVersion(connection, options.version);
199
245
  console.log(`\n✓ ${label} уже установлен в этой CRM.\n`);
200
246
 
201
247
  return;
202
248
  }
203
249
 
250
+ await checkInstalledVersion(connection, options.version);
204
251
  console.log(`\n✓ ${label} установлен. Обновите страницу CRM.\n`);
205
252
  };
206
253
 
254
+ // The CRM keeps the highest archive it was given and installs that one when
255
+ // an older archive is refused, answering as if all went well: what stands in
256
+ // the CRM is checked after the install.
257
+ const checkInstalledVersion = async (connection, version) => {
258
+ const { findManyApplications } = await callMetadataApi(
259
+ connection,
260
+ `query FindManyApplications { findManyApplications { universalIdentifier version } }`,
261
+ );
262
+ const installed = findManyApplications.find(
263
+ (application) => application.universalIdentifier === manifest.application.universalIdentifier,
264
+ );
265
+
266
+ if (installed?.version !== version) {
267
+ fail(
268
+ `В CRM стоит ${installed?.version ?? 'не та версия'}, а не ${version}: CRM не ставит версию ниже уже загруженной. Поставьте последнюю: npx ${packageJson.name}@latest install`,
269
+ );
270
+ }
271
+ };
272
+
207
273
  const uploadArchive = async (connection, label, tarball) => {
208
274
  const { createFileUpload } = await callMetadataApi(
209
275
  connection,
package/manifest.json CHANGED
@@ -47,9 +47,9 @@
47
47
  }
48
48
  },
49
49
  "defaultRoleUniversalIdentifier": "26b1dde8-4ed9-4f39-8516-e0dcb734ea5a",
50
- "aboutDescription": "# Документооборот (`@crm-nordiv/docuflow`)\n\nЗадания, процессы и документы компании в одном разделе. Ставится в CRM как приложение, без правок\nсервера.\n\n- universalIdentifier: `0b7d5d2e-8c4f-4a59-9a43-2f6f1c3e9d21`\n\n## Что получается после установки\n\n| Где | Что |\n|---|---|\n| Сайдбар | папка «Документооборот» с пунктами «Задания», «Процессы», «Документы» — у каждого своя страница |\n| «Задания» | задачи раздела «Документооборот»; фильтры «Открытые / Мои / Просроченные / Выполненные / Архив» (архив — удалённые, со штатным «Восстановить»), поиск, создание задания с инструкцией и полями для заполнения |\n| Панель задания | вкладки «Задание» (поля и ход) и «Чат», если стоит `@haiiro/chats`: переписка задачи с меню сообщения, как в «Чатах» |\n| Карточка задачи | вкладка «Задание»: инструкция, поля задания (собрать конструктором, заполнить), «Выполнить» |\n| Карточка процесса | кнопка «Параметры запуска» вверху (боковая панель): параметры запуска (конструктор полей) и, для шагов «Человеческий ввод» черновика, кто выполняет, срок в днях, обязательные поля; у каждого поля видна переменная, которой его читают следующие шаги |\n| Редактор процесса | первый блок «Запуск с параметрами» (ставится сам): параметры, заполненные перед запуском, — его переменные |\n| «Процессы» | процессы с ручным запуском раздела «Документооборот»; форма параметров до запуска, «Запустить», «Создать», «Изменить процесс» |\n| «Документы» | папки, фильтры, поиск по названию и номеру, документ с реквизитами (тип, номер, дата, срок действия, контрагент, описание), файл в поле «Файл» карточки, карточка с источником |\n| Автоматически | шаг «Человеческий ввод» процесса становится задачей; её выполнение продолжает процесс; файл, приложенный к любой записи, копируется в документы с отметкой, кто, когда и куда его добавил |\n| Битрикс24 | страница приложения в портале со списком открытых заданий сотрудника и ссылками в CRM; уведомление исполнителю нового задания |\n\n## Данные\n\n| Объект | Поля |\n|---|---|\n| `smbDocument` (новый) | название, файл, тип, номер, дата, действует до, контрагент (компания), описание, статус, автор, ответственный, папка; источник: `origin`, `sourceObjectName`, `sourceRecordId`, `sourceRecordName`, `sourceFileId`, `workflowRunId` |\n| `smbDocumentFolder` (новый) | название, цвет, родительская папка |\n| `workflow` | `smbSection` «Раздел»: CRM / Документооборот; `smbLaunchFields` «Параметры запуска» — поля, которые заполняют перед запуском |\n| `task` | `smbSection`, `smbInstruction` «Инструкция»; `smbFormSchema`, `smbFormValues` — поля задания; `smbWorkflowRunId`, `smbWorkflowStepId`, `smbWorkflowThreadId` — связь с шагом процесса |\n| `company` | `smbDocuments` — документы контрагента |\n| роли | «Документооборот: функции приложения» (права функций), «Документооборот: участник процессов» (для людей, см. ниже) |\n\n## Установка\n\nС любого компьютера с Node.js 20+, нужен только адрес CRM и ключ API администратора\n(«Настройки → API и вебхуки → Создать ключ»). Повторный запуск ставит новую версию:\n\n```bash\nnpx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ>\n```\n\nУстановщик загружает в CRM опубликованный архив этой версии пакета и устанавливает приложение\n(как `twenty app:install`), доступ к серверу и его настройки не нужны. Конкретная версия:\n`--version 0.0.8`.\n\nИз исходников (для разработки): `node scripts/reinstall.mjs docuflow --local` в корне репозитория\n(нужны `CRM_URL` и `CRM_API_KEY` в `.env`).\n\nЗатем в «Настройки → Приложения → Документооборот» заполнить переменные:\n\n| Переменная | Что указать |\n|---|---|\n| `DOCFLOW_ENGINE` | `APP` |\n| `CRM_PUBLIC_URL` | адрес CRM компании, например `https://acme.example.ru`; по нему строятся ссылки из Битрикс24 |\n| `BITRIX_CLIENT_ID`, `BITRIX_CLIENT_SECRET` | из карточки локального приложения портала; без них Битрикс24 не подключается, остальное работает |\n\n**Права людей.** Отвечать на шаг запущенного процесса может только тот, у кого есть право\n«Рабочие процессы». Кто выполняет задания процессов или запускает процессы с параметрами,\nполучает роль «Документооборот: участник процессов» или это право в своей роли. Право также\nпозволяет менять процессы: давайте его тем, кому это допустимо. Обычные задания и документы\nправа «Рабочие процессы» не требуют.\n\n## Как пользоваться\n\n- **Процесс.** «Процессы → Создать» создаёт процесс с ручным запуском в разделе «Документооборот» и\n открывает редактор. Существующий процесс переносится в документооборот полем «Раздел».\n- **Параметры запуска.** Кнопка процесса «Параметры запуска» → «Добавить поле»: название, тип\n (текст, число, дата, сотрудник, компания, контакт, сделка), обязательность. «Сохранить\n параметры» делает первым блоком черновика «Запуск с параметрами»: в следующих шагах параметры\n выбираются как его переменные `{{trigger.<поле>}}` — например «Запуск с параметрами →\n Сотрудник → Id» в поле «Исполнитель» задачи. Без параметров процесс начинается с обычного\n «Запуск вручную». Опубликуйте процесс. Параметры заполняются в «Процессах» до запуска;\n обязательные проверяются и на странице, и на сервере.\n\n Устройство: своих типов триггеров у приложений Twenty нет, а у «Запуск вручную» редактор\n показывает только свои переменные. Поэтому «Запуск с параметрами» — штатный триггер Webhook\n (POST, только с ключом API), поля параметров — его тело. Документооборот запускает такую версию\n сам; внешняя система (например, мост в Битрикс24) может запустить процесс POST-запросом на адрес\n вебхука с ключом API и телом из этих полей — тогда проверку обязательных полей делает она.\n Шаг «Параметры запуска» процессов из 0.0.6 и раньше при первом сохранении параметров убирается,\n его переменные в следующих шагах переводятся на `trigger`.\n- **Задание шага.** Шаг «Человеческий ввод» становится задачей раздела процесса: у исполнителя\n из «Параметров запуска», без него — у запустившего. Поля задания — поля шага из редактора.\n «Выполнить» проверяет обязательные поля и продолжает процесс; значения дальше читаются\n переменными шага `{{<шаг>.<поле>}}`.\n- **Списки.** Фильтры — в окне под полем поиска (значок фильтра горит, когда фильтр включён),\n сортировка — кликом по заголовку колонки. Действия со строкой — в «⋯» в её конце: открыть,\n переименовать, переместить в папку, удалить и т. п. «Процессы» показывают все процессы раздела,\n опубликованные и черновики.\n- **Папки документов.** «+ Новая папка», у папки «⋯ → Переименовать и оформить»: название, цвет и\n значок; удаление папки оставляет документы в «Все документы».\n- **Удаление.** «⋯ → Удалить» спрашивает ещё раз и удаляет. Запись уходит в корзину Twenty и\n восстанавливается: задания — в фильтре «Архив», документы — в фильтре «Удалённые», процессы — в\n штатном списке «Рабочие процессы → Удалённые»; в карточке удалённой записи есть «Восстановить».\n Для этого роль приложения может мягко удалять только документы, задачи и процессы.\n- **Параметры в редакторе.** После «Сохранить параметры» редактор процесса открывается заново:\n он держит загруженную версию и иначе показал бы новые переменные только после перезагрузки.\n- **Своё задание.** «Задания → Создать»: название, исполнитель, срок, инструкция и поля для\n заполнения тем же конструктором. Поля меняются в панели задания («Изменить поля»).\n- **Документы.** «Документы → Создать» создаёт черновик в открытой папке и открывает его штатную\n карточку: там реквизиты и поле «Файл»; строка списка открывает ту же карточку. Так сделано потому, что\n страница приложения в песочнице видит только имя и размер выбранного файла, не его содержимое.\n Файл, приложенный к любой записи (компания, сделка, задача, свой объект), появляется в\n документах сам: «Где загружен», автор, дата, для задачи процесса — ссылка на запуск. Документ\n хранит копию файла.\n\n## Ограничения\n\n- Рамки вокруг страницы раздела рисует платформа: карточку виджета и рамку вокруг компонента\n приложения. Компоненты приложений работают в изолированном worker'е и убрать их не могут.\n- Блок «Запуск с параметрами» в редакторе открывает штатные настройки вебхука (адрес, тело,\n авторизация): поля там те же, что в «Параметрах запуска», менять их удобнее кнопкой. Если\n переименовать блок, Документооборот перестанет узнавать его как свой запуск.\n- Параметры запуска относятся к процессу, а не к версии: после правки полей опубликованная версия\n до публикации нового черновика получает новые поля, а переменные убранных полей в ней пусты.\n- Документ без файла создаётся раньше файла: если закрыть карточку, не прикрепив файл, документ\n останется с пустым полем «Файл».\n\n## Битрикс24\n\nПодключается локальным приложением портала (одна компания — один портал).\n\n1. В портале: «Разработчикам → Другое → Локальное приложение», тип «Серверное».\n2. Адреса — HTTP-маршруты приложения на адресе компании (точный адрес виден в «Настройки →\n Приложения → Документооборот → функции»):\n - путь обработчика: `https://<адрес компании>/s/bitrix/app`\n - путь первоначальной установки: `https://<адрес компании>/s/bitrix/install`\n3. Права приложения: `user`, `im`.\n4. Сохранить, скопировать «Код приложения» и «Ключ приложения» в `BITRIX_CLIENT_ID` и\n `BITRIX_CLIENT_SECRET`, затем открыть приложение в портале — установка завершится сама.\n\nКаждый запрос портала проверяется обменом refresh-токена на `oauth.bitrix.info` с ключом\nприложения; адрес портала берётся из ответа Битрикс24. Привязывается первый подтверждённый портал,\nдругой портал к той же компании не подключится. Токены портала хранятся в хранилище приложения, не\nв записях. Сотрудник находится по почте профиля Битрикс24: если такого ещё нет в CRM, он\nсоздаётся сам (нужна включённая публичная ссылка-приглашение в «Настройки → Участники») с той же\nпочтой и ФИО из Битрикс24.\n\n## Разработка\n\n```bash\nyarn app dev # следит за src/ и синхронизирует с сервером\nyarn app dev:function:logs\nyarn test && yarn typecheck && yarn lint\n```\n\nУстройство `src/`: `shared/` — общий код (формы, процессы, фильтры REST, Битрикс24); `server/` —\nобращения к записям и движку процессов из функций; `logic-functions/`; `front/` и\n`front-components/` — интерфейс; `objects/`, `fields/`, `views/`, `roles/`, `page-layouts/`,\n`navigation-menu-items/` — данные и раскладка. Записи читаются и пишутся только через REST API\n(`server/records.ts`, `front/api.ts`), движок процессов — через две мутации GraphQL\n(`server/workflow-engine.ts`, `server/launch-step.ts`): при смене версии платформы сверять эти\nфайлы. Стили интерфейса только inline: теги `<style>` в странице приложения платформа отбрасывает.\n\nПравила правки пакета (песочница страниц, процессы, единый вид вкладок, проверка на чистой CRM) —\nв [EDITING.md](EDITING.md).\n",
51
- "yarnLockChecksum": "42ac7e58e1f5be33be57956ccaa20fb3",
52
- "packageJsonChecksum": "e9eed6b7bebabfd328ea7bba7dd027d3",
50
+ "aboutDescription": "# Документооборот (`@crm-nordiv/docuflow`)\n\nЗадания, процессы и документы компании в одном разделе. Ставится в CRM как приложение, без правок\nсервера.\n\n- universalIdentifier: `0b7d5d2e-8c4f-4a59-9a43-2f6f1c3e9d21`\n\n## Что получается после установки\n\n| Где | Что |\n|---|---|\n| Сайдбар | папка «Документооборот» с пунктами «Задания», «Процессы», «Документы» — у каждого своя страница |\n| «Задания» | задачи раздела «Документооборот»; фильтры «Открытые / Мои / Просроченные / Выполненные / Архив» (архив — удалённые, со штатным «Восстановить»), поиск, создание задания с инструкцией и полями для заполнения |\n| Панель задания | вкладки «Задание» (поля и ход) и «Чат», если стоит `@haiiro/chats`: переписка задачи с меню сообщения, как в «Чатах» |\n| Карточка задачи | вкладка «Задание»: инструкция, поля задания (собрать конструктором, заполнить), «Выполнить» |\n| Карточка процесса | кнопка «Параметры запуска» вверху (боковая панель): параметры запуска (конструктор полей) и, для шагов «Человеческий ввод» черновика, кто выполняет, срок в днях, обязательные поля; у каждого поля видна переменная, которой его читают следующие шаги |\n| Редактор процесса | первый блок «Запуск с параметрами» (ставится сам): параметры, заполненные перед запуском, и запись, на которой запустили, — его переменные |\n| Командное меню | «Запустить процесс» (Cmd+K и меню выбранных записей любого объекта): выбор процесса, форма параметров в боковой панели, «Запустить»; запуск открывается в боковой панели, как штатный ручной |\n| «Процессы» | процессы с ручным запуском раздела «Документооборот»; форма параметров до запуска, «Запустить», «Создать», «Изменить процесс» |\n| «Документы» | папки, фильтры, поиск по названию и номеру, документ с реквизитами (тип, номер, дата, срок действия, контрагент, описание), файл в поле «Файл» карточки, карточка с источником |\n| Автоматически | шаг «Человеческий ввод» процесса становится задачей; её выполнение продолжает процесс; файл, приложенный к любой записи, копируется в документы с отметкой, кто, когда и куда его добавил |\n| Отдельная страница | `https://<адрес CRM>/s/docflow/app`: «Задания», «Процессы», «Документы» без остальной CRM, вход — тот же, что в CRM |\n| Битрикс24 | та же страница внутри приложения портала, вход через CRM в отдельном окне; уведомление исполнителю нового задания |\n\n## Данные\n\n| Объект | Поля |\n|---|---|\n| `smbDocument` (новый) | название, файл, тип, номер, дата, действует до, контрагент (компания), описание, статус, автор, ответственный, папка; источник: `origin`, `sourceObjectName`, `sourceRecordId`, `sourceRecordName`, `sourceFileId`, `workflowRunId` |\n| `smbDocumentFolder` (новый) | название, цвет, родительская папка |\n| `workflow` | `smbSection` «Раздел»: CRM / Документооборот; `smbLaunchFields` «Параметры запуска» — поля, которые заполняют перед запуском |\n| `task` | `smbSection`, `smbInstruction` «Инструкция»; `smbFormSchema`, `smbFormValues` — поля задания; `smbWorkflowRunId`, `smbWorkflowStepId`, `smbWorkflowThreadId` — связь с шагом процесса |\n| `company` | `smbDocuments` — документы контрагента |\n| роли | «Документооборот: функции приложения» (права функций), «Документооборот: участник процессов» (для людей, см. ниже) |\n\n## Установка\n\nС любого компьютера с Node.js 20+, нужен только адрес CRM и ключ API администратора\n(«Настройки → API и вебхуки → Создать ключ»). Повторный запуск ставит новую версию:\n\n```bash\nnpx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ>\n```\n\nУстановщик загружает в CRM опубликованный архив этой версии пакета и устанавливает приложение\n(как `twenty app:install`), доступ к серверу и его настройки не нужны. Конкретная версия:\n`--version 0.0.8`. Пакет собран под Twenty 2.45: на другой минорной версии установщик\nпредупреждает, на другой мажорной останавливается (`--force` — ставить всё равно). После установки\nон сверяет версию в CRM: CRM не ставит версию ниже уже загруженной и говорит об этом прямо.\n\nИз исходников (для разработки): `node scripts/reinstall.mjs docuflow --local` в корне репозитория\n(нужны `CRM_URL` и `CRM_API_KEY` в `.env`).\n\nЗатем в «Настройки → Приложения → Документооборот» заполнить переменные:\n\n| Переменная | Что указать |\n|---|---|\n| `DOCFLOW_ENGINE` | `APP` |\n| `CRM_PUBLIC_URL` | адрес CRM компании, например `https://acme.example.ru`; по нему строятся ссылки в CRM с отдельной страницы и из Битрикс24 |\n| `BITRIX_CLIENT_ID`, `BITRIX_CLIENT_SECRET` | из карточки локального приложения портала; без них Битрикс24 не подключается, остальное работает |\n\n**Права людей.** Отвечать на шаг запущенного процесса может только тот, у кого есть право\n«Рабочие процессы». Кто выполняет задания процессов или запускает процессы с параметрами,\nполучает роль «Документооборот: участник процессов» или это право в своей роли. Право также\nпозволяет менять процессы: давайте его тем, кому это допустимо. Обычные задания и документы\nправа «Рабочие процессы» не требуют.\n\n## Как пользоваться\n\n- **Процесс.** «Процессы → Создать» создаёт процесс с ручным запуском в разделе «Документооборот» и\n открывает редактор. Существующий процесс переносится в документооборот полем «Раздел».\n- **Параметры запуска.** Кнопка процесса «Параметры запуска» → «Добавить поле»: название, тип\n (текст, число, дата, сотрудник, компания, контакт, сделка), обязательность. «Сохранить\n параметры» делает первым блоком черновика «Запуск с параметрами»: в следующих шагах параметры\n выбираются как его переменные `{{trigger.<поле>}}` — например «Запуск с параметрами →\n Сотрудник → Id» в поле «Исполнитель» задачи. «Где запускать» — «Откуда угодно, без записи» или\n «На записи: <объект>»: тогда процесс запускают на выбранных записях этого объекта, по запуску\n на каждую, а запись — переменная `{{trigger.record}}` с полями объекта (как у штатного запуска\n вручную на записи). Без параметров и записи процесс начинается с обычного «Запуск вручную».\n Опубликуйте процесс. Запускают его командой «Запустить процесс»: из Cmd+K — процессы без\n записи, на выбранных записях — процессы их объекта и процессы без записи. Процессы без записи\n запускаются и со страницы «Процессы». Обязательные параметры проверяются и в форме, и на сервере.\n\n Устройство: своих типов триггеров у приложений Twenty нет, а у «Запуск вручную» редактор\n показывает только свои переменные. Штатный пункт меню ручного запуска запускает процесс сразу,\n без формы, и встроиться в него приложение не может. Поэтому «Запуск с параметрами» — штатный триггер Webhook\n (POST, только с ключом API), поля параметров — его тело. Документооборот запускает такую версию\n сам; внешняя система (например, мост в Битрикс24) может запустить процесс POST-запросом на адрес\n вебхука с ключом API и телом из этих полей — тогда проверку обязательных полей делает она.\n Шаг «Параметры запуска» процессов из 0.0.6 и раньше при первом сохранении параметров убирается,\n его переменные в следующих шагах переводятся на `trigger`.\n- **Задание шага.** Шаг «Человеческий ввод» становится задачей раздела процесса: у исполнителя\n из «Параметров запуска», без него — у запустившего. Поля задания — поля шага из редактора.\n «Выполнить» проверяет обязательные поля и продолжает процесс; значения дальше читаются\n переменными шага `{{<шаг>.<поле>}}`.\n- **Списки.** Фильтры — в окне под полем поиска (значок фильтра горит, когда фильтр включён),\n сортировка — кликом по заголовку колонки. Действия со строкой — в «⋯» в её конце: открыть,\n переименовать, переместить в папку, удалить и т. п. «Процессы» показывают все процессы раздела,\n опубликованные и черновики.\n- **Папки документов.** «+ Новая папка», у папки «⋯ → Переименовать и оформить»: название, цвет и\n значок; удаление папки оставляет документы в «Все документы».\n- **Удаление.** «⋯ → Удалить» спрашивает ещё раз и удаляет. Запись уходит в корзину Twenty и\n восстанавливается: задания — в фильтре «Архив», документы — в фильтре «Удалённые», процессы — в\n штатном списке «Рабочие процессы → Удалённые»; в карточке удалённой записи есть «Восстановить».\n Для этого роль приложения может мягко удалять только документы, задачи и процессы.\n- **Параметры в редакторе.** После «Сохранить параметры» редактор процесса открывается заново:\n он держит загруженную версию и иначе показал бы новые переменные только после перезагрузки.\n- **Своё задание.** «Задания → Создать»: название, исполнитель, срок, инструкция и поля для\n заполнения тем же конструктором. Поля меняются в панели задания («Изменить поля»).\n- **Документы.** «Документы → Создать» создаёт черновик в открытой папке и открывает его штатную\n карточку: там реквизиты и поле «Файл»; строка списка открывает ту же карточку. Так сделано потому, что\n страница приложения в песочнице видит только имя и размер выбранного файла, не его содержимое.\n Файл, приложенный к любой записи (компания, сделка, задача, свой объект), появляется в\n документах сам: «Где загружен», автор, дата, для задачи процесса — ссылка на запуск. Документ\n хранит копию файла.\n\n## Ограничения\n\n- Рамки вокруг страницы раздела рисует платформа: карточку виджета и рамку вокруг компонента\n приложения. Компоненты приложений работают в изолированном worker'е и убрать их не могут.\n- Блок «Запуск с параметрами» в редакторе открывает штатные настройки вебхука (адрес, тело,\n авторизация): поля там те же, что в «Параметрах запуска», менять их удобнее кнопкой. Если\n переименовать блок, Документооборот перестанет узнавать его как свой запуск.\n- Параметры запуска относятся к процессу, а не к версии: после правки полей опубликованная версия\n до публикации нового черновика получает новые поля, а переменные убранных полей в ней пусты.\n- Документ без файла создаётся раньше файла: если закрыть карточку, не прикрепив файл, документ\n останется с пустым полем «Файл».\n- На отдельной странице и в Битрикс24 карточка записи (задачи, документа, процесса) открывается в\n CRM в новой вкладке: боковой панели CRM там нет. Файл документа прикрепляется там же.\n- Отдельная страница выглядит как штатный Twenty (светлая или тёмная тема по настройке системы):\n скин `@haiiro/interface` на неё не действует.\n\n## Отдельная страница\n\n`https://<адрес CRM>/s/docflow/app` — документооборот без остальной CRM: шапка с разделами «Задания»,\n«Процессы», «Документы», кнопки «На весь экран» и «Открыть CRM». Раздел при открытии —\n`?section=processes` или `?section=documents`. Это те же страницы, что в папке «Документооборот»\nсайдбара, с теми же правами: страница работает от имени сотрудника, вошедшего в CRM в этом\nбраузере. Если вход не выполнен, она предлагает войти в CRM в соседней вкладке и открывается сама.\n\n## Битрикс24\n\nПодключается локальным приложением портала (одна компания — один портал).\n\n1. В портале: «Разработчикам → Другое → Локальное приложение», тип «Серверное».\n2. Адреса — HTTP-маршруты приложения на адресе компании (точный адрес виден в «Настройки →\n Приложения → Документооборот → функции»):\n - путь обработчика: `https://<адрес компании>/s/bitrix/app`\n - путь первоначальной установки: `https://<адрес компании>/s/bitrix/install`\n3. Права приложения: `user`, `im`.\n4. Сохранить, скопировать «Код приложения» и «Ключ приложения» в `BITRIX_CLIENT_ID` и\n `BITRIX_CLIENT_SECRET`, затем открыть приложение в портале — установка завершится сама.\n\nКаждый запрос портала проверяется обменом refresh-токена на `oauth.bitrix.info` с ключом\nприложения; адрес портала берётся из ответа Битрикс24. Привязывается первый подтверждённый портал,\nдругой портал к той же компании не подключится. Токены портала хранятся в хранилище приложения, не\nв записях. Сотрудник находится по почте профиля Битрикс24: если такого ещё нет в CRM, он\nсоздаётся сам (нужна включённая публичная ссылка-приглашение в «Настройки → Участники») с той же\nпочтой и ФИО из Битрикс24.\n\n**Вход.** В портале открывается отдельная страница документооборота. Сессия CRM во фрейме портала\nне работает (браузер не отдаёт cookie CRM чужому сайту), поэтому при первом открытии страница\nпросит «Войти через CRM»: открывается окно на адресе CRM, оно берёт вход сотрудника в CRM (если его\nнет — ждёт, пока сотрудник войдёт в CRM в соседней вкладке), передаёт его во фрейм и закрывается.\nДальше страница работает с токеном этого сотрудника (его права в CRM, 30 минут) и сама продлевает\nего, пока открыта; токен хранится в хранилище браузера только для этого портала. Если приложение не\nоткрывали дольше получаса, «Войти через CRM» нажимают снова — при живом входе в CRM окно закроется\nсамо. Если в CRM в этом браузере вошёл не тот сотрудник, что в Битрикс24, страница предупреждает.\nСтраница работает только во фрейме привязанного портала.\n\n## Разработка\n\n```bash\nyarn app dev # следит за src/ и синхронизирует с сервером\nyarn app dev:function:logs\nyarn build:app # отдельная страница: public/app (yarn build делает это сам)\nyarn test && yarn typecheck && yarn lint\n```\n\nУстройство `src/`: `shared/` — общий код (формы, процессы, фильтры REST, Битрикс24); `server/` —\nобращения к записям и движку процессов из функций; `logic-functions/`; `front/` и\n`front-components/` — интерфейс; `standalone/` — отдельная страница (те же страницы вне CRM); `objects/`, `fields/`, `views/`, `roles/`, `page-layouts/`,\n`navigation-menu-items/` — данные и раскладка. Записи читаются и пишутся только через REST API\n(`server/records.ts`, `front/api.ts`), движок процессов — через две мутации GraphQL\n(`server/workflow-engine.ts`, `server/launch-step.ts`): при смене версии платформы сверять эти\nфайлы. Стили интерфейса только inline: теги `<style>` в странице приложения платформа отбрасывает.\n\nПравила правки пакета (песочница страниц, процессы, единый вид вкладок, проверка на чистой CRM) —\nв [EDITING.md](EDITING.md).\n",
51
+ "yarnLockChecksum": "d4d3dd414c49b677cf14b279b38ecd54",
52
+ "packageJsonChecksum": "48f13eed1eb7fc9cb8f04a77381f6b24",
53
53
  "requiredServerVersionRange": null,
54
54
  "healthCheckLogicFunction": {
55
55
  "universalIdentifier": "84360081-db5a-4f1c-9644-d975ccad9b2c"
@@ -453,6 +453,16 @@
453
453
  "joinColumnName": "counterpartyId"
454
454
  }
455
455
  },
456
+ {
457
+ "universalIdentifier": "1081520c-dfec-42a3-84e7-8d5bc7a55027",
458
+ "objectUniversalIdentifier": "20202020-62be-406c-b9ca-8caa50d51392",
459
+ "type": "TEXT",
460
+ "name": "smbLaunchObject",
461
+ "label": "Запуск на записях",
462
+ "icon": "IconListDetails",
463
+ "isNullable": true,
464
+ "defaultValue": null
465
+ },
456
466
  {
457
467
  "universalIdentifier": "27298f9e-086d-4666-9b3e-21893cc7ea71",
458
468
  "objectUniversalIdentifier": "dfbf9c6a-8ee5-4598-9bc3-f767d3636e17",
@@ -653,6 +663,16 @@
653
663
  "joinColumnName": "authorId"
654
664
  }
655
665
  },
666
+ {
667
+ "universalIdentifier": "ae169497-eec6-45ca-a411-928d0f81ca5b",
668
+ "objectUniversalIdentifier": "20202020-1ba1-48ba-bc83-ef7e5990ed10",
669
+ "type": "RAW_JSON",
670
+ "name": "smbTimeLog",
671
+ "label": "Учёт времени",
672
+ "icon": "IconClock",
673
+ "isNullable": true,
674
+ "defaultValue": null
675
+ },
656
676
  {
657
677
  "universalIdentifier": "af8ed15e-916e-4fa1-a6ce-c2b3e594c8b8",
658
678
  "objectUniversalIdentifier": "20202020-1ba1-48ba-bc83-ef7e5990ed10",
@@ -795,7 +815,7 @@
795
815
  "handlerName": "default.config.handler",
796
816
  "sourceHandlerPath": "src/logic-functions/bitrix-app.logic-function.ts",
797
817
  "builtHandlerPath": "src/logic-functions/bitrix-app.logic-function.mjs",
798
- "builtHandlerChecksum": "49fcc205a222aa1a9239c581667ace89"
818
+ "builtHandlerChecksum": "c29d758dd97b783471746af5533e7fe7"
799
819
  },
800
820
  {
801
821
  "universalIdentifier": "13952f55-e84f-4d3a-a5a2-f3d68d78ba5e",
@@ -810,7 +830,7 @@
810
830
  "handlerName": "default.config.handler",
811
831
  "sourceHandlerPath": "src/logic-functions/save-step-settings.logic-function.ts",
812
832
  "builtHandlerPath": "src/logic-functions/save-step-settings.logic-function.mjs",
813
- "builtHandlerChecksum": "b24284e80ad7fefe3a7cd23e5a1a558d"
833
+ "builtHandlerChecksum": "4cf54491394451cc1eb783d6b4729ac8"
814
834
  },
815
835
  {
816
836
  "universalIdentifier": "70021464-1ce0-4c94-81c7-ee6b4490034c",
@@ -835,7 +855,7 @@
835
855
  "handlerName": "default.config.handler",
836
856
  "sourceHandlerPath": "src/logic-functions/save-task-form.logic-function.ts",
837
857
  "builtHandlerPath": "src/logic-functions/save-task-form.logic-function.mjs",
838
- "builtHandlerChecksum": "12efc94762c6468a24982f7415571d19"
858
+ "builtHandlerChecksum": "5d5a7a4bbec6932be0ea3f0b21a22bcc"
839
859
  },
840
860
  {
841
861
  "universalIdentifier": "84360081-db5a-4f1c-9644-d975ccad9b2c",
@@ -858,7 +878,7 @@
858
878
  "handlerName": "default.config.handler",
859
879
  "sourceHandlerPath": "src/logic-functions/bitrix-install.logic-function.ts",
860
880
  "builtHandlerPath": "src/logic-functions/bitrix-install.logic-function.mjs",
861
- "builtHandlerChecksum": "74d797ca5cf3e8f1170a91dd1ddbe2f0"
881
+ "builtHandlerChecksum": "37a42dd1026b39ed64fae1c26e772c0e"
862
882
  },
863
883
  {
864
884
  "universalIdentifier": "9358be72-63c4-4562-b84e-25e309bebe70",
@@ -893,6 +913,21 @@
893
913
  "builtHandlerPath": "src/logic-functions/on-task-updated.logic-function.mjs",
894
914
  "builtHandlerChecksum": "14eccf4419af23670c7269bee03b87fd"
895
915
  },
916
+ {
917
+ "universalIdentifier": "b0da29b0-3229-4250-8919-b4f1b4370c44",
918
+ "name": "docflow-app",
919
+ "description": "Отдельная страница документооборота без остальной CRM",
920
+ "timeoutSeconds": 10,
921
+ "httpRouteTriggerSettings": {
922
+ "path": "/docflow/app",
923
+ "httpMethod": "GET",
924
+ "isAuthRequired": false
925
+ },
926
+ "handlerName": "default.config.handler",
927
+ "sourceHandlerPath": "src/logic-functions/docflow-app.logic-function.ts",
928
+ "builtHandlerPath": "src/logic-functions/docflow-app.logic-function.mjs",
929
+ "builtHandlerChecksum": "11516f0296cf8015e63ebf7f679171f9"
930
+ },
896
931
  {
897
932
  "universalIdentifier": "c164c184-3b24-4d26-832b-219f3f02102a",
898
933
  "name": "docflow-publish-process",
@@ -906,7 +941,7 @@
906
941
  "handlerName": "default.config.handler",
907
942
  "sourceHandlerPath": "src/logic-functions/publish-process.logic-function.ts",
908
943
  "builtHandlerPath": "src/logic-functions/publish-process.logic-function.mjs",
909
- "builtHandlerChecksum": "0805ed4f310562484f47a589d87da663"
944
+ "builtHandlerChecksum": "a4a6f1456416fc09d6a3576629a290e3"
910
945
  },
911
946
  {
912
947
  "universalIdentifier": "c90778dd-4b0f-4a8c-a769-aca0c09f0b5f",
@@ -942,7 +977,7 @@
942
977
  {
943
978
  "universalIdentifier": "d2cce9f2-6ba4-415c-aa3d-5d9aba6ae89c",
944
979
  "name": "docflow-save-launch-fields",
945
- "description": "Сохраняет параметры запуска и делает первым блоком процесса «Запуск с параметрами»",
980
+ "description": "Сохраняет параметры и объект запуска и делает первым блоком процесса «Запуск с параметрами»",
946
981
  "timeoutSeconds": 30,
947
982
  "httpRouteTriggerSettings": {
948
983
  "path": "/docflow/processes/launch-fields",
@@ -952,7 +987,7 @@
952
987
  "handlerName": "default.config.handler",
953
988
  "sourceHandlerPath": "src/logic-functions/save-launch-fields.logic-function.ts",
954
989
  "builtHandlerPath": "src/logic-functions/save-launch-fields.logic-function.mjs",
955
- "builtHandlerChecksum": "4abf0828a5dfbf767287c6fe5c291671"
990
+ "builtHandlerChecksum": "6a334d0ee78796ff4875a03a8b2f71a5"
956
991
  },
957
992
  {
958
993
  "universalIdentifier": "d94c98c9-4f19-4fdd-9da2-89b3dfc6e43c",
@@ -967,7 +1002,7 @@
967
1002
  "handlerName": "default.config.handler",
968
1003
  "sourceHandlerPath": "src/logic-functions/complete-task.logic-function.ts",
969
1004
  "builtHandlerPath": "src/logic-functions/complete-task.logic-function.mjs",
970
- "builtHandlerChecksum": "d8bbcb316012f8e3bceecf0c80696c54"
1005
+ "builtHandlerChecksum": "c5d832f87d169d70e13373df2bd8ff80"
971
1006
  },
972
1007
  {
973
1008
  "universalIdentifier": "de04e9c8-7ebe-4ac2-b4b3-4ca256eb94db",
@@ -982,7 +1017,25 @@
982
1017
  "handlerName": "default.config.handler",
983
1018
  "sourceHandlerPath": "src/logic-functions/launch-process.logic-function.ts",
984
1019
  "builtHandlerPath": "src/logic-functions/launch-process.logic-function.mjs",
985
- "builtHandlerChecksum": "bc6d9f5f7dd0a6b665040b44991bdef1"
1020
+ "builtHandlerChecksum": "cf1d65de56ddf4a3c9a9071fe4d5a888"
1021
+ },
1022
+ {
1023
+ "universalIdentifier": "e819586a-b6a5-4df9-8bef-c524b6d0a886",
1024
+ "name": "docflow-app-session",
1025
+ "description": "Сессия отдельной страницы документооборота от имени вошедшего сотрудника",
1026
+ "timeoutSeconds": 10,
1027
+ "httpRouteTriggerSettings": {
1028
+ "path": "/docflow/app/session",
1029
+ "httpMethod": "POST",
1030
+ "isAuthRequired": true,
1031
+ "forwardedRequestHeaders": [
1032
+ "sec-fetch-site"
1033
+ ]
1034
+ },
1035
+ "handlerName": "default.config.handler",
1036
+ "sourceHandlerPath": "src/logic-functions/docflow-app-session.logic-function.ts",
1037
+ "builtHandlerPath": "src/logic-functions/docflow-app-session.logic-function.mjs",
1038
+ "builtHandlerChecksum": "5c3449f32b935316f19172cbab54f381"
986
1039
  },
987
1040
  {
988
1041
  "universalIdentifier": "f27cfbdc-8e87-4e1a-ab37-fc2a8093946c",
@@ -997,7 +1050,7 @@
997
1050
  "handlerName": "default.config.handler",
998
1051
  "sourceHandlerPath": "src/logic-functions/bitrix-event.logic-function.ts",
999
1052
  "builtHandlerPath": "src/logic-functions/bitrix-event.logic-function.mjs",
1000
- "builtHandlerChecksum": "5438172fefc9c719c42cf3ec240143fc"
1053
+ "builtHandlerChecksum": "636702875d50031c6d1e1bf83e3efb71"
1001
1054
  },
1002
1055
  {
1003
1056
  "universalIdentifier": "f735d9e9-d46a-4527-98c8-c84c2b6dbb7b",
@@ -1028,7 +1081,7 @@
1028
1081
  "componentName": "TaskForm",
1029
1082
  "sourceComponentPath": "src/front-components/task-form.front-component.tsx",
1030
1083
  "builtComponentPath": "src/front-components/task-form.front-component.mjs",
1031
- "builtComponentChecksum": "0d1b34b4d5faea4f20ac9c79ee2c8dcdd9f19ae04c4f05db5e1710a3b5b34d65",
1084
+ "builtComponentChecksum": "4577ed9a1c804781cc77274d7435eba48d49a7150be5268c038da9ea56756fe0",
1032
1085
  "isHeadless": false,
1033
1086
  "usesSdkClient": true
1034
1087
  },
@@ -1039,7 +1092,18 @@
1039
1092
  "componentName": "ProcessSteps",
1040
1093
  "sourceComponentPath": "src/front-components/process-steps.front-component.tsx",
1041
1094
  "builtComponentPath": "src/front-components/process-steps.front-component.mjs",
1042
- "builtComponentChecksum": "13386434887de07a2df763b15d2cfff91121fb43d9e31ec0cc942faa3af92517",
1095
+ "builtComponentChecksum": "f6722f096c630dda2d8a7f6da466b04f0c056e324c1e5063bfcdb2bd6f65e0a7",
1096
+ "isHeadless": false,
1097
+ "usesSdkClient": true
1098
+ },
1099
+ {
1100
+ "universalIdentifier": "b04fc63c-c6bf-4461-b68d-c0b973d1f81b",
1101
+ "name": "docflow-launch-process",
1102
+ "description": "Запуск процесса документооборота с параметрами из командного меню",
1103
+ "componentName": "LaunchProcess",
1104
+ "sourceComponentPath": "src/front-components/launch-process.front-component.tsx",
1105
+ "builtComponentPath": "src/front-components/launch-process.front-component.mjs",
1106
+ "builtComponentChecksum": "69b115ba4a2e0a1ec44b33e9c1c87f63948a956ca521535157b479676690bc1f",
1043
1107
  "isHeadless": false,
1044
1108
  "usesSdkClient": true
1045
1109
  },
@@ -1050,7 +1114,7 @@
1050
1114
  "componentName": "DocflowTasks",
1051
1115
  "sourceComponentPath": "src/front-components/docflow-tasks.front-component.tsx",
1052
1116
  "builtComponentPath": "src/front-components/docflow-tasks.front-component.mjs",
1053
- "builtComponentChecksum": "1f4d60b5f510438869ae86bf47313e078cb8b691b6b621181320ea21121add7c",
1117
+ "builtComponentChecksum": "72b9be1c804378ae3b1f9da1ccbfecad3b4264f7259a95e44da25c31c4b5aaad",
1054
1118
  "isHeadless": false,
1055
1119
  "usesSdkClient": true
1056
1120
  },
@@ -1061,7 +1125,7 @@
1061
1125
  "componentName": "DocflowDocuments",
1062
1126
  "sourceComponentPath": "src/front-components/docflow-documents.front-component.tsx",
1063
1127
  "builtComponentPath": "src/front-components/docflow-documents.front-component.mjs",
1064
- "builtComponentChecksum": "31ca740fe259e2779158a218aee30677d2758ac4c5e519b329c55cd6dd293687",
1128
+ "builtComponentChecksum": "8065f28f93416db416ecc6a477469d7a40808ee8160d631d330d28819e551bf3",
1065
1129
  "isHeadless": false,
1066
1130
  "usesSdkClient": false
1067
1131
  },
@@ -1072,12 +1136,24 @@
1072
1136
  "componentName": "DocflowProcesses",
1073
1137
  "sourceComponentPath": "src/front-components/docflow-processes.front-component.tsx",
1074
1138
  "builtComponentPath": "src/front-components/docflow-processes.front-component.mjs",
1075
- "builtComponentChecksum": "4e951d0c5a70aca047bac474fc2dab3e8f362b410a9ca1d7525a1f5cea9dfa48",
1139
+ "builtComponentChecksum": "ac0e6eacf7444a7b1b50878a0b0990efd5987128d872d42abecd3bbc8d7c4fe7",
1076
1140
  "isHeadless": false,
1077
1141
  "usesSdkClient": true
1078
1142
  }
1079
1143
  ],
1080
1144
  "publicAssets": [
1145
+ {
1146
+ "filePath": "public/app/docflow-app.css",
1147
+ "fileName": "docflow-app.css",
1148
+ "fileType": "css",
1149
+ "checksum": "2e61de32cb3034a77578f5f5e44f74ca"
1150
+ },
1151
+ {
1152
+ "filePath": "public/app/docflow-app.js",
1153
+ "fileName": "docflow-app.js",
1154
+ "fileType": "js",
1155
+ "checksum": "3732613ac92240e4336781cab17ea884"
1156
+ },
1081
1157
  {
1082
1158
  "filePath": "public/cover.svg",
1083
1159
  "fileName": "cover.svg",
@@ -1389,6 +1465,26 @@
1389
1465
  ],
1390
1466
  "pageLayoutWidgets": [],
1391
1467
  "commandMenuItems": [
1468
+ {
1469
+ "universalIdentifier": "160f28c0-98dc-4bf3-8506-f97e917fc709",
1470
+ "label": "Запустить процесс",
1471
+ "shortLabel": "Запустить процесс",
1472
+ "icon": "IconPlayerPlay",
1473
+ "isPinned": false,
1474
+ "availabilityType": "RECORD_SELECTION",
1475
+ "frontComponentUniversalIdentifier": "b04fc63c-c6bf-4461-b68d-c0b973d1f81b",
1476
+ "conditionalAvailabilityExpression": "numberOfSelectedRecords > 0 and\n objectMetadataItem.nameSingular != 'workflow' and\n objectMetadataItem.nameSingular != 'workflowVersion' and\n objectMetadataItem.nameSingular != 'workflowRun'"
1477
+ },
1478
+ {
1479
+ "universalIdentifier": "6f4bc76a-b738-4a1f-a18b-f2dbf77ee70d",
1480
+ "label": "Запустить процесс",
1481
+ "shortLabel": "Запустить процесс",
1482
+ "icon": "IconPlayerPlay",
1483
+ "isPinned": false,
1484
+ "availabilityType": "GLOBAL",
1485
+ "frontComponentUniversalIdentifier": "b04fc63c-c6bf-4461-b68d-c0b973d1f81b",
1486
+ "conditionalAvailabilityExpression": "numberOfSelectedRecords == 0"
1487
+ },
1392
1488
  {
1393
1489
  "universalIdentifier": "c3f5a2d4-7e1b-4c9a-8f36-2b5d0e7a91c4",
1394
1490
  "label": "Параметры запуска",