Технический справочник интегратора
Syrve Server API
Полное описание серверного REST API Syrve RMS и Syrve Chain: авторизация, номенклатура, склад, касса, персонал, отчёты и OLAP.
01Быстрый старт
Четыре шага, чтобы получить первые данные с сервера.
1. Посчитать SHA1 от пароля
Сервер принимает не пароль, а его SHA1-хеш в нижнем регистре hex.
# bash
printf "myPassword" | sha1sum
# PowerShell
$p = "myPassword"
$sha = [System.Security.Cryptography.SHA1]::Create()
$h = $sha.ComputeHash([Text.Encoding]::UTF8.GetBytes($p))
($h | ForEach-Object { $_.ToString("x2") }) -join ""
2. Получить токен
/resto/api/auth?login=[login]&pass=[sha1]https://localhost:8080/resto/api/auth?login=admin&pass=2155245b2c002a1986d3f384af93be813537a476
# Ответ — просто строка:
b354d18c-3d3a-e1a6-c3b9-9ef7b5055318
3. Вызвать любой метод с key
https://localhost:8080/resto/api/corporation/departments?key=b354d18c-3d3a-e1a6-c3b9-9ef7b5055318
4. Обязательно выйти
/resto/api/logout?key=[token]Освобождает слот лицензии. Без этого следующая авторизация может упасть с ошибкой.
Типовой порт Syrve Server — 8080 или 9080. В официальных примерах встречаются оба; в вашей инсталляции смотрите resto.properties или адресную строку бэк-офиса.
02Базовые принципы
Две ветки API
| Ветка | Префикс | Формат | Когда использовать |
|---|---|---|---|
| v1 | /resto/api/… | преимущественно XML | Старые методы: документы, отчёты, события, сотрудники, поставщики |
| v2 | /resto/api/v2/… | преимущественно JSON | Всё новое: номенклатура, справочники, OLAP v2, касса, остатки |
Ветки сосуществуют: одна интеграция спокойно пользуется обеими. Токен общий.
Как передавать токен
- параметром
key=…в query-строке — работает всегда; - cookie с именем
key— с версии 4.3 сервер сам ставит эту cookie после/auth.
Создание и изменение сущностей
| Метод | Content-Type | Поведение |
|---|---|---|
| POST | application/x-www-form-urlencoded | Частичное обновление: передаёте только те поля, которые меняете. Остальное остаётся как было. |
| PUT | application/xml | Тело запроса — сама сущность. Поля, отсутствующие в теле, получат значения по умолчанию при создании и сохранят свои значения при обновлении. |
- Успешное создание → HTTP
201 Created. - Успешное обновление → HTTP
200 OK. - Отдельная сущность — XML-документ; список сущностей — XML-документ, корневой элемент которого содержит элементы-сущности.
Пустая плашка GET — метод только читает данные. Залитая POST, PUT или DELETE — метод изменяет данные на сервере.
Если передаёте русские символы в теле JSON (например, комментарий к изъятию), явно указывайте Content-Type: application/json;charset=UTF-8 — иначе текст побьётся.
Форматы дат
| Формат | Где встречается |
|---|---|
yyyy-MM-dd | Большинство методов v2: dateFrom, dateTo, from, to |
yyyy-MM-ddTHH:mm:ss | Метки времени балансов, dateIncoming в документах |
yyyy-MM-ddTHH:mm:ss.SSS | События, фильтры по дате в OLAP |
DD.MM.YYYY | Старые отчёты v1 и загрузка накладных (dateIncoming, dueDate) |
dd.MM.yyyy в v2 формально принимается, но не рекомендуется — используйте ISO.
03Авторизация и лицензионные слоты
/resto/api/auth?login=[login]&pass=[sha1passwordhash]| Параметр | Описание |
|---|---|
login | Логин пользователя бэк-офиса |
pass | SHA1-хеш пароля (hex, нижний регистр) |
В ответе: строка-токен. Её нужно передавать в каждом следующем запросе — как cookie key или как параметр key.
/resto/api/logout?key=[token]Завершает сессию и освобождает слот лицензии. Работает и с cookie key без параметра.
Каждая авторизация занимает слот лицензии API. Токен живёт, пока не перестанет работать. Если лицензия на сервере одна, а токен вы уже получили — следующий запрос на авторизацию вернёт ошибку.
Практика: либо храните токен и переиспользуйте его, либо обязательно вызывайте /logout после работы. Худший сценарий — авторизоваться в цикле и не выходить.
Время жизни сессии
Типовой таймаут — 1 час от входа или от последнего запроса. Обновление токена в REST API v1/v2 не реализовано, поэтому после 401 просто авторизуйтесь заново.
Права доступа
Права проверяются по пользователю, под которым вы вошли. Самые частые требования:
| Код права | Название | Нужно для |
|---|---|---|
B_ADM | Администрирование системы | Настройки предприятия |
B_EN | Редактирование номенклатурных справочников | Экспорт и импорт номенклатуры |
B_VTJ | Просматривать журнал событий | API событий |
B_QMENU | Просматривать быстрое меню | API быстрого меню |
B_APIO | Просматривать типы внесений/изъятий | Справочник payInOutTypes |
F_APIO | Авторизовывать кассовые внесения и изъятия | Выполнение изъятий |
04Ошибки
Любой метод v1 или v2 вместо ожидаемого ответа может вернуть ошибку с телом text/plain.
| Код | Значение | Что делать |
|---|---|---|
| 400 | Ошибка в запросе: не тот тип параметра, ошибка десериализации, неполные данные. Wrong date format: 2019-0513 15:26, Malformed Product id: '' | Исправить запрос |
| 401 | Не аутентифицирован: не передан key, истёк таймаут сессии, сервер перезагрузился или ещё стартует и не может проверить пароль | Авторизоваться заново |
| 403 | Доступ запрещён: нет лицензии на этот модуль API (Module %s is blocked within current license), исчерпано количество подключений (License enhancement is required: no connections available for module %s), не хватает права (Permission denied) | Показать пользователю. Текст не локализован |
| 404 | Объект не найден или некорректный путь | Сообщить пользователю или разработчику |
| 409 | Ошибка бизнес-логики. Сервер возвращает сообщение для человека: «Доступ запрещён КОД_ПРАВА», «Операция создаёт приход на отрицательные остатки…», «У вас нет права изменять документы задним числом», «Невозможно создать накладную со складами, принадлежащими разным подразделениям» — и сотни других | Показать текст пользователю как есть |
| 500 | Внутренняя ошибка: product == null, java.net.SocketException: Connection reset, Operation is allowed only in %s's thread, One product expected for article=%s but %d found | Залогировать, при необходимости — обращение в поддержку |
Как читать тело ошибки
- Тело
Content-Type: text/plain— это текст ошибки. Показывайте его при409и всегда пишите в собственный лог. - Тело
text/html— это не ошибка Syrve. Это сетевая проблема или ошибка конфигурации: опечатка в URL, сбой DNS, настройки прокси, «пустой» Tomcat без сервера RMS/Chain; реже — рестарт сервера. - Текст может содержать обязательные переносы строк — выводите с
white-space: pre-line. - Текст не экранирован и может содержать опасные для HTML/JS/SQL символы. Экранируйте сами.
- Логи сервера (
full.log,access.csv) содержат больше, чем видит клиент API, — в частности предупреждения уровня WARN.
Сколько слотов лицензии осталось
/resto/api/licence/info?moduleId={moduleId}Возвращает количество свободных слотов для конкретного лицензионного модуля, например ?moduleId=28008806. Дату окончания лицензии этот метод не возвращает.
05Ограничения и советы
Сервер заведения — не облако. Он одновременно обслуживает кассы, и неудачный запрос из API способен его подвесить.
- Запросы — строго последовательно. Следующий отправляйте только после того, как завершился предыдущий. Параллельные вызовы не поддерживаются.
- Период — не больше месяца. Идеально — день или неделя.
- Отключайте итоги. Если общие итоги в OLAP не нужны —
build-summary=false. Для больших сетейtrueможет подвесить сервер. С версии 9.1.2 значение по умолчанию и такfalse. - Не больше 7 полей в построении OLAP-отчёта.
- Сначала демо-сервер. Проверяйте запросы на демо-стенде, а не на рабочем сервере клиента.
- Тяжёлые поля — ночью.
StartBalance.*иFinalBalance.*в OLAP суммируют всю таблицу проводок за всё время работы системы. Для остатков используйте отдельное API балансов (раздел 16).
06Ревизии и синхронизация
Почти каждый метод-«список» поддерживает параметр revisionFrom. Это главный механизм инкрементальной синхронизации: вместо того чтобы каждый раз тянуть весь справочник, вы забираете только то, что изменилось.
| Параметр | Тип | Поведение |
|---|---|---|
revisionFrom | число | Возвращает сущности с ревизией строго большей указанной. По умолчанию -1 — то есть полный, неревизионный запрос |
Правильный цикл синхронизации
- Первый запрос:
revisionFrom=-1— получаете всё. - Из ответа запоминаете поле
revision— это максимальная ревизия, доступная для выгрузки на момент запроса. - Следующий запрос:
revisionFrom={сохранённая revision}— приходят только изменения. - Повторяете.
В журнале событий параметр называется from_rev, и туда нужно передавать revision + 1 из предыдущего ответа, потому что граница там включительная. Также: если работаете по ревизии, нельзя указывать to_time.
Поддержка revisionFrom в большинстве методов v1 появилась в версии 6.4, в методах v2 — с самого начала.
07Структура предприятия
Иерархия подразделений
/resto/api/corporation/departments/Версия 3.9 · параметр revisionFrom с 6.4 · ответ: corporateItemDto
| Код типа | Что это |
|---|---|
CORPORATION | Корпорация |
JURPERSON | Юридическое лицо |
ORGDEVELOPMENT | Структурное подразделение |
DEPARTMENT | Торговое предприятие (заведение) |
MANUFACTURE | Производство |
CENTRALSTORE | Центральный склад |
CENTRALOFFICE | Центральный офис |
SALEPOINT | Точка продаж |
STORE | Склад |
Поля corporateItemDto
| Поле | Описание |
|---|---|
id | GUID объекта иерархии |
parentId | GUID родительского объекта |
code | Код |
name | Наименование |
type | Тип из таблицы выше |
taxpayerIdNumber | Налоговый номер юрлица (в Украине — ЕГРПОУ / ИНН) |
jurPersonAdditionalPropertiesDto | С 6.3: расширенные реквизиты юрлица, в том числе iban и swiftBic — именно то, что нужно для украинской отчетности |
Склады
/resto/api/corporation/stores/Все склады торговых предприятий в виде corporateItemDto
Группы отделений и точки продаж
/resto/api/corporation/groups/Версия 4.3 · ответ: groupDto
В группе отделений может быть несколько точек продаж, но главная касса (pointOfSaleDto/main = true) подключается только к одной. В Syrve Chain информация о кассе точки продаж (cashRegisterInfo) может отсутствовать.
Режим обслуживания группы — groupServiceMode: FAST_FOOD, TABLE_SERVICE, PETROLEUM.
Терминалы
/resto/api/corporation/terminals/Версия 4.3 · ответ: terminalDto (id, name, computerName, anonymous, groupInfo, restaurantSectionIds)
Обычно интересны только фронтовые терминалы. Они различаются по полю anonymous: у касс — false, у бэк-офисов и системных терминалов — true.
Поиск
/resto/api/corporation/departments/search?code={regex}/resto/api/corporation/stores/search?code={regex}/resto/api/corporation/groups/search?name={regex}&departmentId={uuid}/resto/api/corporation/terminals/search?name={regex}&computerName={regex}&anonymous=falseВсе code и name — регулярные выражения. Если передать просто строку, ищется любое ее вхождение с учетом регистра. Поиск заведения по коду имеет смысл преимущественно в Syrve Chain: в пределах одного RMS сущность типа DEPARTMENT только одна.
Работает только если коды складов заполнены. Поле необязательное и по умолчанию пустое.
Настройки предприятия
/resto/api/corporation/settingsВерсия 6.2 · требуется право B_ADM
{ "vatAccounting": "VAT_INCLUDED_IN_PRICE" }
VAT_INCLUDED_IN_PRICE — НДС включен в закупочную цену; VAT_NOT_INCLUDED_IN_PRICE — не включен. Это определяет, как считать суммы в накладных.
08Справочники и счета
Универсальный метод справочников
/resto/api/v2/entities/list?rootType={Type}Версия 5.0 · rootType можно передавать несколько раз
| rootType | С версии | Что возвращает |
|---|---|---|
Account | 5.0 | Счета, в том числе склады |
AccountingCategory | 5.0 | Бухгалтерская категория номенклатуры |
AlcoholClass | 5.0 | Класс алкогольной продукции |
AllergenGroup | 7.1.2 | Группа аллергенов |
AttendanceType | 6.4 | Тип явки сотрудника |
Conception | 7.8.1 | Концепция |
CookingPlaceType | 7.0.2 | Тип места приготовления |
DiscountType | 5.0 | Тип скидки |
MeasureUnit | 5.0 | Единица измерения |
OrderType | 6.4 | Тип заказа |
PaymentType | 5.0 | Тип оплаты |
ProductCategory | 5.0 | Пользовательская категория номенклатуры |
ProductScale | 6.4 | Шкала размеров |
ProductSize | 6.4 | Размер продукта |
ScheduleType | 6.4 | Тип смены |
TaxCategory | 6.2.2 | Налоговая категория (ставка НДС) |
Параметры
| Параметр | Описание |
|---|---|
includeDeleted | true/false. По умолчанию — включать удаленные |
revisionFrom | Инкрементальная выборка, см. раздел 6 |
format | Устарел с 6.2.2, не используется |
Формат ответа
| Поле | Описание |
|---|---|
id | GUID объекта |
rootType | Тип, который вы передали |
deleted | true — помечен удаленным |
code | Код, артикул, табельный номер. Строка, может быть null |
name | Название. Для системных объектов — на языке запроса (заголовок Accept-Language) |
Дополнительные поля по типам
| Тип | Поле | Значение |
|---|---|---|
OrderType | orderServiceType | COMMON — обычный заказ; DELIVERY_BY_COURIER — доставка курьером; DELIVERY_PICKUP — самовывоз |
OrderType | defaultForServiceType | Тип заказа по умолчанию для этого режима |
ProductSize | shortName | Краткое название размера |
TaxCategory | vatPercent | Ставка НДС |
GET /resto/api/v2/entities/list?rootType=DiscountType&rootType=PaymentType&includeDeleted=false
[
{ "id":"97ab68db-…","rootType":"DiscountType","deleted":false,"code":null,"name":"Скидка 20%" },
{ "id":"09322f46-…","rootType":"PaymentType", "deleted":false,"code":"CASH","name":"Наличные" },
{ "id":"9e250341-…","rootType":"PaymentType", "deleted":false,"code":null, "name":"Безналичный расчет" }
]
Он возвращает общую справочную информацию без привязки к подразделениям и срокам действия. В результате могут быть записи (например, типы оплат), запрещенные к применению в конкретном подразделении. Используйте его, чтобы получить названия объектов для отображения в отчетах, — не для бизнес-логики.
Только идентификаторы
/resto/api/v2/entities/{entityType}/idsВерсия 9.1 · возвращает плоский массив GUID. Принимает includeDeleted и revisionFrom. Пример: /resto/api/v2/entities/Account/ids?includeDeleted=false&revisionFrom=10
Счета
/resto/api/entities/accounts/listПараметры: includeDeleted (с 5.4), revisionFrom (с 6.4)
| Поле | Описание |
|---|---|
id | GUID счета |
accountParentId | GUID родительского счета; у складов — null |
parentCorporateId | GUID объекта структуры корпорации, которому принадлежит склад |
code | Код счета, например 5.01 |
name | Название; для системных счетов — на языке запроса |
type | Тип счета, см. раздел 21 |
system | true — предустановленный склад на standalone RMS |
customTransactionsAllowed | Разрешены ли ручные проводки |
rootType | С 6.2.2 — всегда Account |
Метод возвращает только справочную информацию: без балансов и без материально ответственных лиц. Балансы — в разделе 16.
09Номенклатура
Требуется право B_EN «Редактирование номенклатурных справочников» — и на чтение, и на запись.
Элементы номенклатуры
/resto/api/v2/entities/products/listВерсия 6.1
| Параметр | С версии | Тип | Описание |
|---|---|---|---|
includeDeleted | 6.1 | Boolean | Включать удаленные. По умолчанию false |
ids | 6.2 | List<UUID> | Фильтр по GUID |
nums | 6.2 | List<String> | Фильтр по артикулу |
types | 6.2 | List<ProductType> | Фильтр по типу |
categoryIds | 6.2 | List<UUID> | Фильтр по категории продукта |
parentIds | 6.2 | List<UUID> | Фильтр по родительской группе |
Чтобы отобрать элементы, у которых поле пустое, передайте параметр без значения: parentId=. На сервере это станет списком из одного элемента [null].
Несколько значений — повторением параметра: parentId=111&parentId=222&parentId=333 → [111, 222, 333]. Комбинация parentId=111&parentId=222&parentId= → [111, 222, null].
Основные поля
| Поле | С версии | Тип | Описание |
|---|---|---|---|
id | 6.1 | UUID | Идентификатор |
deleted | 6.1 | Boolean | Удален |
name | 6.1 | String | Название |
description | 6.1 | String | Описание |
num | 6.1 | String | Артикул — используется при печати документов и техкарт |
code | 6.1 | String | Код быстрого поиска на экране редактирования заказа |
parent | 6.1 | UUID | Родительская группа; null — корневая |
type | 6.1 | Enum | GOODS товар · DISH блюдо · PREPARED заготовка (полуфабрикат) · SERVICE услуга · MODIFIER модификатор · OUTER внешние товары поставщиков · RATE тариф (дочерний к услуге) |
mainUnit | 6.1 | UUID | Основная единица измерения |
taxCategory | 6.1 | UUID | Налоговая категория (ставка НДС) |
category | 6.1 | UUID | Пользовательская категория |
accountingCategory | 6.1 | UUID | Бухгалтерская категория |
defaultSalePrice | 6.1 | BigDecimal | Цена по умолчанию, грн (если нет приказов о меню) |
defaultIncludeInMenu | 6.1 | Boolean | Включать ли позицию в меню по умолчанию |
placeType | 6.1 | UUID | Место приготовления. Обязательно, если defaultIncludeInMenu = true |
excludedSections | 6.1 | Set<UUID> | Отделения, где это блюдо продавать нельзя |
unitWeight | 6.1 | BigDecimal | Вес одной единицы, кг |
unitCapacity | 6.1 | BigDecimal | Объем одной единицы, л |
notInStoreMovement | 6.1 | Boolean | Участвует ли в перемещениях по складу |
color, fontColor | 6.2 | RGBColorDto | Цвет фона и шрифта кнопки на кассе: {red, green, blue} |
frontImageId | 6.2 | UUID | Изображение для кассы |
position | 6.2 | Integer | Позиция в меню |
modifiers | 6.2 | List | Модификаторы (без учета схем модификаторов) |
containers | 6.2.4 | List | Фасовки |
modifierSchemaId | 6.4 | UUID | Схема модификаторов |
productScaleId | 6.4 | UUID | Шкала размеров. Если задана схема модификаторов — шкала берется из нее |
coldLossPercent | 7.1.2 | BigDecimal | Потери при холодной обработке, % |
hotLossPercent | 7.1.2 | BigDecimal | Потери при горячей обработке, % |
allergenGroups | 7.1.5 | Set<UUID> | Группы аллергенов |
canSetOpenPrice | 7.4.4 | Boolean | Свободная цена |
useBalanceForSell | — | Boolean | Товар продается на вес |
barcodes | 8.7.1 | List | Штрихкоды: {barcode, containerId} |
Модификатор — ChoiceBindingDto
| Поле | Тип | Описание |
|---|---|---|
modifier | UUID | GUID модификатора или номенклатурной группы, если модификатор групповой |
defaultAmount | Integer | Количество по умолчанию. У группового = сумме значений дочерних |
freeOfChargeAmount | Integer | Количество бесплатных. Не больше максимального |
minimumAmount | Integer | Минимальное количество. Для обязательного модификатора должно быть > 0 |
maximumAmount | Integer | Максимальное количество |
hideIfDefaultAmount | Boolean | Скрывать, если количество по умолчанию |
required | Boolean | Обязательный. С 6.2.3 в ответе не используется |
childModifiersHaveMinMaxRestrictions | Boolean | Ограничения min/max у дочерних. У дочерних и одиночных должно быть false |
splittable | Boolean | Делимость. Только для схем модификаторов |
childModifiers | List | Дочерние модификаторы |
Фасовка — ContainerDto
| Поле | Описание |
|---|---|
id, num, name | Идентификатор, артикул, название |
count | Количество продукта в основных единицах измерения |
containerWeight | Вес тары |
fullContainerWeight | Вес вместе с тарой |
minContainerWeight, maxContainerWeight | Мин./макс. вес элемента номенклатуры |
useInFront | Использовать на кассе |
backwardRecalculation | Всегда false |
deleted | Удалена |
Создание элемента
/resto/api/v2/entities/products/saveВерсия 6.1 · тело — JSON
| Параметр URL | Описание |
|---|---|
generateNomenclatureCode | Генерировать ли артикул. По умолчанию true |
generateFastCode | Генерировать ли код быстрого поиска. По умолчанию true |
Обязательные поля тела
| Поле | Обязательное | Примечание |
|---|---|---|
name | да | Название |
type | да | GOODS, DISH, PREPARED, MODIFIER, SERVICE, RATE |
mainUnit | да | GUID единицы измерения |
num | условно | Обязателен, если generateNomenclatureCode = false |
placeType | условно | Обязателен, если defaultIncludeInMenu = true |
accountingCategory | нет | По умолчанию «товар» |
unitWeight | нет | По умолчанию 1 |
unitCapacity, defaultSalePrice | нет | По умолчанию 0 |
Редактирование, удаление, восстановление
/resto/api/v2/entities/products/updateТело — то же, что и для save, плюс id элемента. Параметры URL: overrideFastCode, overrideNomenclatureCode (оба по умолчанию false)
/resto/api/v2/entities/products/delete/resto/api/v2/entities/products/restoreТело: {"items":[{"id":"…"},{"id":"…"}]}. У restore есть параметр overrideNomenclatureCode (с 6.4): если артикул восстанавливаемого продукта совпадает с действующим, будет сгенерирован новый.
{
"result": "SUCCESS",
"errors": null,
"response": [ { "id":"fcdf4324-…", "deleted":true, "name":"test API-6", … } ]
}
Номенклатурные группы
/resto/api/v2/entities/products/group/list/resto/api/v2/entities/products/group/save/resto/api/v2/entities/products/group/update/resto/api/v2/entities/products/group/deleteВерсия 6.2 · параметры списка: includeDeleted, ids, parentIds, nums и codes (с 6.2.3), revisionFrom (с 6.4)
Поля ProductGroupDto повторяют поля продукта в части id, deleted, name, description, num, code, parent, плюс настройки отображения группы на кассе.
Пользовательские категории
/resto/api/v2/entities/products/category/list/resto/api/v2/entities/products/category/save/resto/api/v2/entities/products/category/update/resto/api/v2/entities/products/category/delete/resto/api/v2/entities/products/category/restoreШкала и размеры
/resto/api/v2/entities/productScales/resto/api/v2/entities/productScales/{productScaleId}/resto/api/v2/entities/productScales/save/resto/api/v2/entities/productScales/update/resto/api/v2/entities/productScales/delete/resto/api/v2/entities/productScales/restore/resto/api/v2/entities/products/{productId}/productScale/resto/api/v2/entities/products/productScalesВерсия 6.4 · шкала размеров и привязка размеров к продуктам
Изображения
/resto/api/v2/images/load?imageId={imageId}/resto/api/v2/images/save/resto/api/v2/images/deleteGUID загруженного изображения подставляется в поле frontImageId элемента номенклатуры.
Быстрое меню
/resto/api/v2/entities/quickLabels/list/resto/api/v2/entities/quickLabels/save/resto/api/v2/entities/quickLabels/updateТребуется право B_QMENU
Быстрое меню состоит из трех страниц, каждая — сетка 3 × 8. В ячейке — либо элемент номенклатуры, либо группа.
| Поле | Тип | Описание |
|---|---|---|
id | UUID | Идентификатор быстрого меню |
dependsOnWeekDay | boolean | Зависит ли меню от дня недели |
departmentId | UUID | Подразделение, для которого действует меню |
sectionId | UUID | Отделение. null — меню для всего подразделения |
pageNames | List<String> | Названия страниц — ровно три |
labels[].day | Integer | День недели: 0 — понедельник … 6 — воскресенье, или null |
labels[].page | Integer | Страница: 0, 1, 2 |
labels[].x | Integer | X-координата: 0, 1, 2 |
labels[].y | Integer | Y-координата: 0…7 |
labels[].entityId | UUID | GUID сущности |
labels[].entityType | Enum | PRODUCT или PRODUCT_GROUP |
10Технологические карты
/resto/api/v2/assemblyCharts/getAll?dateFrom={d}&dateTo={d}&includeDeletedProducts=true&includePreparedCharts=falseВсе техкарты за период
/resto/api/v2/assemblyCharts/getAllUpdate?knownRevision={n}&dateFrom={d}&dateTo={d}Инкрементально: только то, что изменилось после knownRevision
/resto/api/v2/assemblyCharts/getTree?date={d}&productId={uuid}&departmentId={uuid}Дерево техкарты — с раскладкой полуфабрикатов
/resto/api/v2/assemblyCharts/getAssembled?date={d}&productId={uuid}&departmentId={uuid}Свернутая («собранная») техкарта
/resto/api/v2/assemblyCharts/getPrepared?date={d}&productId={uuid}&departmentId={uuid}/resto/api/v2/assemblyCharts/byId/resto/api/v2/assemblyCharts/getHistory/resto/api/v2/assemblyCharts/save/resto/api/v2/assemblyCharts/deleteТехкарта — версионная сущность: она действует с определенной даты. Поэтому date / dateFrom–dateTo обязательны, а getHistory показывает всю историю изменений конкретной карты.
Вхождение товара в блюдо
/resto/api/reports/ingredientEntryВерсия 3.9 · обратный поиск: в какие блюда входит этот ингредиент
| Параметр | Значение | Описание |
|---|---|---|
department | GUID | Подразделение |
date | DD.MM.YYYY | На какую дату |
product | GUID | Идентификатор продукта |
productArticle | String | Артикул продукта. Приоритет поиска: сначала productArticle, затем product |
includeSubtree | Boolean | Включать строки поддеревьев. По умолчанию false |
11Цены, приказы, расписания
Ценовые категории
/resto/api/v2/entities/priceCategories/resto/api/v2/entities/priceCategories/byId?id={uuid}Версия 7.8 · параметры списка: includeDeleted, id (список), revisionFrom
| Поле | Тип | Описание |
|---|---|---|
id | UUID | Идентификатор |
name | String | Название |
deleted | boolean | Удалена |
code | String | Код элемента справочника |
assignableManually | boolean | Можно ли назначить вручную на кассе |
pricingStrategy.type | Enum | ABSOLUTE_VALUE — скидка/наценка абсолютным числом; PERCENT — в процентах от базовой цены |
pricingStrategy.delta | BigDecimal | Для ABSOLUTE_VALUE. Знак «−» — скидка, «+» — наценка. В гривнах |
pricingStrategy.percent | BigDecimal | Для PERCENT. Диапазон [−100, +∞) |
{
"result": "SUCCESS",
"errors": [],
"response": [
{ "id":"95035a38-…", "name":"Доставка", "deleted":false, "code":"3",
"assignableManually":true, "pricingStrategy":{ "type":"PERCENT", "percent":-5 } },
{ "id":"67a54111-…", "name":"Плюс 100 грн", "deleted":false, "code":"2",
"assignableManually":false, "pricingStrategy":{ "type":"ABSOLUTE_VALUE", "delta":100 } }
],
"revision": 187420
}
Приказы об изменении прейскуранта
/resto/api/v2/documents/menuChange/resto/api/v2/documents/menuChange/byId?id={uuid}/resto/api/v2/documents/menuChange/byNumber?documentNumber={n}/resto/api/v2/documents/menuChangeВерсия 7.8 · именно этим документом задаются цены продажи
MenuChangeDocumentDto
| Поле | Тип | Описание |
|---|---|---|
id | UUID | Идентификатор |
dateIncoming | String | Учетная дата проведения, yyyy-MM-dd |
documentNumber | String | Учетный номер |
status | Enum | NEW · PROCESSED · DELETED |
comment | String | Комментарий |
shortName | String | Краткое название для кнопок на кассе |
deletePreviousMenu | Boolean | Если true — блюда, которых нет в документе, будут исключены из меню |
scheduleId | UUID | Расписание — для приказа «по времени» |
schedule | PeriodScheduleDto | Развернутое расписание. Только чтение |
dateTo | String | Дата окончания действия (отмены) приказа |
items | List | Позиции приказа |
MenuChangeDocumentItemDto
| Поле | Тип | Описание |
|---|---|---|
num | Integer | Позиция строки. При создании не учитывается |
departmentId | UUID | Подразделение, в котором продается продукт |
productId | UUID | Продукт |
productSizeId | UUID | Размер продукта |
including | Boolean | Включен ли продукт в прейскурант |
price | BigDecimal | Цена, грн |
dishOfDay | Boolean | Хит / блюдо дня |
flyerProgram | Boolean | Участие во флаерной программе |
Редактировать приказ можно только пока его статус NEW. Если id не задан — создается новый документ; если задан — редактируется существующий.
Расписания (периоды действия)
/resto/api/v2/entities/periodSchedules/resto/api/v2/entities/periodSchedules/byId?id={uuid}Версия 7.8 · параметры: includeDeleted, id (список), revisionFrom
| Поле | Тип | Описание |
|---|---|---|
id, name, deleted | — | Идентификатор, название, признак удаления |
periods[].begin | String | Начало полуинтервала, HH:mm |
periods[].end | String | Конец полуинтервала, HH:mm |
periods[].daysOfWeek | List<Integer> | 1 — понедельник … 7 — воскресенье |
В расписаниях (periodSchedules) понедельник — это 1, воскресенье — 7. В быстром меню (quickLabels) понедельник — 0, воскресенье — 6. Легко перепутать.
{
"id": "598ce53a-…",
"name": "Рабочий обед",
"deleted": false,
"periods": [ { "begin":"16:00", "end":"17:00", "daysOfWeek":[1,2,3,4,5] } ]
}
12Складские документы
Документы разделены на два поколения: старые XML-методы /resto/api/documents/… и новые JSON-методы /resto/api/v2/documents/…. Новые появились в 7.9.3 и покрывают акты списания и внутренние перемещения.
Приходная накладная
/resto/api/documents/import/incomingInvoiceВерсия 3.9, редактирование с 5.2 · Content-Type: application/xml · тело: incomingInvoiceDto · ответ: documentValidationResult
| Поле документа | Описание |
|---|---|
documentNumber | Учетный номер документа |
dateIncoming | Дата документа. В этом методе — dd.mm.YYYY |
dueDate | Срок оплаты, dd.mm.YYYY |
incomingDate | С 7.6.1: входящая дата внешнего документа, YYYY-mm-dd. Если не указана — берется из dateIncoming |
incomingDocumentNumber | Входящий номер внешнего документа |
invoice | Номер налоговой накладной / счета-фактуры |
supplier | GUID поставщика |
defaultStore | Склад. Если указан — тот же склад должен быть в каждой позиции |
conception / conceptionCode | Концепция (GUID / код, код — с 7.8) |
status | NEW · PROCESSED · DELETED |
useDefaultDocumentTime | false (по умолч.) — использовать переданные дату-время как есть. true — взять настройки проведения документов из подразделения |
employeePassToAccount | Поле «зачесть сотруднику» |
transportInvoiceNumber | Номер товарно-транспортной накладной |
linkedOutgoingInvoiceId | С 5.4, только чтение: связанная расходная накладная |
distributionAlgorithm | С 6.0, только чтение: DISTRIBUTION_BY_SUM · DISTRIBUTION_BY_AMOUNT · DISTRIBUTION_NOT_SPECIFIED |
Позиция накладной
| Поле | Описание |
|---|---|
num | Обязательное. Номер позиции в документе |
product / productArticle | Товар: GUID или артикул (с 5.0). Хотя бы одно должно быть заполнено; GUID имеет приоритет |
supplierProduct / supplierProductArticle | Товар у поставщика: GUID или артикул |
amount | Количество в основных единицах измерения товара |
actualAmount | Фактическое (подтвержденное) количество основных единиц |
containerId | Фасовка |
amountUnit | Базовая единица измерения |
price | Цена за единицу, грн |
priceWithoutVat | С 6.2: цена без НДС за фасовку с учетом скидки |
sum | Обязательное. Сумма строки без учета скидки. Как правило sum = amount × price / container + discountSum + vatSum |
vatPercent, vatSum | С 5.0: процент и сумма НДС. Если не задана сумма — рассчитывается по проценту; если не задан процент — берется из карточки товара. Задать только сумму без процента нельзя |
store | Склад позиции |
producer | Производитель/импортер. Должен быть в списке производителей в карточке товара |
customsDeclarationNumber | Номер таможенной декларации |
isAdditionalExpense | С 6.0, только чтение: является ли строка дополнительным расходом |
В накладной позиция с товаром в ящиках, базовая единица — кг. 5 ящиков по 1000 грн, в каждом 10 кг:
amount(«в ед.») = 5 × 10 = 50actualAmount(«фактическое количество») = 5 × 10 = 50price(«цена базовой единицы») = 1000 / 10 = 100
Если фасовки нет — все поля заполняются количеством товара в единицах измерения.
<document>
<items>
<item>
<num>1</num>
<product>0F22AA60-E8AE-4C8E-80CD-F1E00B88FEC6</product>
<supplierProduct>BF1DA0F2-B511-431E-BC7D-F2A68715054B</supplierProduct>
<amount>3.00</amount>
<actualAmount>3.00</actualAmount>
<price>10.00</price>
<sum>30.00</sum>
<vatPercent>20.00</vatPercent>
<store>1239d270-1bbe-f64f-b7ea-5f00518ef508</store>
</item>
</items>
<documentNumber>dn-7</documentNumber>
<dateIncoming>17.12.2025</dateIncoming>
<useDefaultDocumentTime>true</useDefaultDocumentTime>
<defaultStore>1239d270-1bbe-f64f-b7ea-5f00518ef508</defaultStore>
<supplier>3F08E41C-AA25-4573-B1E0-60B3B8A09F6A</supplier>
<dueDate>27.12.2025</dueDate>
</document>
Ответ — documentValidationResult
| Поле | Описание |
|---|---|
valid | Результат валидации |
warning | true — ошибка некритичная, это предупреждение |
documentNumber | Номер документа |
otherSuggestedNumber | Новый номер, если старый нарушает уникальность |
errorMessage | Текст ошибки (или только заголовок, если есть additionalInfo). Не всегда локализован |
additionalInfo | Детали. Например, при списании в минус — расшифровка по каждой позиции, дающей отрицательные остатки |
Расходная накладная
/resto/api/documents/import/outgoingInvoiceВерсия 4.4 · Content-Type: application/xml · тело: outgoingInvoiceDto
| Поле | Описание |
|---|---|
dateIncoming | Учетная дата-время. Если не заполнено — время сервера. yyyy-MM-ddTHH:mm:ss |
accountToCode | Счет списания товаров. По умолчанию 5.01 «Расход продуктов» |
revenueAccountCode | Счет выручки. По умолчанию 4.01 «Торговая выручка» |
defaultStoreId / defaultStoreCode | Склад. При создании с проведением — обязателен. Заполняется либо в документе, либо в каждой строке, но не одновременно |
counteragentId / counteragentCode | Контрагент |
conceptionId / conceptionCode | Концепция |
items[].productId / productArticle | Элемент номенклатуры |
items[].price | Обязательное. Цена за фасовку с учетом скидки, грн |
items[].amount | Обязательное. Количество в базовых единицах |
items[].sum | Обязательное. Сумма строки без скидки |
items[].discountSum | Сумма скидки |
items[].vatPercent, vatSum | НДС, с 5.0 |
Распроведение накладных
/resto/api/documents/unprocess/incomingInvoice/resto/api/documents/unprocess/outgoingInvoiceВерсия 7.7 · тело — та же структура документа · ответ — documentValidationResult
Выгрузка накладных
/resto/api/documents/export/incomingInvoice?from={d}&to={d}&supplierId={uuid}/resto/api/documents/export/outgoingInvoice?from={d}&to={d}&supplierId={uuid}Версия 5.4 · даты YYYY-MM-DD, обе включительно (время не учитывается) · supplierId можно повторять; без него возвращаются все накладные за период · revisionFrom с 6.4
/resto/api/documents/export/incomingInvoice/byNumber/resto/api/documents/export/outgoingInvoice/byNumber| Параметр | Тип | Описание |
|---|---|---|
number | String | Номер документа |
currentYear | Boolean | Обязательный. true — только за текущий год, тогда from и to передавать нельзя. false — from и to обязательны |
from, to | YYYY-MM-DD | Границы периода, включительно |
Другие документы (XML)
/resto/api/documents/import/productionDocumentАкт приготовления · версия 3.9 · поля: storeFrom, storeTo, dateIncoming, documentNumber, status, items[] с product, amount, amountUnit, containerId, num
/resto/api/documents/import/salesDocumentАкт реализации · версия 3.9 · поля: accountToCode (по умолч. 5.01), revenueAccountCode (по умолч. 4.01), items[] с productId, storeId, amount, sum, discountSum
/resto/api/documents/import/returnedInvoiceВозврат поставщику · версия 4.4 · ключевые поля: incomingInvoiceNumber и incomingInvoiceDate — исходная приходная накладная, counteragentId
<documentValidationResult>
<valid>false</valid>
<warning>false</warning>
<errorMessage>Cannot find document of type INCOMING_INVOICE by number
'TAKT0001' and date '2016-05-01'</errorMessage>
</documentValidationResult>
Инвентаризация
/resto/api/documents/import/incomingInventoryВерсия 5.1 · тело: incomingInventoryDto · ответ: incomingInventoryValidationResult
/resto/api/documents/check/incomingInventoryВерсия 5.1 · тот же документ, но без проведения — сервер только считает расхождения и возвращает их
Это самая полезная пара методов для мобильного приложения инвентаризации: сначала check, показываете кладовщику расхождения, и только после подтверждения — import.
<incomingInventoryValidationResult>
<valid>true</valid>
<store><id>1239d270-…</id><code>1</code><name>Основной склад</name></store>
<date>2016-07-03T00:26:00+03:00</date>
<items>
<item>
<product><id>c6d6c2f2-…</id><code>00001</code><name>Товар</name></product>
<expectedAmount>13.600000000</expectedAmount>
<expectedSum>535.370000000</expectedSum>
<actualAmount>29.450</actualAmount>
<differenceAmount>15.850000000</differenceAmount>
<differenceSum>623.930000000</differenceSum>
</item>
</items>
</incomingInventoryValidationResult>
В позиции передается productId, amountContainer (количество в фасовке) и, при необходимости, containerId и comment. Один и тот же товар можно указать несколько раз с разными фасовками — сервер просуммирует.
Акты списания (v2)
/resto/api/v2/documents/writeoff?dateFrom={d}&dateTo={d}/resto/api/v2/documents/writeoff/byId?id={uuid}/resto/api/v2/documents/writeoff/byNumber?documentNumber={n}/resto/api/v2/documents/writeoffВерсия 7.9.3 · JSON · параметры выборки: dateFrom и dateTo (обязательные, yyyy-MM-dd), status, revisionFrom
Обязательные поля при создании: dateIncoming, status, storeId, accountId и минимум одна позиция. В позиции обязательны productId и amount. Если documentNumber не задан — сгенерируется автоматически. Редактировать можно только документ со статусом NEW.
POST /resto/api/v2/documents/writeoff
{
"dateIncoming": "2026-08-16T23:00",
"status": "NEW",
"comment": "Порча",
"storeId": "7954d76d-6177-402c-ba2a-cc0ff16486fa",
"accountId": "8c46f55a-0698-4e3f-8703-8bb36b24e8ac",
"items": [ { "productId": "50cedffc-04e9-aa79-016b-d1f9c56122e8", "amount": 1 } ]
}
Внутренние перемещения (v2)
/resto/api/v2/documents/internalTransfer?dateFrom={d}&dateTo={d}/resto/api/v2/documents/internalTransfer/byId?id={uuid}/resto/api/v2/documents/internalTransfer/byNumber?documentNumber={n}/resto/api/v2/documents/internalTransferВерсия 7.9.3 · обязательные: dateIncoming, status, storeFromId, storeToId и минимум одна позиция
{
"dateIncoming": "2026-08-15T06:00",
"status": "NEW",
"storeFromId": "05a407d4-d7c6-4bc2-a578-6ad5de99d468",
"storeToId": "370620fe-c789-46db-9d92-33bec29b82a3",
"items": [
{ "productId": "ccdada6c-…", "amount": 5, "containerId": "e2e67737-…" },
{ "productId": "8972b757-…", "amount": 5, "containerId": "84d13550-…" }
]
}
В ответе на создание приходит конверт {"result":"SUCCESS","errors":[],"response":{…}} с заполненными num, measureUnitId и cost.
13Поставщики
/resto/api/suppliersВерсия 3.9 · revisionFrom с 6.4 · ответ — структура employees (поставщик в Syrve — это разновидность контрагента)
/resto/api/suppliers/searchПоиск по id не выполняется. Доступные поля:
| Параметр | Поле в карточке |
|---|---|
name | Имя в системе |
code | Таб. номер / код |
phone, cellPhone | Телефон, мобильный телефон |
firstName, middleName, lastName | Имя, отчество, фамилия |
email | |
cardNumber | Номер карты (вкладка «Дополнительные сведения») |
taxpayerIdNumber | Налоговый номер (вкладка «Юр. лицо») |
Прайс-лист поставщика
/resto/api/suppliers/{code}/pricelist?date={DD.MM.YYYY}Версия 3.9 · {code} — это код поставщика, не GUID · без параметра date возвращается последний прайс-лист
| Поле | Описание |
|---|---|
nativeProduct, nativeProductCode, nativeProductNum, nativeProductName | Товар у нас: GUID, код, артикул, название |
supplierProduct, supplierProductCode, supplierProductNum, supplierProductName | Товар у поставщика |
costPrice | Стоимость товара, грн |
allowablePriceDeviation | Допустимое отклонение от цены, % |
container | Фасовка: id, name, count, containerWeight, fullContainerWeight, useInFront |
14Касса и кассовые смены
Список смен
/resto/api/v2/cashshifts/list| Параметр | Значение | Описание |
|---|---|---|
openDateFrom | YYYY-MM-DD | Период открытия смены «с», включительно |
openDateTo | YYYY-MM-DD | Период открытия смены «по», включительно |
departmentId | UUID | Список заведений; пусто — без фильтра |
groupId | UUID | Список групп секций |
status | Enum | Не может быть пустым. ANY · OPEN · CLOSED · ACCEPTED принята · UNACCEPTED не принята · HASWARNINGS подозрительная |
revisionFrom | число | С версии 6.4 |
| Поле ответа | Описание |
|---|---|
id | Идентификатор смены |
sessionNumber | Номер кассовой смены в нумерации кассы |
fiscalNumber | Фискальный номер смены (из ФР) |
cashRegNumber, cashRegSerial | Номер ФР в нумерации Syrve и его серийный номер |
openDate, closeDate, acceptDate | Открытие, закрытие, принятие. acceptDate = null — смена не принята |
managerId | Ответственный менеджер |
responsibleUser | Ответственный кассир |
sessionStartCash | Остаток в кассе на начало дня, грн |
payOrders | Сумма всех заказов с учётом скидки, грн |
sumWriteoffOrders | Сумма заказов, закрытых за счёт заведения |
salesCash, salesCard, salesCerdit | Продажи наличными, картой, в кредит. Да, в salesCerdit опечатка в самом API |
payIn | Сумма всех внесений |
payOut | Сумма всех изъятий, без учёта изъятия в конце смены |
payIncome | Сумма изъятия в конце смены |
cashRemain | Остаток в кассе после закрытия смены |
cashDiff | Общее расхождение книжных и фактических сумм |
sessionStaus | Статус смены. Снова опечатка в оригинальном названии поля |
conception, pointOfSale | Концепция и точка продаж смены |
Смена по идентификатору
/resto/api/v2/cashshifts/byId/{sessionId}/resto/api/v2/cashshifts/closedSessionDocument/{id}Второй метод возвращает документ принятия кассовой смены
Платежи, внесения и изъятия за смену
/resto/api/v2/cashshifts/payments/list/{sessionId}?hideAccepted=falseВерсия 5.4
| Поле | Описание |
|---|---|
sessionId | GUID запрошенной смены |
cashlessRecords | Безналичные платежи |
payInRecords | Внесения |
payOutRecords | Изъятия |
Запись проводки — info
| Поле | Описание |
|---|---|
id | GUID проводки |
date | Учётный день, округлённый до суток (для оплат заказов) |
creationDate | Дата с привязкой ко времени. Может быть меньше date, если «конец учётного дня» ≠ 00:00 |
group | CARD безнал · CREDIT кредит · PAYOUT изъятие · PAYIN внесение |
accountId | Редактируемый счёт — обычно конечный счёт проводки |
counteragentId, paymentTypeId, type, sum, comment | Контрагент, тип оплаты, тип проводки, сумма, комментарий |
auth.user, auth.card | Авторизационные данные: пользователь, номер карты |
causeEvenId | GUID события оплаты заказа |
cashierId, departmentId | Кассир, заведение |
cashFlowCategory | Статья движения денежных средств: code, parentCategory, type (OPERATIONAL/INVESTMENT/FINANCE) |
Рядом с info есть actualSum и originalSum: первая — сумма из документа закрытия смены (если он её скорректировал), вторая — сумма самой проводки. Аналогично editedPayAccountId и originalPayAccountId.
Типы внесений и изъятий
/resto/api/v2/entities/payInOutTypes/list?includeDeleted=falseТребуется право B_APIO
| Поле | Описание |
|---|---|
id | GUID типа внесения/изъятия |
chiefAccount | GUID шеф-счёта |
account | GUID корр. счёта. При изъятии средства уходят на корр. счёт, при внесении — наоборот |
counteragentType | NONE · COUNTERAGENT · EMPLOYEE · SUPPLIER · CLIENT · INTERNAL_SUPPLIER |
transactionType | Тип проводки, см. раздел 21 |
cashFlowCategory | Статья ДДС |
conception | Концепция: id, code, name |
limit | Предельная сумма для внесений/изъятий на кассе, грн |
mandatoryFrontComment | Требовать комментарий к операции на кассе |
Выполнить изъятие
/resto/api/v2/payInOuts/addPayOutВерсия 6.0 · требуется право F_APIO · Content-Type: application/json;charset=UTF-8
| Поле | Тип | Описание |
|---|---|---|
payOutTypeId | UUID | Тип изъятия |
payOutDate | String | yyyy-MM-dd. Время проставляется текущее |
counteragent | UUID | Контрагент — в зависимости от типа изъятия |
departmentSumMap | UUID → BigDecimal | Заведение → сумма изъятия, грн |
payrollId | UUID | Платёжная ведомость. Указывается, если изъятие идёт на корр. счёт «Текущие расчёты с сотрудниками» |
comment | String | Комментарий |
{
"payOutTypeId": "114c757f-bac4-422c-a184-0935923b60b8",
"payOutDate": "2026-08-13",
"counteragent": "d244cb85-9115-4b4d-8e02-a4f7fdd8ec15",
"departmentSumMap": { "372f68b4-8e7a-bae1-015f-0f9c638f000d": 4500.00 },
"comment": "Аванс поставщику"
}
# Ответ
{ "result": "SUCCESS", "errors": null, "payOutSettings": { … } }
При ошибке result = ERROR, а errors содержит список объектов с кодом и текстом ошибки.
Платёжные ведомости
/resto/api/v2/payrolls/list?dateFrom={d}&dateTo={d}&department={uuid}Версия 6.0 · даты yyyy-MM-dd, включительно · есть includeDeleted
Возвращает payrollId, dateFrom, dateTo, department, documentNumber, status (NEW/PROCESSED/DELETED), comment.
15Сотрудники
Список и поиск
/resto/api/employees?includeDeleted=false/resto/api/employees/byDepartment/{departmentCode}/resto/api/employees/byId/{employeeUUID}/resto/api/employees/byCode/{employeeCode}/resto/api/employees/search?firstName={regex}&middleName={regex}Версия 4.0 · includeDeleted с 5.0 · revisionFrom с 6.4
Поиск работает по любому текстовому или булевому полю DTO — регулярным выражением: address, cardNumber, cellPhone, client, code, email, employee, firstName, lastName, login, mainRoleCode, middleName, name, note, phone, supplier. Без параметров возвращает всех активных.
В Syrve RMS byDepartment идентичен обычному списку; разница появляется только в Syrve Chain.
Создание и редактирование
/resto/api/employees/byId/{UUID}Полная замена. Новый id → 201 Created. Существующий id → 200 OK и все поля перезаписываются: не указали необязательное поле — оно сбросится
/resto/api/employees/byId/{employeeUUID}Частичное обновление. Поля, не указанные в запросе, остаются без изменений. Content-Type: application/x-www-form-urlencoded
/resto/api/employees/byCode/{employeeCode}Создание нового сотрудника. Учитывается только код, переданный в теле PUT-запроса. employeeCode попадает в поле «Табельный номер»
/resto/api/employees/byId/{employeeUUID}Пустой ответ, если сотрудник удалён (или уже был удалён). Entity of class User not found by id — если GUID не существует
Ключевые поля employee
| Поле | Описание |
|---|---|
id | GUID |
code | Табельный номер. Пуст у системных учётных записей |
name | Имя в системе |
login | Логин для входа в бэк-офис |
password | Пароль бэк-офиса. Только на запись, в ответе не возвращается |
pinCode | PIN для входа на кассу. Только на запись |
mainRoleCode / mainRoleId | Основная должность. Входит в roleCodes / rolesIds |
roleCodes / rolesIds | Все должности сотрудника |
firstName, middleName, lastName | Имя, отчество, фамилия |
phone, cellPhone, email, address, birthday, note | Справочная информация |
hireDate, hireDocumentNumber | Дата и номер приказа о приёме |
fireDate | С 5.4: дата увольнения |
cardNumber | Номер карты сотрудника |
taxpayerIdNumber | Налоговый номер (в Украине — ИНН) |
gln | С 6.0: Global Location Number — для поставщиков |
preferredDepartmentCode | С 5.0: подразделение, в котором смены назначаются в первую очередь |
departmentCodes | Назначенные подразделения. null — все, существующие и будущие |
responsibilityDepartmentCodes | Подразделения, где сотрудник является ответственным. null — все |
supplier, employee, client | Признаки роли контрагента |
activationDate, deactivationDate, deleted | Активация, деактивация, удаление |
В поле externalData / publicExternalData можно хранить собственные пары ключ-значение. Формат — XML внутри значения параметра, корень произвольный:
<r><entry><key>crm_id</key><value>18734</value></entry></r>
key обязателен, value может быть пустым.
Должности
/resto/api/employees/rolesrevisionFrom с 6.4
| Поле | Описание |
|---|---|
id, code, name | Идентификатор, код, название должности |
paymentPerHour | Оплата за час, грн |
steadySalary | С 6.2.2, только чтение: оклад за месяц, грн |
scheduleType | Стратегия расчёта зарплаты: SESSION за смену · HOURS почасово · FIXED оклад |
Оклады
/resto/api/employees/salary/resto/api/employees/salary/byId/{employeeUUID}/resto/api/employees/salary/byId/{employeeUUID}/{YYYY-MM-DD}Третий вариант — оклад на конкретную дату. Установка оклада — POST на /resto/api/employees/salary
Смены и расписания
/resto/api/employees/schedule/types/resto/api/employees/schedule/?from={d}&to={d}&withPaymentDetails={bool}&revisionFrom=-1/resto/api/employees/schedule/byEmployee/{employeeUUID}/?from={d}&to={d}/resto/api/employees/schedule/byDepartment/{departmentCode}/?from={d}&to={d}/resto/api/employees/schedule/department/{departmentId}/?from={d}&to={d}/resto/api/employees/schedule/byId/{scheduleUUID}/resto/api/employees/schedule/create/resto/api/employees/schedule/updateДаты YYYY-MM-DD. withPaymentDetails=true добавляет расчёт оплаты. Есть варианты byDepartment/{code} (по коду подразделения) и department/{id} (по GUID), а также комбинация с byEmployee
Явки
/resto/api/employees/attendance/types/resto/api/employees/attendance?from={d}&to={d}&withPaymentDetails={bool}&revisionFrom=-1/resto/api/employees/attendance/byEmployee/{employeeUUID}/?from={d}&to={d}/resto/api/employees/attendance/byDepartment/{departmentCode}/?from={d}&to={d}/resto/api/employees/attendance/department/{departmentId}/?from={d}&to={d}/resto/api/employees/attendance/byId/{attendanceUUID}/resto/api/employees/attendance/create/resto/api/employees/attendance/update/resto/api/employees/availability/list?from={d}&to={d}&department={uuid}&role={uuid}&user={uuid}Последний метод — доступность сотрудников (пожелания по графику)
Бригады официантов
/resto/api/employees/waiterTeams/resto/api/employees/waiterTeams/byDepartment/{departmentUUID}/resto/api/employees/waiterTeams/byCode/{teamCode}/resto/api/employees/waiterTeams/byId/{teamUUID}/resto/api/employees/waiterTeams/search?{param}={regexp}&includeDeleted={bool}/resto/api/employees/waiterTeams/assignments/resto/api/employees/waiterTeams/assignments/byDepartment/{departmentId}assignments — назначения официантов в бригады
16Остатки и отчёты
Остатки на складах
/resto/api/v2/reports/balance/storesВерсия 5.2 · основной способ получить остатки — быстрый, в отличие от OLAP
| Параметр | Описание |
|---|---|
timestamp | Обязательный. Учётная дата-время отчёта, yyyy-MM-ddTHH:mm:ss |
department | GUID подразделения, можно несколько |
store | GUID склада, можно несколько |
product | GUID элемента номенклатуры, можно несколько |
GET /resto/api/v2/reports/balance/stores?timestamp=2026-08-18T23:10:10
[
{ "store":"657ded9f-…", "product":"f464e4d4-…", "amount":123, "sum":64083 },
{ "store":"1239d270-…", "product":"c6d6c2f2-…", "amount":29.45, "sum":1159.3 }
]
amount — количественный остаток, sum — денежный, в гривнах.
Балансы по счетам и контрагентам
/resto/api/v2/reports/balance/counteragentsВерсия 5.2 · параметры: timestamp (обязательный), account, counteragent, department — все можно повторять
[
{ "account":"657ded9f-…", "counteragent":null, "department":"ef9461e9-…", "sum":64083 },
{ "account":"8a11a460-…", "counteragent":null, "department":"ef9461e9-…", "sum":-50 }
]
Это готовый ответ на вопросы «сколько мы должны поставщику» и «сколько денег на счёте» на конкретный момент.
Складские отчёты
/resto/api/reports/storeOperationsВерсия 3.9 · ответ: storeReportItemDto
| Параметр | Значение | Описание |
|---|---|---|
dateFrom, dateTo | DD.MM.YYYY | Период |
stores | GUID | Склады. Пусто — все |
documentTypes | Enum | Типы документов (раздел 21). Пусто — все |
productDetalization | Boolean | true — детализация по товарам, но без даты. false — каждый документ одной строкой с суммами |
showCostCorrections | Boolean | Включать ли корректировки себестоимости. Учитывается только вместе с фильтром по типам документов; иначе корректировки включаются всегда |
presetId | GUID | Преднастроенный отчёт. Если указан — все настройки, кроме дат, игнорируются |
/resto/api/reports/storeReportPresetsСписок преднастроенных складских отчётов, сохранённых в бэк-офисе
/resto/api/reports/productExpenseРасход продуктов по продажам · параметры: department, dateFrom, dateTo, hourFrom, hourTo (по умолчанию -1 — всё время)
/resto/api/reports/salesОтчёт по выручке · дополнительно: dishDetails (разбивка по блюдам, по умолч. false) и allRevenue (true — все типы оплат, false — только выручка)
/resto/api/reports/monthlyIncomePlanПлан по выручке за день · department, dateFrom, dateTo
Отчёты по доставке
У всех методов этой группы общие параметры: department (код или GUID в формате department={code="005"}; без него — по всем подразделениям в Chain), dateFrom, dateTo (DD.MM.YYYY или YYYY-MM-DD).
/resto/api/reports/delivery/consolidatedСводный отчёт: средний чек, количество блюд, количество заказов по дням. Дополнительный параметр writeoffAccounts — счета списания
/resto/api/reports/delivery/couriersОтчёт по курьерам. Целевые показатели: targetCommonTime (по умолч. 30 мин), targetOnTheWayTime, targetDoubledOrders, targetTripledOrders, targetTotalOrders. Тип метрики: AVERAGE, TARGET, MAXIMUM
/resto/api/reports/delivery/orderCycleЦикл заказа. Целевые: targetPizzaTime, targetCuttingTime, targetOnShelfTime, targetInRestaurantTime, targetOnTheWayTime, targetTotalTime
/resto/api/reports/delivery/halfHourDetailedПолучасовой детализированный отчёт
/resto/api/reports/delivery/regionsОтчёт по регионам: среднее время доставки, процент доставленных, максимум заказов за день
/resto/api/reports/delivery/loyaltyЛояльность: новые гости, заказов на гостя. Дополнительно metricType: AVERAGE, MINIMUM, MAXIMUM
17OLAP v1
Простая GET-версия OLAP: все поля передаются параметрами URL. Для новых интеграций рекомендуется v2 (раздел 18), но v1 удобен для быстрых проверок и разовых выгрузок.
/resto/api/reports/olapВерсия 3.9
| Параметр | Значение | Описание |
|---|---|---|
report | SALES · TRANSACTIONS · DELIVERIES · STOCK | Продажи · проводки · доставки · контроль хранения |
from, to | DD.MM.YYYY | Период |
groupRow | имя поля | Группировка по строкам. Повторяемый параметр |
groupCol | имя поля | Группировка по столбцам |
agr | имя поля | Агрегация |
summary | true / false | Считать ли итоги. С 9.1.2 по умолчанию false. С false отчёт строится значительно быстрее |
https://localhost:8080/resto/api/reports/olap
?key=ec621550-afae-133e-80c8-76155db2b268
&report=SALES&from=01.08.2026&to=18.08.2026
&groupRow=WaiterName&groupRow=OpenTime
&agr=fullSum&agr=OrderNum
Самые используемые поля отчёта «Продажи»
| Поле | Описание | Группир. | Агрег. | Тип |
|---|---|---|---|---|
OpenDate.Typed | Дата открытия (для фильтра по дате) | да | нет | DATE |
OpenTime | Время открытия | да | нет | DATETIME |
CloseTime | Время закрытия | да | нет | DATETIME |
DishName | Блюдо | да | нет | STRING |
DishSumInt | Сумма блюда, грн | нет | да | MONEY |
DishDiscountSumInt | Сумма со скидкой, грн | нет | да | MONEY |
DishAmountInt | Количество блюд | нет | да | AMOUNT |
WaiterName | Официант | да | нет | STRING |
OrderNum | Номер заказа | да | да | INTEGER |
PayTypes | Типы оплаты | да | нет | STRING |
SessionNum | Номер кассовой смены | да | нет | INTEGER |
DeletedWithWriteoff | Тип удаления блюда | да | нет | ENUM |
OrderDeleted | Признак удаления заказа | да | нет | ENUM |
DishServicePrintTime.Max | Сервисная печать последнего блюда | нет | да | DATETIME |
Самые используемые поля отчёта «Проводки»
| Поле | Описание | Быстрый остаток | Тип |
|---|---|---|---|
Account.Name | Счёт (в том числе склад) | да | STRING |
Account.Code | Код счёта | да | STRING |
Account.Type | Тип счёта | да | ENUM |
Account.Group | Группа счёта | да | ENUM |
Account.AccountHierarchyTop … Third | Иерархия счёта по уровням | да | STRING |
Contr-Account.Name | Корр. счёт / склад | нет | STRING |
DateTime.DateTyped | Учётный день — поле для фильтра по дате | да* | DATE |
DateTime.Typed | Дата и время | да* | DATETIME |
DateTime.Hour, DayOfWeak, Month, Year | Час, день недели, месяц, год | да* | STRING |
Product.Name, Product.Num | Элемент номенклатуры, артикул | да | STRING |
Product.Hierarchy, TopParent, SecondParent, ThirdParent | Иерархия и группы номенклатуры по уровням | да | STRING |
Product.MeasureUnit | Единица измерения | да | STRING |
Product.AccountingCategory, Product.Category | Бухгалтерская и пользовательская категории | да | STRING |
Counteragent.Name | Контрагент | да | STRING |
Department, Department.Code, Department.JurPerson | Заведение, код, юрлицо | да | STRING |
Conception, Conception.Code | Концепция | да | STRING |
CashFlowCategory и иерархия | Статья ДДС | да | STRING |
Document | Номер документа | нет | STRING |
Amount, Amount.In, Amount.Out | Количество, приход, расход | — | AMOUNT |
Sum.Incoming, Sum.Outgoing | Суммы прихода и расхода, грн | — | MONEY |
Product.AvgSum | Средняя цена, грн | — | MONEY |
StartBalance.Amount, StartBalance.Money | Начальный остаток товара и денег | — | AMOUNT / MONEY |
FinalBalance.Amount, FinalBalance.Money | Конечный остаток товара и денег | — | AMOUNT / MONEY |
PercentOfSummary.ByRow, ByCol | % по строке / по столбцу | нет | PERCENT |
Поля StartBalance.* и FinalBalance.* вычисляются суммированием всей таблицы проводок за всё время работы системы. Такой запрос может выполняться очень долго и замедлить сервер.
С 5.5 такие запросы оптимизированы через балансовые таблицы — но только если группировки и фильтры используют поля, помеченные как «быстрый остаток» (StartBalanceOptimizable). Оптимизировано именно Account.Name (счёт «текущей» стороны проводки, в том числе склад), а не Store.
Правило: склад всегда берите из Account.Name, а не из Store — оно считается значительно быстрее. А для остатков лучше вообще не используйте OLAP: есть /resto/api/v2/reports/balance/stores (раздел 16).
Отчёты по доставке — поля
Группа Delivery.*: Delivery.Number номер доставки, Delivery.Courier курьер, Delivery.Address, Delivery.City, Delivery.Street, Delivery.Region район, Delivery.Phone, Delivery.Email, Delivery.CustomerName, Delivery.CustomerComment, Delivery.DeliveryComment, Delivery.MarketingSource реклама, Delivery.SourceKey источник, Delivery.CancelCause причина отмены, Delivery.ServiceType (PICKUP / COURIER), Delivery.ExpectedTime, Delivery.ActualTime, Delivery.SendTime, Delivery.CloseTime, Delivery.BillTime, Delivery.Delay опоздание в минутах, Delivery.WayDuration время в пути.
18OLAP v2
Рекомендуемая версия. Запрос — JSON в теле POST, а перечень доступных полей можно получить с самого сервера.
Какие поля доступны
/resto/api/v2/reports/olap/columns?reportType={SALES|TRANSACTIONS|DELIVERIES}Версия 4.1 · устаревшие (deprecated) поля не выводятся
"FieldName": {
"name": "Название в бэк-офисе",
"type": "MONEY",
"aggregationAllowed": true,
"groupingAllowed": false,
"filteringAllowed": false,
"tags": ["Оплата"]
}
| Поле | Описание |
|---|---|
FieldName | Имя колонки. Именно его вы передаёте в запросе |
name | Название колонки в бэк-офисе. Справочно |
type | ENUM · STRING · ID (внутренний идентификатор, с 5.0) · DATETIME · INTEGER · PERCENT (0…1) · DURATION_IN_SECONDS · AMOUNT · MONEY |
aggregationAllowed | Можно ли агрегировать |
groupingAllowed | Можно ли группировать |
filteringAllowed | Можно ли фильтровать |
tags | Категории поля — то же, что в правом верхнем углу конструктора отчёта |
Построение отчёта
/resto/api/v2/reports/olapВерсия 4.1 · Content-type: application/json; charset=utf-8
{
"reportType": "SALES",
"buildSummary": false,
"groupByRowFields": ["OpenDate.Typed", "DishName"],
"groupByColFields": [],
"aggregateFields": ["DishDiscountSumInt", "DishAmountInt"],
"filters": {
"OpenDate.Typed": {
"filterType": "DateRange",
"periodType": "CUSTOM",
"from": "2026-08-01T00:00:00.000",
"to": "2026-08-31T00:00:00.000"
},
"OrderDeleted": { "filterType": "IncludeValues", "values": ["NOT_DELETED"] }
}
}
| Поле | Описание |
|---|---|
reportType | SALES продажи · TRANSACTIONS проводки · DELIVERIES доставки |
buildSummary | С 5.3.4. Необязательное. До 9.1.2 по умолчанию true, с 9.1.2 — false |
groupByRowFields | Поля группировки по строкам. Только те, у которых groupingAllowed = true |
groupByColFields | Необязательное. Группировка по столбцам |
aggregateFields | Поля агрегации |
filters | Фильтры. Только поля с filteringAllowed = true |
Каждый OLAP-запрос должен содержать фильтр по дате. Для продаж и доставок это OpenDate.Typed, для проводок — DateTime.DateTyped (дата) или DateTime.Typed (дата-время). В версии 4.1 вместо них использовались OpenDate и DateTime.OperDayFilter.
Фильтр по значению
Для полей типа ENUM и STRING.
"DeletedWithWriteoff": {
"filterType": "ExcludeValues",
"values": ["DELETED_WITH_WRITEOFF", "DELETED_WITHOUT_WRITEOFF"]
}
IncludeValues — берутся только перечисленные значения; ExcludeValues — все, кроме перечисленных.
Фильтр по диапазону
Для INTEGER, PERCENT, AMOUNT, MONEY.
"SessionNum": { "filterType": "Range", "from": 758, "to": 760, "includeHigh": true }
includeLow по умолчанию true, includeHigh — false.
Фильтр по дате
"OpenDate.Typed": {
"filterType": "DateRange",
"periodType": "CUSTOM",
"from": "2026-08-01T00:00:00.000",
"to": "2026-08-03T00:00:00.000",
"includeLow": true,
"includeHigh": false
}
| periodType | Значение |
|---|---|
CUSTOM | Вручную: работают from, to, includeLow, includeHigh |
OPEN_PERIOD | Текущий открытый период |
TODAY / YESTERDAY | Сегодня / вчера |
CURRENT_WEEK / CURRENT_MONTH / CURRENT_YEAR | Текущая неделя / месяц / год |
LAST_WEEK / LAST_MONTH / LAST_YEAR | Прошлая неделя / месяц / год |
Для всех типов, кроме CUSTOM, остальные параметры игнорируются — кроме from: его передавать обязательно, значение может быть любым.
Включать верхнюю границу имеет смысл только для полей, которые выдают округлённую дату, а не дату-время. Для DATETIME оставляйте includeHigh: false, иначе получите лишний день.
Структура ответа
{
"data": [
{ "OpenDate.Typed":"2026-08-01", "DishName":"Борщ",
"DishDiscountSumInt":2450.00, "DishAmountInt":35 }
],
"summary": [
[ {}, { "DishDiscountSumInt":184300.00, "DishAmountInt":2610 } ],
[ { "OpenDate.Typed":"2026-08-01" },
{ "DishDiscountSumInt":6120.00, "DishAmountInt":88 } ]
]
}
data— линейные данные отчёта, по строке на запись. Одна запись = одна строка в гриде бэк-офиса.summary— список блоков из двух структур. Первая — поля группировки, по которым собран промежуточный итог (пустая — это общий итог по отчёту). Вторая — сами итоги по полям агрегации.- При
buildSummary: falseмассивsummaryбудет пустым.
Преднастроенные отчёты
/resto/api/v2/reports/olap/presets/resto/api/v2/reports/olap/presets/{presetType}/resto/api/v2/reports/olap/byPresetId/{presetId}?dateFrom={d}&dateTo={d}Версия 4.2 · presetType: stock, sales, transactions, deliveries
Не составляйте JSON вручную. Постройте нужный OLAP в Syrve Office (раздел «Розничные продажи» → «OLAP-отчёт по продажам» или «Финансы» → «OLAP-отчёт по проводкам»), добавьте поля и период, сохраните под названием — и вызывайте его через byPresetId. Список сохранённых конфигураций отдаёт /presets.
В бэк-офисе сочетание Ctrl + Shift + F3 открывает окно с параметрами текущего OLAP-отчёта — на них удобно ориентироваться, составляя запрос в API.
19Журнал событий
Нужны: лицензионный модуль 2200 (он же API_EVENTS(2200), «iikoAPI (ApiEvents)») и право B_VTJ «Просматривать журнал событий».
Список событий
/resto/api/eventsВерсия 3.9 · ответ: eventsList
| Параметр | Формат | Описание |
|---|---|---|
from_time | yyyy-MM-ddTHH:mm:ss.SSS | С какого времени. По умолчанию — начало текущих суток |
to_time | yyyy-MM-ddTHH:mm:ss.SSS | По какое время, не включительно. По умолчанию границы нет |
from_rev | число | Ревизия. Каждый ответ содержит тег revision; в следующий раз передавайте revision + 1 |
В штатном режиме одно и то же событие повторно с разными ревизиями не приходит, но гарантии этого нет. GUID события уникален — используйте его как ключ дедупликации.
Фильтр по типам событий и номерам заказов
/resto/api/eventsВерсия 5.0 · тело application/xml
<eventsRequestData>
<events>
<event>orderCancelPrecheque</event>
<event>orderPaid</event>
</events>
<orderNums>
<orderNum>175658</orderNum>
</orderNums>
</eventsRequestData>
Дерево типов событий
/resto/api/events/metadata/resto/api/events/metadataВерсия 3.9 (GET) и 5.0 (POST с фильтром) · ответ: groupsList
Возвращает иерархию событий — аналог дерева журнала событий в бэк-офисе. Поле <id> группы или типа — это то, что вы подставляете в <type> события. Структура также определяет список атрибутов, специфичных для каждого события, и severity (0 — низкая, 1 — средняя, 2 — высокая).
Запись собственных событий
/resto/api/events/addВерсия 8.0.3 · тело — eventsList
<eventsList>
<event>
<date>2026-08-28T19:24:29.033+03:00</date>
<type>externalDelivery</type>
<departmentId>2</departmentId>
<attribute>
<name>userName</name><value>Администратор</value>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>success</name><value>1</value>
<type>java.lang.Boolean</type>
</attribute>
</event>
</eventsList>
| type атрибута | Что класть в value |
|---|---|
java.lang.Boolean | "0" — false, "1" — true |
java.lang.String | Текст |
java.util.Date | Дата в формате yyyy-MM-dd'T'HH:mm:ss.SSS |
resto.db.Guid | UUID |
Наследники java.lang.Number (java.lang.Integer, java.math.BigDecimal) | Число |
Наследники resto.db.CachedEntity (User, Department, Terminal) | UUID соответствующего справочника |
Тип события может быть любой строкой до 255 символов. Но если этот тип зарегистрирован в events.xml, событие должно содержать все обязательные для него атрибуты.
Кассовые смены из журнала событий
/resto/api/events/sessions?from_time={t}&to_time={t}Версия 5.0 · время открытия и закрытия, менеджер, номер смены, номер кассы, операционный день
20Репликация
Методы имеют смысл только на Syrve Chain. На отдельном RMS первые два вернут ошибку.
/resto/api/replication/statusesВерсия 5.0 · список статусов последних репликаций всех подключённых к Chain серверов RMS
/resto/api/replication/byDepartmentId/{departmentId}/statusСтатус репликации конкретного заведения. Ошибка, если в Chain нет заведения с таким GUID
/resto/api/replication/serverTypeТип сервера: CHAIN, REPLICATED_RMS, STANDALONE_RMS. Работает везде — удобно как первая проверка того, с чем вы вообще соединились
21Коды базовых типов
Эти строковые константы используются и в параметрах запросов, и в ответах, и как значения enum-фильтров в OLAP. Переводу не подлежат.
Типы документов
| Код | Название | Сокр. |
|---|---|---|
INCOMING_INVOICE | Приходная накладная | п/н |
OUTGOING_INVOICE | Расходная накладная | р/н |
RETURNED_INVOICE | Возвратная накладная | в/н |
INCOMING_INVENTORY | Инвентаризация | инв |
INCOMING_SERVICE | Акт приёма услуг | в/с |
OUTGOING_SERVICE | Акт оказания услуг | в/с |
WRITEOFF_DOCUMENT | Акт списания | а/с |
SALES_DOCUMENT | Акт реализации | а/р |
SALES_RETURN_DOCUMENT | Акт приёма возврата | п/в |
SESSION_ACCEPTANCE | Принятие смены | п/с |
INTERNAL_TRANSFER | Внутреннее перемещение | в/п |
PRODUCTION_DOCUMENT | Акт приготовления | а/пр |
TRANSFORMATION_DOCUMENT | Акт переработки | а/пб |
DISASSEMBLE_DOCUMENT | Акт разбора | а/рб |
PRODUCTION_ORDER | Заказ в производство | з/п |
CONSOLIDATED_ORDER | Консолидированный заказ | к/з |
PREPARED_REGISTER | Ведомость полуфабрикатов | в/пф |
MENU_CHANGE | Приказ об изменении прейскуранта | п/м |
PRODUCT_REPLACEMENT | Замена товаров | з/т |
PAYROLL | Платёжная ведомость | з/в |
INCOMING_CASH_ORDER | Приходный кассовый ордер | п/ко |
OUTGOING_CASH_ORDER | Расходный кассовый ордер | р/ко |
Типы проводок
| Код | Название |
|---|---|
OPENING_BALANCE | Начальный баланс |
CUSTOM | Ручная проводка |
CASH | Продажа за наличные |
CARD | Выручка по картам |
CREDIT | Выручка в кредит |
PREPAY | Предоплата |
PREPAY_CLOSED | Продажа с предоплатой |
PREPAY_RETURN | Возврат предоплаты |
PREPAY_CLOSED_RETURN | Возврат продажи с предоплатой |
DISCOUNT | Скидка |
PAYIN | Внесённая сумма |
PAYOUT | Изъятая сумма |
PAY_COLLECTION | Снятая выручка (инкассация) |
CASH_CORRECTION | Корректировка по кассе |
CASH_SURPLUS | Излишек по кассе |
CASH_SHORTAGE | Недостача по кассе |
INVENTORY_CORRECTION | Инвентаризация |
STORE_COST_CORRECTION | Корректировка себестоимости |
INVOICE | Накладная |
INVOICE_PAYMENT | Оплата накладной |
NDS_INCOMING | НДС входящий |
NDS_SALES | НДС с продаж |
SALES_REVENUE | Выручка от реализации |
OUTGOING_INVOICE | Расходная накладная |
OUTGOING_INVOICE_REVENUE | Выручка расходной накладной |
RETURNED_INVOICE | Возвратная накладная |
RETURNED_INVOICE_REVENUE | Выручка возвратной накладной |
WRITEOFF | Списание |
SESSION_WRITEOFF | Реализация товаров |
TRANSFER | Внутреннее перемещение |
TRANSFORMATION | Акт переработки |
PRODUCTION | Акт приготовления |
DISASSEMBLE | Акт разбора |
SALES_RETURN_PAYMENT | Оплата приёма возврата |
SALES_RETURN_WRITEOFF | Возврат товаров |
ON_THE_HOUSE | Оплата заказа за счёт заведения |
CLOSE_AT_EMPLOYEE_EXPENSE | Закрытие стола за счёт сотрудника |
TARIFF_HOUR | Почасовая оплата |
TARIFF_PERCENT | Процент с продаж |
INCENTIVE_PAYMENT | Мотивация |
PENALTY | Штраф |
BONUS | Премия |
ADVANCE | Аванс из зарплаты |
EMPLOYEE_PAYMENT | Начисление оклада |
EMPLOYEE_CASH_PAYMENT | Выдача наличных сотрудникам |
SESSION_ACCEPTANCE | Принятие смены |
INCOMING_SERVICE | Получение услуг |
OUTGOING_SERVICE | Оказание услуг |
INCOMING_SERVICE_PAYMENT | Оплата получения услуг |
OUTGOING_SERVICE_PAYMENT | Оплата оказания услуг |
OUTGOING_DOCUMENT_PAYMENT | Принятие оплаты исходящего документа |
OUTGOING_SALES_DOCUMENT_PAYMENT | Принятие оплаты акта реализации |
IMPORTED_BANK_STATEMENT | Загрузка банковской выписки |
Счета
Группа счёта
ASSETS активы · LIABILITIES обязательства · EQUITY капитал · INCOME_EXPENSES доходы/расходы
Склад или счёт
STORE склад · ACCOUNT счёт
Дебет / кредит
DEBIT · CREDIT
Участие в ДДС
CASH_FLOW участвует · NOT_CASH_FLOW не участвует
| Тип счёта | Название |
|---|---|
CASH | Денежные средства |
ACCOUNTS_RECEIVABLE | Задолженность покупателей |
DEBTS_OF_EMPLOYEES | Задолженность сотрудников |
CURRENT_ASSET | Текущие активы |
OTHER_CURRENT_ASSET | Основные средства |
INVENTORY_ASSETS | Складские запасы |
EMPLOYEES_LIABILITY | Расчёты с сотрудниками |
ACCOUNTS_PAYABLE | Расчёты с поставщиками |
CLIENTS_LIABILITY | Расчёты с гостями |
OTHER_CURRENT_LIABILITY | Прочие текущие обязательства |
LONG_TERM_LIABILITY | Долгосрочные обязательства |
EQUITY | Капитал |
COST_OF_GOODS_SOLD | Прямые расходы (себестоимость) |
INCOME / EXPENSES | Доходы / расходы |
OTHER_INCOME / OTHER_EXPENSES | Прочие доходы / прочие расходы |
Номенклатура и контрагенты
| Группа | Значения |
|---|---|
| Тип элемента номенклатуры | GOODS товар · DISH блюдо · PREPARED заготовка · SERVICE услуга · MODIFIER модификатор · OUTER внешние товары · PETROL топливо · RATE тариф |
| Тип товара (в OLAP) | DISH · GOOD · MODIFIER |
| Типы групп продукта | PRODUCTS продукт · MODIFIERS модификатор (используется только в номенклатуре, выгружаемой в/из RKeeper и StoreHouse) |
| Тип контрагента | NONE · COUNTERAGENT все · EMPLOYEE сотрудник · SUPPLIER поставщик · CLIENT гость · INTERNAL_SUPPLIER внутренний поставщик |
| Тип алкогольной продукции | STRONG крепкие · BEER пиво |
| Тип статьи ДДС | OPERATIONAL операционная · INVESTMENT инвестиционная · FINANCE финансовая деятельность |
Заказы и оплаты
| Группа | Значения |
|---|---|
| Типы удаления блюд | DELETED_WITHOUT_WRITEOFF удалено без списания · DELETED_WITH_WRITEOFF удалено со списанием · NOT_DELETED не удалено |
| Признак удаления заказа | NOT_DELETED · DELETED |
| Признак доставки | DELIVERY_ORDER доставка · ORDER_WITHOUT_DELIVERY не доставка |
| Признак банкета | TRUE банкет · FALSE не банкет |
| Тип операции | STORNED сторнирование · PREPAY предоплата · PREPAY_RETURN возврат предоплаты · NO_PAYMENT без оплаты · PAYMENT оплата |
| Группа оплаты | CASH наличные · CARD банковские карты · NON_CASH безналичный расчёт · WRITEOFF без выручки |
| Признак фискальности | FISCAL · NOT_FISCAL · NO_PAYMENT |
| Статус документа | NEW · PROCESSED · DELETED |
22Готовые рецепты
PowerShell: авторизация, запрос, выход
$host_ = "https://localhost:8080"
$login = "admin"
$passRaw = "myPassword"
function Get-Sha1Hex([string]$s) {
$sha = [System.Security.Cryptography.SHA1]::Create()
$b = $sha.ComputeHash([Text.Encoding]::UTF8.GetBytes($s))
($b | ForEach-Object { $_.ToString("x2") }) -join ""
}
$pass = Get-Sha1Hex $passRaw
$key = Invoke-RestMethod "$host_/resto/api/auth?login=$login&pass=$pass"
try {
# Остатки на складах на текущий момент
$ts = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ss")
$bal = Invoke-RestMethod "$host_/resto/api/v2/reports/balance/stores?key=$key×tamp=$ts"
$bal | Select-Object -First 10 | Format-Table store, product, amount, sum
}
finally {
# Освобождаем слот лицензии, даже если запрос упал
Invoke-RestMethod "$host_/resto/api/logout?key=$key" | Out-Null
}
curl: OLAP v2 с фильтром по дате
KEY=$(curl -s "https://localhost:8080/resto/api/auth?login=admin&pass=$SHA1")
curl -s -X POST "https://localhost:8080/resto/api/v2/reports/olap?key=$KEY" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{
"reportType": "SALES",
"buildSummary": false,
"groupByRowFields": ["OpenDate.Typed","DishName"],
"aggregateFields": ["DishDiscountSumInt","DishAmountInt"],
"filters": {
"OpenDate.Typed": {
"filterType":"DateRange","periodType":"CUSTOM",
"from":"2026-08-01T00:00:00.000","to":"2026-08-08T00:00:00.000"
}
}
}'
curl -s "https://localhost:8080/resto/api/logout?key=$KEY"
Инкрементальная синхронизация номенклатуры
# 1. Первый проход
GET /resto/api/v2/entities/products/list?key=…&revisionFrom=-1
# → сохраняем revision = 187420
# 2. Каждые N минут
GET /resto/api/v2/entities/products/list?key=…&revisionFrom=187420
# → приходят только изменённые; обновляем сохранённую revision
# 3. Удалённые элементы не исчезают — они приходят с deleted:true,
# поэтому передавайте includeDeleted=true, если нужно отлавливать удаления.
Типичные ошибки интеграций
| Симптом | Причина | Решение |
|---|---|---|
| Через день интеграция перестаёт авторизоваться | Слоты лицензии исчерпаны: авторизовались в цикле и не вызывали logout | Кешировать токен или всегда выходить в finally |
| Вместо JSON приходит HTML | Неверный URL, прокси, Tomcat без сервера RMS или сервер перезапускается | Проверить базовый URL и /resto/api/replication/serverType |
| OLAP-запрос висит минутами | В полях агрегации StartBalance.* / FinalBalance.*, или buildSummary: true на большой сети | Убрать остатки из OLAP, брать их из /v2/reports/balance/stores |
400 Wrong date format | Использовали ISO там, где метод ожидает DD.MM.YYYY (старые методы v1) | Сверить формат даты с описанием конкретного метода |
| Комментарии на русском превращаются в «???» | Не указана кодировка в Content-Type | application/json;charset=UTF-8 |
| Накладная проводится, но суммы не совпадают | Не учтена настройка «НДС включён в цену закупки» | Прочитать /resto/api/corporation/settings |
| Поиск склада по коду ничего не находит | Коды складов не заполнены — поле необязательное | Искать по GUID или заполнить коды в бэк-офисе |
| Периодически «теряются» события | Использовали from_rev вместе с to_time | При работе по ревизии to_time не передавать |