Synchra.24
menu_bookДокументация
Практические материалы по запуску и развитию

Здесь собраны инструкции по запуску, разработке внутренних сценариев и встраиванию собственных инструментов в рабочий контур компании.

folderВстроенные сервисы

Код, библиотеки и SDK

JavaScript и React, встроенные библиотеки, мост, тема и работа с артефактами.

React и JSX

React и ReactDOM входят в веб-версию и доступны в предпросмотре и опубликованном сервисе. Новый сервис содержит React-пример с чтением артефакта. В HTML укажите контейнер:

<div id="root"></div>

Во вкладке JavaScript можно писать JSX, функциональные компоненты и хуки:

import React, { useState } from 'react';
import { createRoot } from 'react-dom/client';

function App() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>Нажатий: {count}</button>;
}

createRoot(document.getElementById('root')).render(<App />);

Допустимы импорты из react, react-dom/client, lodash и dayjs, а также глобальные React и ReactDOM. Явно вызывайте createRoot(...).render(...): компонент не монтируется автоматически. synchra.getArtifact() работает из обработчиков и эффектов; отображайте загрузку и обрабатывайте ошибки. Другие сторонние модули и TypeScript не поддерживаются; в sandbox обычного сервиса также недоступны CDN и прямые сетевые запросы. Обычный сервис выполняется в sandbox без доступа к авторизации основного сайта. Для веб-виджета действует описанная выше модель доверенного кода в Shadow DOM. В лимит 5 МиБ входят исходники сервиса; встроенные React, Lodash, Day.js и SDK не учитываются.

Кнопка форматирования работает с JSX. Ошибки подготовки кода показываются в панели логов; исходник остаётся в редакторе. Обычные сервисы на JavaScript продолжают работать.

Кнопка ⓘ в верхней панели рядом с AI-помощником и обновлением открывает README библиотеки @synchra24/app с GitHub и дополнение о событиях веб-моста в окне документации. Полное руководство по событиям приведено ниже и в разделе Запуск по событиям. Заголовки, списки, таблицы и примеры кода отображаются в формате Markdown. Можно открыть оригинал на GitHub; при ошибке доступна повторная загрузка. Документация загружается через веб-сервер с кэшированием на час.

Lodash и Day.js

Библиотеки встроены в движок: доступны без CDN и установки пакетов в предпросмотре и опубликованном сервисе. Можно использовать глобальные _ и dayjs либо импорты:

import _ from 'lodash';
import debounce from 'lodash/debounce';
import dayjs from 'dayjs';

const groups = _.groupBy(items, 'status');
const date = dayjs('13.10.2026', 'DD.MM.YYYY', true);
if (date.isValid()) console.log(date.format('DD.MM.YYYY'));
const moscowTime = dayjs.utc('2026-10-13T09:00:00Z').tz('Europe/Moscow');

Day.js использует русскую локаль по умолчанию; английская также встроена (dayjs.locale('en') или dayjs(value).locale('en')). Следующие плагины уже подключены через dayjs.extend, повторная настройка не нужна:

Плагины Возможности
utc, timezone UTC и явное преобразование часовых поясов
customParseFormat, localizedFormat Разбор заданного формата, строгая проверка и локализованный вывод дат
relativeTime, duration Относительное время и длительности
isBetween, isSameOrBefore, isSameOrAfter, minMax Диапазоны, сравнение, минимальная и максимальная дата
isoWeek Недели по ISO

Импорты dayjs/plugin/<name> разрешены для перечисленных плагинов, локали — dayjs/locale/ru и dayjs/locale/en. Для lodash доступны основной модуль и методы через lodash/<method>. Не используйте неуказанные плагины или другие локали: они не входят в движок. Часовой пояс задавайте явно по сценарию сервиса; время браузера может отличаться от времени компании.

Проверка моста и ключ сервиса

При старте проверяйте await synchra.isSynchraIntegrated() перед запросами контекста, артефактов и другими действиями через мост. До завершения проверки кнопки таких действий должны быть отключены. При false покажите сообщение о недоступном мосте и не выполняйте запросы: SDK возвращает false также при отклонённом ключе сервиса.

Движок автоматически передаёт SERVICE_TOKEN — ключ текущего сервиса — и создаёт synchra как new SynchraApp(SERVICE_TOKEN). Используйте готовый экземпляр. Не прописывайте реальный ключ в исходниках, не выводите его в логи и не заменяйте токеном пользователя или компании. Для внешнего приложения по URL ключ указывается при создании экземпляра SDK согласно документации библиотеки; для встроенного сервиса это уже делает движок.

const integrated = await synchra.isSynchraIntegrated();
if (!integrated) {
  // Покажите сообщение и оставьте действия моста отключёнными.
  return;
}
const artifact = await synchra.getArtifact('warehouse.stock');
// Отобразите artifact.value с обработкой загрузки, пустых данных и ошибок.

Пример выше — тело асинхронной функции. Стартовый React-шаблон проверяет мост в useEffect, хранит результат проверки и разрешает загрузку только при true. Эти же правила входят в инструкции AI-помощнику.

Предпросмотр эмулирует мост, передаёт тестовый ключ preview-service и возвращает успешный результат проверки для него. Проверка ключа выполняется при каждом вызове. Чтение артефактов возвращает только содержимое вкладки «Тестовые артефакты». Тестовый ключ не предоставляет доступ к реальным данным компании. Специально отключать проверку интеграции для предпросмотра не нужно.

Цвета и типографика

После успешной проверки интеграции читайте synchra.getSynchraTheme(): синхронный метод возвращает {active, current, themes} или null. Имена полей одинаковы на обеих платформах: primary, secondary, text, title, elements, inputGrey, border, controlPrimary, error, success, button, buttonText, white. Цвета берите из current активной темы — светлой или тёмной. В мобильном приложении это палитра мобильной версии, в браузере — цвета окружающего веб-интерфейса, включая полупрозрачные панели, поля, границы и акцент. Один и тот же код сервиса работает без отдельного выбора палитры; среду при необходимости определяйте через synchra.getRuntime(). Изменения отслеживайте через synchra.onSynchraThemeChange(callback). Возвращённую функцию отписки вызывайте при размонтировании. Обновляйте CSS-переменные без перезагрузки сервиса.

Мобильная палитра для справки (не фиксируйте эти значения в коде веб-сервиса):

Роль Ключ темы Светлая / тёмная
Фон primary #e5e5e5 / #212529
Панели secondary #eeeeee / #343a40
Текст text #242424 / #adb5bd
Заголовки title #3a3a3a / #adb5bd
Иконки, вторичный текст elements #50565c / #adb5bd
Поля inputGrey #d7d7d7bf / #343a40
Границы border #d4d4d4 / #131517ff
Акцент controlPrimary #ffb703
Ошибка / успех error / success #f94144 / #52b788

На жёлтых кнопках используйте тёмный текст #242424 в обеих темах. buttonText относится к нейтральным кнопкам. Веб-версия и веб-предпросмотр передают актуальные CSS-цвета веб-интерфейса под теми же ключами; мобильный предпросмотр сохраняет мобильную палитру. В themes находятся базовые палитры текущей платформы, а активная обновляется вычисленными цветами интерфейса. Для текущего оформления всегда используйте current: значения могут быть rgba(...), а веб-акцент может отличаться от мобильного жёлтого. Смена темы и акцента вызывает событие SDK и обновляет стандартные CSS-переменные без перезапуска сервиса и потери его состояния. Это работает в обычных сервисах, виджетах Shadow DOM и подключённых по URL сервисах с поддержкой моста. Цвета сервиса, прописанные вручную вместо обращения к SDK, автоматически не заменяются.

Рекомендуемые размеры/межстрочные интервалы в CSS-пикселях: основной текст 14/19, подписи 12/16, заголовки карточек 17/22 или 19/28, заголовок страницы 25/31. Для полей на iPhone используйте 16px, для зон нажатия — минимум 44px. Текст обычный 400, выделенный 500–700, заголовки 700–800. В мобильном приложении используются Google Sans и Manrope; в WebView эти шрифты автоматически не наследуются, поэтому задавайте системный запасной шрифт, не подключая CDN. Эти правила включены в инструкции AI-помощнику и стартовый шаблон новых сервисов. Существующие публикации автоматически не переписываются.

Запись артефактов из встроенного сервиса

После проверки интеграции вызовите await synchra.setArtifact('service.settings', {enabled: true}). Имя должно уже существовать в этой компании; метод заменяет JSON целиком, возвращает обновлённую версию и не создаёт отсутствующий артефакт. Нужны лицензия API и admin_edit_provider_integrations; максимум 1 МиБ на значение. Веб-сервисы, Shadow DOM-виджеты и обновлённый мобильный мост используют одинаковое событие app.automation.artifact.set. В старом внешнем SDK используйте requestPayload с {name, value}. В предпросмотре изменяются только тестовые данные до перезапуска.

Для чтения этих данных во всех этапах автоматизации подключите верхний блок artifacts; transform получает context.artifacts. Запись сама по себе не запускает автоматизацию. Примеры, API и ошибки.