Технический справочник интегратора

Syrve Server API

Полное описание серверного REST API Syrve RMS и Syrve Chain: авторизация, номенклатура, склад, касса, персонал, отчёты и OLAP.

REST API v1 + v2 Syrve RMS / Chain Версии 3.9 → 9.x XML и JSON

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. Получить токен

GET/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. Обязательно выйти

GET/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Поведение
POSTapplication/x-www-form-urlencodedЧастичное обновление: передаёте только те поля, которые меняете. Остальное остаётся как было.
PUTapplication/xmlТело запроса — сама сущность. Поля, отсутствующие в теле, получат значения по умолчанию при создании и сохранят свои значения при обновлении.
  • Успешное создание → HTTP 201 Created.
  • Успешное обновление → HTTP 200 OK.
  • Отдельная сущность — XML-документ; список сущностей — XML-документ, корневой элемент которого содержит элементы-сущности.
Обозначения в справочнике

Пустая плашка GET — метод только читает данные. Залитая POST, PUT или DELETE — метод изменяет данные на сервере.

Кириллица в JSON

Если передаёте русские символы в теле 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Авторизация и лицензионные слоты

GET/resto/api/auth?login=[login]&pass=[sha1passwordhash]
ПараметрОписание
loginЛогин пользователя бэк-офиса
passSHA1-хеш пароля (hex, нижний регистр)

В ответе: строка-токен. Её нужно передавать в каждом следующем запросе — как cookie key или как параметр key.

GET/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.

Сколько слотов лицензии осталось

GET/resto/api/licence/info?moduleId={moduleId}

Возвращает количество свободных слотов для конкретного лицензионного модуля, например ?moduleId=28008806. Дату окончания лицензии этот метод не возвращает.

05Ограничения и советы

Сервер заведения — не облако. Он одновременно обслуживает кассы, и неудачный запрос из API способен его подвесить.

  1. Запросы — строго последовательно. Следующий отправляйте только после того, как завершился предыдущий. Параллельные вызовы не поддерживаются.
  2. Период — не больше месяца. Идеально — день или неделя.
  3. Отключайте итоги. Если общие итоги в OLAP не нужны — build-summary=false. Для больших сетей true может подвесить сервер. С версии 9.1.2 значение по умолчанию и так false.
  4. Не больше 7 полей в построении OLAP-отчёта.
  5. Сначала демо-сервер. Проверяйте запросы на демо-стенде, а не на рабочем сервере клиента.
  6. Тяжёлые поля — ночью. StartBalance.* и FinalBalance.* в OLAP суммируют всю таблицу проводок за всё время работы системы. Для остатков используйте отдельное API балансов (раздел 16).

06Ревизии и синхронизация

Почти каждый метод-«список» поддерживает параметр revisionFrom. Это главный механизм инкрементальной синхронизации: вместо того чтобы каждый раз тянуть весь справочник, вы забираете только то, что изменилось.

ПараметрТипПоведение
revisionFromчислоВозвращает сущности с ревизией строго большей указанной. По умолчанию -1 — то есть полный, неревизионный запрос

Правильный цикл синхронизации

  1. Первый запрос: revisionFrom=-1 — получаете всё.
  2. Из ответа запоминаете поле revision — это максимальная ревизия, доступная для выгрузки на момент запроса.
  3. Следующий запрос: revisionFrom={сохранённая revision} — приходят только изменения.
  4. Повторяете.
Для событий — иначе

В журнале событий параметр называется from_rev, и туда нужно передавать revision + 1 из предыдущего ответа, потому что граница там включительная. Также: если работаете по ревизии, нельзя указывать to_time.

Поддержка revisionFrom в большинстве методов v1 появилась в версии 6.4, в методах v2 — с самого начала.

07Структура предприятия

Иерархия подразделений

GET/resto/api/corporation/departments/

Версия 3.9 · параметр revisionFrom с 6.4 · ответ: corporateItemDto

Код типаЧто это
CORPORATIONКорпорация
JURPERSONЮридическое лицо
ORGDEVELOPMENTСтруктурное подразделение
DEPARTMENTТорговое предприятие (заведение)
MANUFACTUREПроизводство
CENTRALSTOREЦентральный склад
CENTRALOFFICEЦентральный офис
SALEPOINTТочка продаж
STOREСклад

Поля corporateItemDto

ПолеОписание
idGUID объекта иерархии
parentIdGUID родительского объекта
codeКод
nameНаименование
typeТип из таблицы выше
taxpayerIdNumberНалоговый номер юрлица (в Украине — ЕГРПОУ / ИНН)
jurPersonAdditionalPropertiesDtoС 6.3: расширенные реквизиты юрлица, в том числе iban и swiftBic — именно то, что нужно для украинской отчетности

Склады

GET/resto/api/corporation/stores/

Все склады торговых предприятий в виде corporateItemDto

Группы отделений и точки продаж

GET/resto/api/corporation/groups/

Версия 4.3 · ответ: groupDto

В группе отделений может быть несколько точек продаж, но главная касса (pointOfSaleDto/main = true) подключается только к одной. В Syrve Chain информация о кассе точки продаж (cashRegisterInfo) может отсутствовать.

Режим обслуживания группы — groupServiceMode: FAST_FOOD, TABLE_SERVICE, PETROLEUM.

Терминалы

GET/resto/api/corporation/terminals/

Версия 4.3 · ответ: terminalDto (id, name, computerName, anonymous, groupInfo, restaurantSectionIds)

Обычно интересны только фронтовые терминалы. Они различаются по полю anonymous: у касс — false, у бэк-офисов и системных терминалов — true.

Поиск

GET/resto/api/corporation/departments/search?code={regex}
GET/resto/api/corporation/stores/search?code={regex}
GET/resto/api/corporation/groups/search?name={regex}&departmentId={uuid}
GET/resto/api/corporation/terminals/search?name={regex}&computerName={regex}&anonymous=false

Все code и name — регулярные выражения. Если передать просто строку, ищется любое ее вхождение с учетом регистра. Поиск заведения по коду имеет смысл преимущественно в Syrve Chain: в пределах одного RMS сущность типа DEPARTMENT только одна.

Поиск склада по коду

Работает только если коды складов заполнены. Поле необязательное и по умолчанию пустое.

Настройки предприятия

GET/resto/api/corporation/settings

Версия 6.2 · требуется право B_ADM

{ "vatAccounting": "VAT_INCLUDED_IN_PRICE" }

VAT_INCLUDED_IN_PRICE — НДС включен в закупочную цену; VAT_NOT_INCLUDED_IN_PRICE — не включен. Это определяет, как считать суммы в накладных.

08Справочники и счета

Универсальный метод справочников

GET/resto/api/v2/entities/list?rootType={Type}

Версия 5.0 · rootType можно передавать несколько раз

rootTypeС версииЧто возвращает
Account5.0Счета, в том числе склады
AccountingCategory5.0Бухгалтерская категория номенклатуры
AlcoholClass5.0Класс алкогольной продукции
AllergenGroup7.1.2Группа аллергенов
AttendanceType6.4Тип явки сотрудника
Conception7.8.1Концепция
CookingPlaceType7.0.2Тип места приготовления
DiscountType5.0Тип скидки
MeasureUnit5.0Единица измерения
OrderType6.4Тип заказа
PaymentType5.0Тип оплаты
ProductCategory5.0Пользовательская категория номенклатуры
ProductScale6.4Шкала размеров
ProductSize6.4Размер продукта
ScheduleType6.4Тип смены
TaxCategory6.2.2Налоговая категория (ставка НДС)

Параметры

ПараметрОписание
includeDeletedtrue/false. По умолчанию — включать удаленные
revisionFromИнкрементальная выборка, см. раздел 6
formatУстарел с 6.2.2, не используется

Формат ответа

ПолеОписание
idGUID объекта
rootTypeТип, который вы передали
deletedtrue — помечен удаленным
codeКод, артикул, табельный номер. Строка, может быть null
nameНазвание. Для системных объектов — на языке запроса (заголовок Accept-Language)

Дополнительные поля по типам

ТипПолеЗначение
OrderTypeorderServiceTypeCOMMON — обычный заказ; DELIVERY_BY_COURIER — доставка курьером; DELIVERY_PICKUP — самовывоз
OrderTypedefaultForServiceTypeТип заказа по умолчанию для этого режима
ProductSizeshortNameКраткое название размера
TaxCategoryvatPercentСтавка НДС
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":"Безналичный расчет" }
]
Осторожно с этим методом

Он возвращает общую справочную информацию без привязки к подразделениям и срокам действия. В результате могут быть записи (например, типы оплат), запрещенные к применению в конкретном подразделении. Используйте его, чтобы получить названия объектов для отображения в отчетах, — не для бизнес-логики.

Только идентификаторы

GET/resto/api/v2/entities/{entityType}/ids

Версия 9.1 · возвращает плоский массив GUID. Принимает includeDeleted и revisionFrom. Пример: /resto/api/v2/entities/Account/ids?includeDeleted=false&revisionFrom=10

Счета

GET/resto/api/entities/accounts/list

Параметры: includeDeleted (с 5.4), revisionFrom (с 6.4)

ПолеОписание
idGUID счета
accountParentIdGUID родительского счета; у складов — null
parentCorporateIdGUID объекта структуры корпорации, которому принадлежит склад
codeКод счета, например 5.01
nameНазвание; для системных счетов — на языке запроса
typeТип счета, см. раздел 21
systemtrue — предустановленный склад на standalone RMS
customTransactionsAllowedРазрешены ли ручные проводки
rootTypeС 6.2.2 — всегда Account

Метод возвращает только справочную информацию: без балансов и без материально ответственных лиц. Балансы — в разделе 16.

09Номенклатура

Требуется право B_EN «Редактирование номенклатурных справочников» — и на чтение, и на запись.

Элементы номенклатуры

GET/resto/api/v2/entities/products/list

Версия 6.1

ПараметрС версииТипОписание
includeDeleted6.1BooleanВключать удаленные. По умолчанию false
ids6.2List<UUID>Фильтр по GUID
nums6.2List<String>Фильтр по артикулу
types6.2List<ProductType>Фильтр по типу
categoryIds6.2List<UUID>Фильтр по категории продукта
parentIds6.2List<UUID>Фильтр по родительской группе
Как фильтровать по null

Чтобы отобрать элементы, у которых поле пустое, передайте параметр без значения: parentId=. На сервере это станет списком из одного элемента [null].

Несколько значений — повторением параметра: parentId=111&parentId=222&parentId=333[111, 222, 333]. Комбинация parentId=111&parentId=222&parentId=[111, 222, null].

Основные поля

ПолеС версииТипОписание
id6.1UUIDИдентификатор
deleted6.1BooleanУдален
name6.1StringНазвание
description6.1StringОписание
num6.1StringАртикул — используется при печати документов и техкарт
code6.1StringКод быстрого поиска на экране редактирования заказа
parent6.1UUIDРодительская группа; null — корневая
type6.1EnumGOODS товар · DISH блюдо · PREPARED заготовка (полуфабрикат) · SERVICE услуга · MODIFIER модификатор · OUTER внешние товары поставщиков · RATE тариф (дочерний к услуге)
mainUnit6.1UUIDОсновная единица измерения
taxCategory6.1UUIDНалоговая категория (ставка НДС)
category6.1UUIDПользовательская категория
accountingCategory6.1UUIDБухгалтерская категория
defaultSalePrice6.1BigDecimalЦена по умолчанию, грн (если нет приказов о меню)
defaultIncludeInMenu6.1BooleanВключать ли позицию в меню по умолчанию
placeType6.1UUIDМесто приготовления. Обязательно, если defaultIncludeInMenu = true
excludedSections6.1Set<UUID>Отделения, где это блюдо продавать нельзя
unitWeight6.1BigDecimalВес одной единицы, кг
unitCapacity6.1BigDecimalОбъем одной единицы, л
notInStoreMovement6.1BooleanУчаствует ли в перемещениях по складу
color, fontColor6.2RGBColorDtoЦвет фона и шрифта кнопки на кассе: {red, green, blue}
frontImageId6.2UUIDИзображение для кассы
position6.2IntegerПозиция в меню
modifiers6.2ListМодификаторы (без учета схем модификаторов)
containers6.2.4ListФасовки
modifierSchemaId6.4UUIDСхема модификаторов
productScaleId6.4UUIDШкала размеров. Если задана схема модификаторов — шкала берется из нее
coldLossPercent7.1.2BigDecimalПотери при холодной обработке, %
hotLossPercent7.1.2BigDecimalПотери при горячей обработке, %
allergenGroups7.1.5Set<UUID>Группы аллергенов
canSetOpenPrice7.4.4BooleanСвободная цена
useBalanceForSellBooleanТовар продается на вес
barcodes8.7.1ListШтрихкоды: {barcode, containerId}

Модификатор — ChoiceBindingDto

ПолеТипОписание
modifierUUIDGUID модификатора или номенклатурной группы, если модификатор групповой
defaultAmountIntegerКоличество по умолчанию. У группового = сумме значений дочерних
freeOfChargeAmountIntegerКоличество бесплатных. Не больше максимального
minimumAmountIntegerМинимальное количество. Для обязательного модификатора должно быть > 0
maximumAmountIntegerМаксимальное количество
hideIfDefaultAmountBooleanСкрывать, если количество по умолчанию
requiredBooleanОбязательный. С 6.2.3 в ответе не используется
childModifiersHaveMinMaxRestrictionsBooleanОграничения min/max у дочерних. У дочерних и одиночных должно быть false
splittableBooleanДелимость. Только для схем модификаторов
childModifiersListДочерние модификаторы

Фасовка — ContainerDto

ПолеОписание
id, num, nameИдентификатор, артикул, название
countКоличество продукта в основных единицах измерения
containerWeightВес тары
fullContainerWeightВес вместе с тарой
minContainerWeight, maxContainerWeightМин./макс. вес элемента номенклатуры
useInFrontИспользовать на кассе
backwardRecalculationВсегда false
deletedУдалена

Создание элемента

POST/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

Редактирование, удаление, восстановление

POST/resto/api/v2/entities/products/update

Тело — то же, что и для save, плюс id элемента. Параметры URL: overrideFastCode, overrideNomenclatureCode (оба по умолчанию false)

POST/resto/api/v2/entities/products/delete
POST/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", … } ]
}

Номенклатурные группы

GET/resto/api/v2/entities/products/group/list
POST/resto/api/v2/entities/products/group/save
POST/resto/api/v2/entities/products/group/update
POST/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, плюс настройки отображения группы на кассе.

Пользовательские категории

GET/resto/api/v2/entities/products/category/list
POST/resto/api/v2/entities/products/category/save
POST/resto/api/v2/entities/products/category/update
POST/resto/api/v2/entities/products/category/delete
POST/resto/api/v2/entities/products/category/restore

Шкала и размеры

GET/resto/api/v2/entities/productScales
GET/resto/api/v2/entities/productScales/{productScaleId}
POST/resto/api/v2/entities/productScales/save
POST/resto/api/v2/entities/productScales/update
POST/resto/api/v2/entities/productScales/delete
POST/resto/api/v2/entities/productScales/restore
GET/resto/api/v2/entities/products/{productId}/productScale
GET/resto/api/v2/entities/products/productScales

Версия 6.4 · шкала размеров и привязка размеров к продуктам

Изображения

GET/resto/api/v2/images/load?imageId={imageId}
POST/resto/api/v2/images/save
POST/resto/api/v2/images/delete

GUID загруженного изображения подставляется в поле frontImageId элемента номенклатуры.

Быстрое меню

GET/resto/api/v2/entities/quickLabels/list
POST/resto/api/v2/entities/quickLabels/save
POST/resto/api/v2/entities/quickLabels/update

Требуется право B_QMENU

Быстрое меню состоит из трех страниц, каждая — сетка 3 × 8. В ячейке — либо элемент номенклатуры, либо группа.

ПолеТипОписание
idUUIDИдентификатор быстрого меню
dependsOnWeekDaybooleanЗависит ли меню от дня недели
departmentIdUUIDПодразделение, для которого действует меню
sectionIdUUIDОтделение. null — меню для всего подразделения
pageNamesList<String>Названия страниц — ровно три
labels[].dayIntegerДень недели: 0 — понедельник … 6 — воскресенье, или null
labels[].pageIntegerСтраница: 0, 1, 2
labels[].xIntegerX-координата: 0, 1, 2
labels[].yIntegerY-координата: 0…7
labels[].entityIdUUIDGUID сущности
labels[].entityTypeEnumPRODUCT или PRODUCT_GROUP

10Технологические карты

GET/resto/api/v2/assemblyCharts/getAll?dateFrom={d}&dateTo={d}&includeDeletedProducts=true&includePreparedCharts=false

Все техкарты за период

GET/resto/api/v2/assemblyCharts/getAllUpdate?knownRevision={n}&dateFrom={d}&dateTo={d}

Инкрементально: только то, что изменилось после knownRevision

GET/resto/api/v2/assemblyCharts/getTree?date={d}&productId={uuid}&departmentId={uuid}

Дерево техкарты — с раскладкой полуфабрикатов

GET/resto/api/v2/assemblyCharts/getAssembled?date={d}&productId={uuid}&departmentId={uuid}

Свернутая («собранная») техкарта

GET/resto/api/v2/assemblyCharts/getPrepared?date={d}&productId={uuid}&departmentId={uuid}
GET/resto/api/v2/assemblyCharts/byId
GET/resto/api/v2/assemblyCharts/getHistory
POST/resto/api/v2/assemblyCharts/save
POST/resto/api/v2/assemblyCharts/delete
У техкарты всегда есть дата

Техкарта — версионная сущность: она действует с определенной даты. Поэтому date / dateFromdateTo обязательны, а getHistory показывает всю историю изменений конкретной карты.

Вхождение товара в блюдо

GET/resto/api/reports/ingredientEntry

Версия 3.9 · обратный поиск: в какие блюда входит этот ингредиент

ПараметрЗначениеОписание
departmentGUIDПодразделение
dateDD.MM.YYYYНа какую дату
productGUIDИдентификатор продукта
productArticleStringАртикул продукта. Приоритет поиска: сначала productArticle, затем product
includeSubtreeBooleanВключать строки поддеревьев. По умолчанию false

11Цены, приказы, расписания

Ценовые категории

GET/resto/api/v2/entities/priceCategories
GET/resto/api/v2/entities/priceCategories/byId?id={uuid}

Версия 7.8 · параметры списка: includeDeleted, id (список), revisionFrom

ПолеТипОписание
idUUIDИдентификатор
nameStringНазвание
deletedbooleanУдалена
codeStringКод элемента справочника
assignableManuallybooleanМожно ли назначить вручную на кассе
pricingStrategy.typeEnumABSOLUTE_VALUE — скидка/наценка абсолютным числом; PERCENT — в процентах от базовой цены
pricingStrategy.deltaBigDecimalДля ABSOLUTE_VALUE. Знак «−» — скидка, «+» — наценка. В гривнах
pricingStrategy.percentBigDecimalДля 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
}

Приказы об изменении прейскуранта

GET/resto/api/v2/documents/menuChange
GET/resto/api/v2/documents/menuChange/byId?id={uuid}
GET/resto/api/v2/documents/menuChange/byNumber?documentNumber={n}
POST/resto/api/v2/documents/menuChange

Версия 7.8 · именно этим документом задаются цены продажи

MenuChangeDocumentDto

ПолеТипОписание
idUUIDИдентификатор
dateIncomingStringУчетная дата проведения, yyyy-MM-dd
documentNumberStringУчетный номер
statusEnumNEW · PROCESSED · DELETED
commentStringКомментарий
shortNameStringКраткое название для кнопок на кассе
deletePreviousMenuBooleanЕсли true — блюда, которых нет в документе, будут исключены из меню
scheduleIdUUIDРасписание — для приказа «по времени»
schedulePeriodScheduleDtoРазвернутое расписание. Только чтение
dateToStringДата окончания действия (отмены) приказа
itemsListПозиции приказа

MenuChangeDocumentItemDto

ПолеТипОписание
numIntegerПозиция строки. При создании не учитывается
departmentIdUUIDПодразделение, в котором продается продукт
productIdUUIDПродукт
productSizeIdUUIDРазмер продукта
includingBooleanВключен ли продукт в прейскурант
priceBigDecimalЦена, грн
dishOfDayBooleanХит / блюдо дня
flyerProgramBooleanУчастие во флаерной программе

Редактировать приказ можно только пока его статус NEW. Если id не задан — создается новый документ; если задан — редактируется существующий.

Расписания (периоды действия)

GET/resto/api/v2/entities/periodSchedules
GET/resto/api/v2/entities/periodSchedules/byId?id={uuid}

Версия 7.8 · параметры: includeDeleted, id (список), revisionFrom

ПолеТипОписание
id, name, deletedИдентификатор, название, признак удаления
periods[].beginStringНачало полуинтервала, HH:mm
periods[].endStringКонец полуинтервала, HH:mm
periods[].daysOfWeekList<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 и покрывают акты списания и внутренние перемещения.

Приходная накладная

POST/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Номер налоговой накладной / счета-фактуры
supplierGUID поставщика
defaultStoreСклад. Если указан — тот же склад должен быть в каждой позиции
conception / conceptionCodeКонцепция (GUID / код, код — с 7.8)
statusNEW · PROCESSED · DELETED
useDefaultDocumentTimefalse (по умолч.) — использовать переданные дату-время как есть. 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 = 50
  • actualAmount («фактическое количество») = 5 × 10 = 50
  • price («цена базовой единицы») = 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Результат валидации
warningtrue — ошибка некритичная, это предупреждение
documentNumberНомер документа
otherSuggestedNumberНовый номер, если старый нарушает уникальность
errorMessageТекст ошибки (или только заголовок, если есть additionalInfo). Не всегда локализован
additionalInfoДетали. Например, при списании в минус — расшифровка по каждой позиции, дающей отрицательные остатки

Расходная накладная

POST/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

Распроведение накладных

POST/resto/api/documents/unprocess/incomingInvoice
POST/resto/api/documents/unprocess/outgoingInvoice

Версия 7.7 · тело — та же структура документа · ответ — documentValidationResult

Выгрузка накладных

GET/resto/api/documents/export/incomingInvoice?from={d}&to={d}&supplierId={uuid}
GET/resto/api/documents/export/outgoingInvoice?from={d}&to={d}&supplierId={uuid}

Версия 5.4 · даты YYYY-MM-DD, обе включительно (время не учитывается) · supplierId можно повторять; без него возвращаются все накладные за период · revisionFrom с 6.4

GET/resto/api/documents/export/incomingInvoice/byNumber
GET/resto/api/documents/export/outgoingInvoice/byNumber
ПараметрТипОписание
numberStringНомер документа
currentYearBooleanОбязательный. true — только за текущий год, тогда from и to передавать нельзя. falsefrom и to обязательны
from, toYYYY-MM-DDГраницы периода, включительно

Другие документы (XML)

POST/resto/api/documents/import/productionDocument

Акт приготовления · версия 3.9 · поля: storeFrom, storeTo, dateIncoming, documentNumber, status, items[] с product, amount, amountUnit, containerId, num

POST/resto/api/documents/import/salesDocument

Акт реализации · версия 3.9 · поля: accountToCode (по умолч. 5.01), revenueAccountCode (по умолч. 4.01), items[] с productId, storeId, amount, sum, discountSum

POST/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>

Инвентаризация

POST/resto/api/documents/import/incomingInventory

Версия 5.1 · тело: incomingInventoryDto · ответ: incomingInventoryValidationResult

POST/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)

GET/resto/api/v2/documents/writeoff?dateFrom={d}&dateTo={d}
GET/resto/api/v2/documents/writeoff/byId?id={uuid}
GET/resto/api/v2/documents/writeoff/byNumber?documentNumber={n}
POST/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)

GET/resto/api/v2/documents/internalTransfer?dateFrom={d}&dateTo={d}
GET/resto/api/v2/documents/internalTransfer/byId?id={uuid}
GET/resto/api/v2/documents/internalTransfer/byNumber?documentNumber={n}
POST/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Поставщики

GET/resto/api/suppliers

Версия 3.9 · revisionFrom с 6.4 · ответ — структура employees (поставщик в Syrve — это разновидность контрагента)

GET/resto/api/suppliers/search

Поиск по id не выполняется. Доступные поля:

ПараметрПоле в карточке
nameИмя в системе
codeТаб. номер / код
phone, cellPhoneТелефон, мобильный телефон
firstName, middleName, lastNameИмя, отчество, фамилия
emailE-mail
cardNumberНомер карты (вкладка «Дополнительные сведения»)
taxpayerIdNumberНалоговый номер (вкладка «Юр. лицо»)

Прайс-лист поставщика

GET/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Касса и кассовые смены

Список смен

GET/resto/api/v2/cashshifts/list
ПараметрЗначениеОписание
openDateFromYYYY-MM-DDПериод открытия смены «с», включительно
openDateToYYYY-MM-DDПериод открытия смены «по», включительно
departmentIdUUIDСписок заведений; пусто — без фильтра
groupIdUUIDСписок групп секций
statusEnumНе может быть пустым. 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Концепция и точка продаж смены

Смена по идентификатору

GET/resto/api/v2/cashshifts/byId/{sessionId}
GET/resto/api/v2/cashshifts/closedSessionDocument/{id}

Второй метод возвращает документ принятия кассовой смены

Платежи, внесения и изъятия за смену

GET/resto/api/v2/cashshifts/payments/list/{sessionId}?hideAccepted=false

Версия 5.4

ПолеОписание
sessionIdGUID запрошенной смены
cashlessRecordsБезналичные платежи
payInRecordsВнесения
payOutRecordsИзъятия

Запись проводки — info

ПолеОписание
idGUID проводки
dateУчётный день, округлённый до суток (для оплат заказов)
creationDateДата с привязкой ко времени. Может быть меньше date, если «конец учётного дня» ≠ 00:00
groupCARD безнал · CREDIT кредит · PAYOUT изъятие · PAYIN внесение
accountIdРедактируемый счёт — обычно конечный счёт проводки
counteragentId, paymentTypeId, type, sum, commentКонтрагент, тип оплаты, тип проводки, сумма, комментарий
auth.user, auth.cardАвторизационные данные: пользователь, номер карты
causeEvenIdGUID события оплаты заказа
cashierId, departmentIdКассир, заведение
cashFlowCategoryСтатья движения денежных средств: code, parentCategory, type (OPERATIONAL/INVESTMENT/FINANCE)

Рядом с info есть actualSum и originalSum: первая — сумма из документа закрытия смены (если он её скорректировал), вторая — сумма самой проводки. Аналогично editedPayAccountId и originalPayAccountId.

Типы внесений и изъятий

GET/resto/api/v2/entities/payInOutTypes/list?includeDeleted=false

Требуется право B_APIO

ПолеОписание
idGUID типа внесения/изъятия
chiefAccountGUID шеф-счёта
accountGUID корр. счёта. При изъятии средства уходят на корр. счёт, при внесении — наоборот
counteragentTypeNONE · COUNTERAGENT · EMPLOYEE · SUPPLIER · CLIENT · INTERNAL_SUPPLIER
transactionTypeТип проводки, см. раздел 21
cashFlowCategoryСтатья ДДС
conceptionКонцепция: id, code, name
limitПредельная сумма для внесений/изъятий на кассе, грн
mandatoryFrontCommentТребовать комментарий к операции на кассе

Выполнить изъятие

POST/resto/api/v2/payInOuts/addPayOut

Версия 6.0 · требуется право F_APIO · Content-Type: application/json;charset=UTF-8

ПолеТипОписание
payOutTypeIdUUIDТип изъятия
payOutDateStringyyyy-MM-dd. Время проставляется текущее
counteragentUUIDКонтрагент — в зависимости от типа изъятия
departmentSumMapUUID → BigDecimalЗаведение → сумма изъятия, грн
payrollIdUUIDПлатёжная ведомость. Указывается, если изъятие идёт на корр. счёт «Текущие расчёты с сотрудниками»
commentStringКомментарий
{
  "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 содержит список объектов с кодом и текстом ошибки.

Платёжные ведомости

GET/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Сотрудники

Список и поиск

GET/resto/api/employees?includeDeleted=false
GET/resto/api/employees/byDepartment/{departmentCode}
GET/resto/api/employees/byId/{employeeUUID}
GET/resto/api/employees/byCode/{employeeCode}
GET/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.

Создание и редактирование

PUT/resto/api/employees/byId/{UUID}

Полная замена. Новый id201 Created. Существующий id200 OK и все поля перезаписываются: не указали необязательное поле — оно сбросится

POST/resto/api/employees/byId/{employeeUUID}

Частичное обновление. Поля, не указанные в запросе, остаются без изменений. Content-Type: application/x-www-form-urlencoded

PUT/resto/api/employees/byCode/{employeeCode}

Создание нового сотрудника. Учитывается только код, переданный в теле PUT-запроса. employeeCode попадает в поле «Табельный номер»

DELETE/resto/api/employees/byId/{employeeUUID}

Пустой ответ, если сотрудник удалён (или уже был удалён). Entity of class User not found by id — если GUID не существует

Ключевые поля employee

ПолеОписание
idGUID
codeТабельный номер. Пуст у системных учётных записей
nameИмя в системе
loginЛогин для входа в бэк-офис
passwordПароль бэк-офиса. Только на запись, в ответе не возвращается
pinCodePIN для входа на кассу. Только на запись
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 может быть пустым.

Должности

GET/resto/api/employees/roles

revisionFrom с 6.4

ПолеОписание
id, code, nameИдентификатор, код, название должности
paymentPerHourОплата за час, грн
steadySalaryС 6.2.2, только чтение: оклад за месяц, грн
scheduleTypeСтратегия расчёта зарплаты: SESSION за смену · HOURS почасово · FIXED оклад

Оклады

GET/resto/api/employees/salary
GET/resto/api/employees/salary/byId/{employeeUUID}
GET/resto/api/employees/salary/byId/{employeeUUID}/{YYYY-MM-DD}

Третий вариант — оклад на конкретную дату. Установка оклада — POST на /resto/api/employees/salary

Смены и расписания

GET/resto/api/employees/schedule/types
GET/resto/api/employees/schedule/?from={d}&to={d}&withPaymentDetails={bool}&revisionFrom=-1
GET/resto/api/employees/schedule/byEmployee/{employeeUUID}/?from={d}&to={d}
GET/resto/api/employees/schedule/byDepartment/{departmentCode}/?from={d}&to={d}
GET/resto/api/employees/schedule/department/{departmentId}/?from={d}&to={d}
GET/resto/api/employees/schedule/byId/{scheduleUUID}
POST/resto/api/employees/schedule/create
POST/resto/api/employees/schedule/update

Даты YYYY-MM-DD. withPaymentDetails=true добавляет расчёт оплаты. Есть варианты byDepartment/{code} (по коду подразделения) и department/{id} (по GUID), а также комбинация с byEmployee

Явки

GET/resto/api/employees/attendance/types
GET/resto/api/employees/attendance?from={d}&to={d}&withPaymentDetails={bool}&revisionFrom=-1
GET/resto/api/employees/attendance/byEmployee/{employeeUUID}/?from={d}&to={d}
GET/resto/api/employees/attendance/byDepartment/{departmentCode}/?from={d}&to={d}
GET/resto/api/employees/attendance/department/{departmentId}/?from={d}&to={d}
GET/resto/api/employees/attendance/byId/{attendanceUUID}
POST/resto/api/employees/attendance/create
POST/resto/api/employees/attendance/update
GET/resto/api/employees/availability/list?from={d}&to={d}&department={uuid}&role={uuid}&user={uuid}

Последний метод — доступность сотрудников (пожелания по графику)

Бригады официантов

GET/resto/api/employees/waiterTeams
GET/resto/api/employees/waiterTeams/byDepartment/{departmentUUID}
GET/resto/api/employees/waiterTeams/byCode/{teamCode}
GET/resto/api/employees/waiterTeams/byId/{teamUUID}
GET/resto/api/employees/waiterTeams/search?{param}={regexp}&includeDeleted={bool}
GET/resto/api/employees/waiterTeams/assignments
GET/resto/api/employees/waiterTeams/assignments/byDepartment/{departmentId}

assignments — назначения официантов в бригады

16Остатки и отчёты

Остатки на складах

GET/resto/api/v2/reports/balance/stores

Версия 5.2 · основной способ получить остатки — быстрый, в отличие от OLAP

ПараметрОписание
timestampОбязательный. Учётная дата-время отчёта, yyyy-MM-ddTHH:mm:ss
departmentGUID подразделения, можно несколько
storeGUID склада, можно несколько
productGUID элемента номенклатуры, можно несколько
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 — денежный, в гривнах.

Балансы по счетам и контрагентам

GET/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 }
]

Это готовый ответ на вопросы «сколько мы должны поставщику» и «сколько денег на счёте» на конкретный момент.

Складские отчёты

GET/resto/api/reports/storeOperations

Версия 3.9 · ответ: storeReportItemDto

ПараметрЗначениеОписание
dateFrom, dateToDD.MM.YYYYПериод
storesGUIDСклады. Пусто — все
documentTypesEnumТипы документов (раздел 21). Пусто — все
productDetalizationBooleantrue — детализация по товарам, но без даты. false — каждый документ одной строкой с суммами
showCostCorrectionsBooleanВключать ли корректировки себестоимости. Учитывается только вместе с фильтром по типам документов; иначе корректировки включаются всегда
presetIdGUIDПреднастроенный отчёт. Если указан — все настройки, кроме дат, игнорируются
GET/resto/api/reports/storeReportPresets

Список преднастроенных складских отчётов, сохранённых в бэк-офисе

GET/resto/api/reports/productExpense

Расход продуктов по продажам · параметры: department, dateFrom, dateTo, hourFrom, hourTo (по умолчанию -1 — всё время)

GET/resto/api/reports/sales

Отчёт по выручке · дополнительно: dishDetails (разбивка по блюдам, по умолч. false) и allRevenue (true — все типы оплат, false — только выручка)

GET/resto/api/reports/monthlyIncomePlan

План по выручке за день · department, dateFrom, dateTo

Отчёты по доставке

У всех методов этой группы общие параметры: department (код или GUID в формате department={code="005"}; без него — по всем подразделениям в Chain), dateFrom, dateTo (DD.MM.YYYY или YYYY-MM-DD).

GET/resto/api/reports/delivery/consolidated

Сводный отчёт: средний чек, количество блюд, количество заказов по дням. Дополнительный параметр writeoffAccounts — счета списания

GET/resto/api/reports/delivery/couriers

Отчёт по курьерам. Целевые показатели: targetCommonTime (по умолч. 30 мин), targetOnTheWayTime, targetDoubledOrders, targetTripledOrders, targetTotalOrders. Тип метрики: AVERAGE, TARGET, MAXIMUM

GET/resto/api/reports/delivery/orderCycle

Цикл заказа. Целевые: targetPizzaTime, targetCuttingTime, targetOnShelfTime, targetInRestaurantTime, targetOnTheWayTime, targetTotalTime

GET/resto/api/reports/delivery/halfHourDetailed

Получасовой детализированный отчёт

GET/resto/api/reports/delivery/regions

Отчёт по регионам: среднее время доставки, процент доставленных, максимум заказов за день

GET/resto/api/reports/delivery/loyalty

Лояльность: новые гости, заказов на гостя. Дополнительно metricType: AVERAGE, MINIMUM, MAXIMUM

17OLAP v1

Простая GET-версия OLAP: все поля передаются параметрами URL. Для новых интеграций рекомендуется v2 (раздел 18), но v1 удобен для быстрых проверок и разовых выгрузок.

GET/resto/api/reports/olap

Версия 3.9

ПараметрЗначениеОписание
reportSALES · TRANSACTIONS · DELIVERIES · STOCKПродажи · проводки · доставки · контроль хранения
from, toDD.MM.YYYYПериод
groupRowимя поляГруппировка по строкам. Повторяемый параметр
groupColимя поляГруппировка по столбцам
agrимя поляАгрегация
summarytrue / 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.AccountHierarchyTopThirdИерархия счёта по уровнямда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
Остатки в OLAP — это ловушка

Поля 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, а перечень доступных полей можно получить с самого сервера.

Какие поля доступны

GET/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Название колонки в бэк-офисе. Справочно
typeENUM · STRING · ID (внутренний идентификатор, с 5.0) · DATETIME · INTEGER · PERCENT (0…1) · DURATION_IN_SECONDS · AMOUNT · MONEY
aggregationAllowedМожно ли агрегировать
groupingAllowedМожно ли группировать
filteringAllowedМожно ли фильтровать
tagsКатегории поля — то же, что в правом верхнем углу конструктора отчёта

Построение отчёта

POST/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"] }
  }
}
ПолеОписание
reportTypeSALES продажи · TRANSACTIONS проводки · DELIVERIES доставки
buildSummaryС 5.3.4. Необязательное. До 9.1.2 по умолчанию true, с 9.1.2 — false
groupByRowFieldsПоля группировки по строкам. Только те, у которых groupingAllowed = true
groupByColFieldsНеобязательное. Группировка по столбцам
aggregateFieldsПоля агрегации
filtersФильтры. Только поля с filteringAllowed = true
С версии 5.5 фильтр по дате обязателен

Каждый 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, includeHighfalse.

Фильтр по дате

"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: его передавать обязательно, значение может быть любым.

includeHigh и время

Включать верхнюю границу имеет смысл только для полей, которые выдают округлённую дату, а не дату-время. Для 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 будет пустым.

Преднастроенные отчёты

GET/resto/api/v2/reports/olap/presets
GET/resto/api/v2/reports/olap/presets/{presetType}
GET/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 «Просматривать журнал событий».

Список событий

GET/resto/api/events

Версия 3.9 · ответ: eventsList

ПараметрФорматОписание
from_timeyyyy-MM-ddTHH:mm:ss.SSSС какого времени. По умолчанию — начало текущих суток
to_timeyyyy-MM-ddTHH:mm:ss.SSSПо какое время, не включительно. По умолчанию границы нет
from_revчислоРевизия. Каждый ответ содержит тег revision; в следующий раз передавайте revision + 1

В штатном режиме одно и то же событие повторно с разными ревизиями не приходит, но гарантии этого нет. GUID события уникален — используйте его как ключ дедупликации.

Фильтр по типам событий и номерам заказов

POST/resto/api/events

Версия 5.0 · тело application/xml

<eventsRequestData>
  <events>
    <event>orderCancelPrecheque</event>
    <event>orderPaid</event>
  </events>
  <orderNums>
    <orderNum>175658</orderNum>
  </orderNums>
</eventsRequestData>

Дерево типов событий

GET/resto/api/events/metadata
POST/resto/api/events/metadata

Версия 3.9 (GET) и 5.0 (POST с фильтром) · ответ: groupsList

Возвращает иерархию событий — аналог дерева журнала событий в бэк-офисе. Поле <id> группы или типа — это то, что вы подставляете в <type> события. Структура также определяет список атрибутов, специфичных для каждого события, и severity (0 — низкая, 1 — средняя, 2 — высокая).

Запись собственных событий

POST/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.GuidUUID
Наследники java.lang.Number (java.lang.Integer, java.math.BigDecimal)Число
Наследники resto.db.CachedEntity (User, Department, Terminal)UUID соответствующего справочника

Тип события может быть любой строкой до 255 символов. Но если этот тип зарегистрирован в events.xml, событие должно содержать все обязательные для него атрибуты.

Кассовые смены из журнала событий

GET/resto/api/events/sessions?from_time={t}&to_time={t}

Версия 5.0 · время открытия и закрытия, менеджер, номер смены, номер кассы, операционный день

20Репликация

Методы имеют смысл только на Syrve Chain. На отдельном RMS первые два вернут ошибку.

GET/resto/api/replication/statuses

Версия 5.0 · список статусов последних репликаций всех подключённых к Chain серверов RMS

GET/resto/api/replication/byDepartmentId/{departmentId}/status

Статус репликации конкретного заведения. Ошибка, если в Chain нет заведения с таким GUID

GET/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&timestamp=$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-Typeapplication/json;charset=UTF-8
Накладная проводится, но суммы не совпадаютНе учтена настройка «НДС включён в цену закупки»Прочитать /resto/api/corporation/settings
Поиск склада по коду ничего не находитКоды складов не заполнены — поле необязательноеИскать по GUID или заполнить коды в бэк-офисе
Периодически «теряются» событияИспользовали from_rev вместе с to_timeПри работе по ревизии to_time не передавать