Продукты
От Максим
От Максим
Методы для продуктов, их состава и остатков
Продукты
Продукты: то, что вы производите из материалов. Через API их можно создавать, редактировать и удалять, задавать состав продукта, получать список и данные продукта, обновлять остатки на складах. Пути методов указаны относительно базового адреса API, а общие для всех методов правила (авторизация, формат запросов, частичное редактирование, постраничная выдача) описаны в статьях Обзор API и Общие правила. Методы | Метод | Что делает | |---|---| | v1/products/add | Создает продукт | | v1/products/edit | Изменяет продукт | | v1/products/delete | Удаляет продукт | | v1/products/update_stock | Устанавливает остаток на складе | | v1/products/get_list | Возвращает продукты склада | | v2/products/get_entry | Возвращает данные продукта и его состав | | v1/products/get_stocks | Возвращает остатки продуктов по всем складам | Поля продукта | Поле | Тип | Описание | |---|---|---| | id | int | ID продукта | | name | string | Название | | sku | string | Артикул | | unit | string | Единица измерения, код из статьи Единицы измерения | | price | float | Цена продажи за единицу | | cost | float | Себестоимость единицы. Рассчитывается Controlata, через API не задается | | batch_size | float | Размер партии: на какое количество продукта указан состав | | notes | string | Заметки | | status | int | Всегда 1: удаленные продукты не возвращаются | | archived | int | 1, если продукт в архиве | | categories | array | Категории продукта: id и name | | suppliers | array | Поставщики продукта: id и name | | alternative_sku | array | Альтернативные артикулы: label и sku | Альтернативные артикулы (в Controlata это Альтернативные SKU) нужны, когда один продукт продается под разными артикулами, например на разных маркетплейсах. В строках заказов, поставок и других операций продукт ищется сначала по основному артикулу, затем по альтернативным. Поле label: необязательная подпись до 100 символов, sku: артикул от 1 до 50 символов. Остатки на складах Остаток, минимальный остаток и запланированное изменение хранятся отдельно для каждого склада. Поэтому методы, которые их возвращают или меняют, принимают storage_id. | Поле | Тип | Описание | |---|---|---| | stock | float | Остаток на складе | | minimum | float | Минимальный остаток на складе | | planned | float | Изменение остатка по операциям в статусе План (производства, поставки, заказы). null, если таких операций нет | Продукт числится на складе, если у него там есть строка остатка, в том числе с нулевым остатком. Такая строка появляется: - на складе, указанном при создании продукта; - на складах, где в настройках продуктов выбрано Все, и на складах, чьи категории совпадают с категориями продукта; - на любом другом складе, когда туда приходит остаток (производство, поставка, перемещение, обновление остатка). Если остаток на таком складе снова становится нулевым, строка удаляется. Методы get_list и get_entry видят продукт только на тех складах, где у него есть строка остатка. Состав продукта Состав продукта задается на одну партию, то есть на batch_size единиц продукта. Он передается в методы v1/products/add и v1/products/edit тремя массивами: | Поле | Что содержит | |---|---| | materials | Материалы | | products | Заготовки: другие продукты, которые входят в состав | | resources | Ресурсы: работа, электроэнергия, оборудование, накладные расходы | Строки materials и products | Поле | Тип | Обязательное | Описание | |---|---|---|---| | id | int | Да | ID материала или продукта | | amount_per_batch | float | Да | Количество на партию, больше 0 | | unit | string | Да | Единица строки. Должна быть из той же группы, что единица материала или продукта: для материала в «кг» подойдут «кг» или «г» | | loss_percent | float | Нет | Потери в процентах: от 0 до 100, не включая 100. По умолчанию 0 | | position | int | Нет | Порядковый номер строки в составе | Материалы и заготовки идут в составе общим списком, поэтому position у них общий. Строки с position сортируются по нему. Строки без position идут после них в порядке передачи: сначала materials, затем products. Controlata нумерует строки заново с 0, поэтому в ответе position может отличаться от переданного. Продукт не может входить в состав самого себя. Повторы не проверяются: один и тот же материал можно добавить в состав дважды. Строки resources | Поле | Тип | Обязательное | Описание | |---|---|---|---| | id | int | Да | ID ресурса | | amount_per_batch | float | Зависит от типа ресурса | Количество, сумма или процент на партию | | unit | string | Зависит от типа ресурса | Единица из той же группы, что единица ресурса | Что передавать, зависит от типа ресурса (подробнее о типах в статье Ресурсы): | Тип ресурса | amount_per_batch | unit | |---|---|---| | Фиксированная ставка | Количество на партию, например часы работы | Нужна | | Фиксированная ставка, цена указывается в составе продукта | Сумма на партию в рублях | Не нужна | | Процент | Не нужен: процент берется из ресурса | Не нужна | | Процент, указывается в составе продукта | Процент, больше 0 и не больше 100 | Не нужна | | Амортизация | Количество на партию, например часы работы оборудования | Нужна | Ресурсы идут в том порядке, в каком переданы. Поле position в строках ресурсов не учитывается. Как передается состав - Количества указываются на партию. Расход на единицу продукта Controlata считает сама: amount_per_batch / batch_size. Процент процентного ресурса от размера партии не зависит. - Массивы заменяют состав целиком. Если передан хотя бы один из массивов materials и products, материалы и заготовки заменяются полностью, а непереданный массив считается пустым. Ресурсы меняются, только если передан resources. - Чтобы очистить состав, передайте пустой массив. - Строки состава из ответа v2/products/get_entry можно отправить в add и edit без изменений: лишние поля (name, cost_per_batch и другие) игнорируются. Ошибки в строках состава В тексте ошибки вместо 2051 будет ID позиции, а вместо 0 номер строки в массиве (с 0). | Ошибка | Причина | |---|---| | Materials is not an array | materials передан не массивом (так же для products и resources) | | Line 0 of materials must be an object | Строка не объект (так же для products и resources) | | No id for material 0 | Не передан id материала или он не число (так же для product) | | Material 2051 not found | Материал не найден или удален | | Product 2051 not found | Продукт не найден или удален | | Product cannot be a component of itself | Продукт добавлен в собственный состав | | Amount per batch must be greater than 0 for material 2051 | Количество не передано, не число или после округления до 3 знаков равно 0 (так же для product и resource) | | Unit not found for material 2051. Use a unit of the same group as the material unit | Единица не передана, неизвестна или из другой группы (так же для product) | | Loss percent must be from 0 to 100 for material 2051 | Потери меньше 0, не меньше 100 или не число (так же для product) | | Resource for line 0 not found | Ресурс не найден или удален | | Percent must not exceed 100 for resource 2051 | Процент в составе больше 100 | | Unit not found for resource 2051. Use a unit of the same group as the resource unit | Единица ресурса не передана, неизвестна или из другой группы | Себестоимость Себестоимость единицы продукта (cost) Controlata рассчитывает по составу: - материалы: по цене материала с учетом потерь; - заготовки: по их себестоимости с учетом потерь; - фиксированная ставка и амортизация: по цене ресурса за единицу; - процентные ресурсы: процент от себестоимости без процентных ресурсов или от цены продажи, в зависимости от базы расчета ресурса. Себестоимость пересчитывается при изменении состава, размера партии и цены продажи продукта, а также цен материалов и ресурсов и себестоимости заготовок. У продукта без состава себестоимость берется из поставок этого продукта, а до первой поставки равна 0.
Создание продукта
Создает продукт вместе с составом. Продукт появляется на складе storage_id и на складах, которые хранят все продукты или его категории. v1/products/add.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | name | string | Да | Название | | unit | string | Да | Единица измерения, код из статьи Единицы измерения | | storage_id | int | Да | Склад, на котором создается остаток | | sku | string | Нет | Артикул | | price | float | Нет | Цена продажи за единицу. По умолчанию 0 | | batch_size | float | Нет | Размер партии: на какое количество продукта указан состав. Больше 0, по умолчанию 1 | | stock | float | Нет | Начальный остаток на складе storage_id. По умолчанию 0 | | minimum | float | Нет | Минимальный остаток на складе storage_id. По умолчанию 0 | | notes | string | Нет | Заметки | | categories | array | Нет | ID категорий из v1/categories/get_list с type «products» | | suppliers | array | Нет | ID поставщиков из v1/suppliers/get_list | | alternative_sku | array | Нет | Альтернативные артикулы: объекты с полями sku (от 1 до 50 символов) и label (необязательная подпись до 100 символов) | | materials | array | Нет | Материалы в составе | | products | array | Нет | Заготовки в составе | | resources | array | Нет | Ресурсы в составе | Формат строк materials, products и resources описан в разделе «Состав продукта» статьи Продукты. Количества в составе указываются на партию из batch_size единиц. Controlata рассчитывает себестоимость продукта по составу, и по ней же оценивается начальный остаток. Если состава нет, начальный остаток оценивается по нулевой себестоимости. Категории через API не создаются, можно назначить только существующие. В categories и suppliers можно передать числа или объекты с полем id, как их возвращает v2/products/get_entry. Уникальность основного и альтернативных артикулов не проверяется. Пример запроса Стол: в партии 10 штук, на партию уходит 0.5 куб. м доски с потерями 5%, 400 саморезов, 40 ножек (заготовка) и 30 часов работы столяра. Накладные расходы считаются процентом, который задан в самом ресурсе, поэтому для него достаточно id. { "name": "Стол обеденный", "sku": "P100", "unit": "шт", "price": 45000, "batch_size": 10, "storage_id": 3999, "stock": 5, "minimum": 2, "categories": [21], "suppliers": [46], "alternative_sku": [ { "label": "Ozon", "sku": "OZ-P100" } ], "materials": [ { "id": 2051, "amount_per_batch": 0.5, "unit": "куб. м", "loss_percent": 5 }, { "id": 2060, "amount_per_batch": 400, "unit": "шт" } ], "products": [ { "id": 312, "amount_per_batch": 40, "unit": "шт" } ], "resources": [ { "id": 57, "amount_per_batch": 30, "unit": "ч" }, { "id": 58 } ] } Пример ответа { "success": true, "product_id": 3120 } Ошибки | Ошибка | Причина | |---|---| | No name in input | Не передано обязательное поле (вместо name будет имя поля) | | Name must not be empty | Пустое название | | Name must be a string | Название передано не строкой, например массивом | | Unit not set | Передана пустая единица измерения | | Unit not found | Неизвестная единица измерения или единица только для ресурсов | | Storage ID is not set | storage_id равен 0 или пустой | | Storage ID not found | Склад не найден или удален | | Batch size must be greater than 0 | Размер партии 0 или меньше | | Invalid price value. Must be a number | Значение не число, например "12,5" (так же для batch_size, stock и minimum) | | Category 12 not found | Категория не найдена | | Supplier not found or access denied | Поставщик не найден или удален | | Alternative_sku is not an array | alternative_sku передан не массивом | | SKU must be from 1 to 50 characters for alternative_sku 0 | Альтернативный артикул пустой или длиннее 50 символов (в конце номер строки с 0) | | Label must not exceed 100 characters for alternative_sku 0 | Подпись альтернативного артикула длиннее 100 символов | Ошибки в строках materials, products и resources перечислены в разделе «Состав продукта» статьи Продукты.
Редактирование продукта
Изменяет продукт и его состав. Меняются только переданные поля, остальные остаются прежними. Подробнее о частичном редактировании в статье Общие правила. v1/products/edit.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | product_id | int | Да | ID продукта | | name | string | Нет | Название | | sku | string | Нет | Артикул | | unit | string | Нет | Единица измерения | | price | float | Нет | Цена продажи за единицу | | batch_size | float | Нет | Размер партии, больше 0 | | notes | string | Нет | Заметки | | minimum | float | Нет | Минимальный остаток на складе storage_id | | storage_id | int | С minimum | Склад, на котором меняется минимальный остаток | | categories | array | Нет | ID категорий. Заменяют текущие целиком | | suppliers | array | Нет | ID поставщиков. Заменяют текущих целиком | | alternative_sku | array | Нет | Альтернативные артикулы: объекты с полями sku и label. Заменяют текущие целиком | | materials | array | Нет | Материалы в составе | | products | array | Нет | Заготовки в составе | | resources | array | Нет | Ресурсы в составе. Заменяют текущие целиком | Чтобы очистить поле, передайте пустую строку. Чтобы снять все категории, поставщиков или альтернативные артикулы, передайте пустой массив. Как работает - Состав. Формат строк описан в разделе «Состав продукта» статьи Продукты. Если передан хотя бы один из массивов materials и products, материалы и заготовки заменяются целиком, а непереданный массив считается пустым. Например, если передать только materials, заготовки из состава удалятся. Ресурсы меняются, только если передан resources. - Размер партии. Количества в составе хранятся на партию. Если изменить batch_size без состава, они останутся прежними, а расход на единицу продукта пересчитается: 0.5 куб. м на партию из 10 штук дает 0.05 на штуку, а на партию из 20 штук уже 0.025. Чтобы сохранить расход на единицу, передайте вместе с batch_size и состав с новыми количествами. - Себестоимость. После изменения состава, ресурсов, размера партии или цены продажи Controlata пересчитывает себестоимость продукта и продуктов, в состав которых он входит. Производства этого продукта получают отметку bom_changed: состав изменился после их создания. Если производств и поставок продукта еще не было, по новой себестоимости переоцениваются начальный остаток и корректировки остатка. - Единица измерения. Если новая единица из той же группы (например, «г» вместо «кг»), Controlata пересчитывает остатки, историю движений и минимальный остаток. Если цена не передана, она тоже пересчитывается: 500 за кг станет 0.5 за г. Сменить группу (например, «шт» на «кг») нельзя, если продукт входит в состав других продуктов. - Минимальный остаток задается на конкретном складе, поэтому вместе с ним нужен storage_id. Продукт должен числиться на этом складе (см. Продукты). - Категории определяют, на каких складах числится продукт. После их изменения продукт появится на складах с новыми категориями и пропадет со складов прежних категорий, если остаток там нулевой и нет запланированных операций. Пример запроса Новая цена продажи и состав материалов. Заготовки не переданы, поэтому удалятся из состава, ресурсы останутся прежними. { "product_id": 3120, "price": 47000, "materials": [ { "id": 2051, "amount_per_batch": 0.6, "unit": "куб. м", "loss_percent": 5 }, { "id": 2060, "amount_per_batch": 400, "unit": "шт" } ] } Изменить только минимальный остаток: { "product_id": 3120, "minimum": 3, "storage_id": 3999 } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No product_id in input | Не передан product_id | | Product not found or access denied | Продукт не найден или удален | | Name must not be empty | Передано пустое название | | Name must be a string | Название передано не строкой, например массивом | | Unit not set | Передана пустая единица измерения | | Unit not found | Неизвестная единица измерения | | Unit cannot be changed to another unit group: the product is used in components of other products | Смена группы единицы у продукта, который входит в состав других продуктов | | Batch size must be greater than 0 | Размер партии 0 или меньше | | No storage_id in input | Передан minimum без storage_id | | Storage ID not found | Склад не найден или удален | | Product is not stored in storage location 3999, so its minimum cannot be set there | Продукт не числится на складе | | Invalid price value. Must be a number | Значение не число (так же для batch_size и minimum) | | Category 12 not found | Категория не найдена | | Supplier not found or access denied | Поставщик не найден или удален | | SKU must be from 1 to 50 characters for alternative_sku 0 | Альтернативный артикул пустой или длиннее 50 символов | | Label must not exceed 100 characters for alternative_sku 0 | Подпись альтернативного артикула длиннее 100 символов | Ошибки в строках materials, products и resources перечислены в разделе «Состав продукта» статьи Продукты.
Удаление продукта
Удаляет продукт. v1/products/delete.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | product_id | int | Да | ID продукта | Как работает - Остатки продукта на всех складах обнуляются корректировкой. - Продукт убирается из состава других продуктов. Себестоимость этих продуктов пересчитывается, а их производства получают отметку bom_changed. - Файлы продукта удаляются. - Заказы, производства и другие операции с продуктом остаются в истории. Пример запроса { "product_id": 3120 } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No product_id in input | Не передан product_id | | Product not found or access denied | Продукт не найден или уже удален |
Обновление остатка продукта
Устанавливает остаток продукта на складе. Передается итоговый остаток, а не изменение: Controlata создаст корректировку на разницу между текущим и новым остатком. v1/products/update_stock.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | product_id | int | Да | ID продукта | | storage_id | int | Да | ID склада | | stock | float | Да | Новый остаток | | notes | string | Нет | Заметки к корректировке | Как работает - Увеличение остатка оценивается по себестоимости последнего прихода продукта на этот склад (создание, производство, поставка, перемещение). Если приходов не было, используется текущая себестоимость продукта. Уменьшение списывает партии по FIFO. - Остаток можно установить на любом складе, даже если продукт там раньше не числился. На таком складе продукт будет числиться, пока остаток не станет нулевым (см. Продукты). - Если в Controlata подключена синхронизация остатков с Wildberries или Ozon, новый остаток передается в маркетплейс по ее настройкам, как и при любом другом изменении остатка. Пример запроса { "product_id": 3120, "storage_id": 3999, "stock": 12, "notes": "Инвентаризация на складе" } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No stock in input | Не передано обязательное поле (вместо stock будет имя поля) | | Invalid stock value. Must be a number | Остаток не число, например "" или "4,2" | | Storage ID not found | Склад не найден или удален | | Product not found or access denied | Продукт не найден или удален |
Список продуктов
Возвращает продукты, которые числятся на складе (в том числе с нулевым остатком), отсортированные по названию. Архивные продукты тоже входят в список. v1/products/get_list.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | storage_id | int | Да | ID склада | | limit | int | Нет | Размер страницы, от 1 до 1000 | | offset | int | Нет | Сколько записей пропустить | Без limit возвращается весь список. Подробнее о постраничной выдаче в статье Общие правила. Ответ Массив products с полями продукта и его остатка на складе storage_id (см. Продукты), без поставщиков, альтернативных артикулов и состава. Их возвращает v2/products/get_entry. Поле total содержит общее число продуктов на складе. Пример запроса { "storage_id": 3999, "limit": 100, "offset": 0 } Пример ответа { "success": true, "products": [ { "id": "3120", "name": "Стол обеденный", "sku": "P100", "price": "45000", "cost": "13604.25", "batch_size": "10.000", "notes": "", "status": "1", "archived": "0", "stock": "12.000", "minimum": "3.000", "planned": null, "unit": "шт", "categories": [ { "id": "21", "name": "Мебель" } ] } ], "total": 1 } Ошибки | Ошибка | Причина | |---|---| | No storage_id in input | Не передан storage_id | | Storage ID not found | Склад не найден или удален | | Invalid limit value. Must be between 1 and 1000 | Неверный limit | | Offset requires limit | Передан offset без limit |
Данные продукта
Возвращает данные продукта, его остаток на складе и состав. v2/products/get_entry.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | product_id | int | Да | ID продукта | | storage_id | int | Да | ID склада | Продукт возвращается, только если он числится на складе storage_id. Остатки на всех складах сразу возвращает v1/products/get_stocks. Ответ Объект product со всеми полями продукта, его остатком на складе storage_id, категориями, поставщиками и альтернативными артикулами (см. Продукты). Кроме них в объекте есть: | Поле | Тип | Описание | |---|---|---| | materials | array | Материалы в составе | | products | array | Заготовки в составе | | resources | array | Ресурсы в составе | | percent | float | Себестоимость в процентах от цены продажи, с одним знаком после запятой. 0, если цена продажи не задана | Поля строк состава: | Поле | Описание | |---|---| | id | ID материала, продукта или ресурса | | name | Название | | sku | Артикул. Только у материалов и заготовок | | type, dynamic, base | Тип расчета, признак «указывается в составе продукта» и база расчета. Только у ресурсов (см. Ресурсы) | | amount_per_batch | Количество на партию | | amount_per_unit | Количество на единицу продукта: amount_per_batch / batch_size. У процентного ресурса совпадает с amount_per_batch | | loss_percent | Потери в процентах. Только у материалов и заготовок | | unit | Единица строки. У процентного ресурса «%», у фиксированной ставки с ценой в составе продукта «шт», а amount_per_batch у нее означает сумму в рублях | | status | Всегда 1 | | cost_per_unit | Стоимость строки на единицу продукта, с учетом потерь | | cost_per_batch | Стоимость строки на партию, с учетом потерь | | position | Порядковый номер строки: общий для materials и products, отдельный для resources | Как и остальные числа, поля строк приходят строками. Исключения: percent, а также cost_per_unit и cost_per_batch процентных ресурсов, которые Controlata рассчитывает при запросе: они приходят числами. Строки состава, категории и поставщиков из ответа можно передать в v1/products/edit без изменений. Пример запроса { "product_id": 3120, "storage_id": 3999 } Пример ответа { "success": true, "product": { "id": "3120", "name": "Стол обеденный", "sku": "P100", "price": "45000", "cost": "13604.25", "batch_size": "10.000", "notes": "", "status": "1", "archived": "0", "stock": "12.000", "minimum": "3.000", "planned": null, "unit": "шт", "categories": [ { "id": "21", "name": "Мебель" } ], "alternative_sku": [ { "label": "Ozon", "sku": "OZ-P100" } ], "suppliers": [ { "id": "46", "name": "ООО Мебельторг" } ], "materials": [ { "id": "2051", "name": "Доска дубовая", "sku": "M010", "amount_per_unit": "0.05", "amount_per_batch": "0.5", "loss_percent": "5.00", "unit": "куб. м", "status": "1", "cost_per_unit": "7087.5", "cost_per_batch": "70875", "position": "0" }, { "id": "2060", "name": "Саморез 4x40", "sku": "M024", "amount_per_unit": "40", "amount_per_batch": "400", "loss_percent": "0.00", "unit": "шт", "status": "1", "cost_per_unit": "80", "cost_per_batch": "800", "position": "1" } ], "products": [ { "id": "312", "name": "Ножка стола", "sku": "P012", "amount_per_unit": "4", "amount_per_batch": "40", "loss_percent": "0.00", "unit": "шт", "status": "1", "cost_per_unit": "3400", "cost_per_batch": "34000", "position": "2" } ], "resources": [ { "id": "57", "name": "Работа столяра", "type": "rate", "dynamic": "0", "base": null, "amount_per_unit": "3", "amount_per_batch": "30", "unit": "ч", "status": "1", "cost_per_unit": "1800", "cost_per_batch": "18000", "position": "0" }, { "id": "58", "name": "Накладные расходы", "type": "percent", "dynamic": "0", "base": "cost", "amount_per_unit": "10", "amount_per_batch": "10", "unit": "%", "status": "1", "cost_per_unit": 1236.75, "cost_per_batch": 12367.5, "position": "1" } ], "percent": 30.2 } } Ошибки | Ошибка | Причина | |---|---| | No product_id in input | Не передано обязательное поле (вместо product_id будет имя поля) | | Storage ID not found | Склад не найден или удален | | Product not found or access denied | Продукт не найден, удален или не числится на складе | Версия v1 Метод v1/products/get_entry продолжает работать с теми же параметрами. Отличие в составе: материалы и заготовки в нем приходят одним массивом components, а id в строках имеет вид «m-123» для материала и «p-45» для заготовки. Такие строки нельзя отправить в add и edit без изменений, поэтому в новых интеграциях используйте v2.
Остатки продуктов
Возвращает остатки продуктов по всем складам одним списком: строку на каждую пару «продукт, склад», где продукт числится. v1/products/get_stocks.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | ids | array | Нет | ID продуктов. Без них возвращаются все продукты | | storage_id | int | Нет | Только этот склад | | limit | int | Нет | Размер страницы, от 1 до 1000 | | offset | int | Нет | Сколько записей пропустить | Строки отсортированы по ID продукта и склада. Удаленные продукты и склады в список не входят. Поле total содержит общее число строк, подходящих под фильтры. Пример запроса { "ids": [3120, 312] } Пример ответа { "success": true, "stocks": [ { "product_id": "312", "storage_id": "3999", "stock": "86.000", "minimum": "40.000", "planned": "-40.000" }, { "product_id": "3120", "storage_id": "3999", "stock": "12.000", "minimum": "3.000", "planned": null }, { "product_id": "3120", "storage_id": "4005", "stock": "0.000", "minimum": "0.000", "planned": "10.000" } ], "total": 3 } Ошибки | Ошибка | Причина | |---|---| | Ids is not an array | ids передан не массивом | | Storage ID not found | Склад не найден или удален | | Invalid limit value. Must be between 1 and 1000 | Неверный limit |