Перемещения
От Максим
От Максим
Методы для перемещений между складами
Перемещения
Перемещения: перенос материалов или продуктов с одного склада на другой. Через API перемещения можно создавать, редактировать и удалять, менять их статус, получать список и данные перемещения. Пути методов указаны относительно базового адреса API, а общие для всех методов правила (авторизация, формат запросов, частичное редактирование, строки операций, постраничная выдача) описаны в статьях Обзор API и Общие правила. Методы | Метод | Что делает | |---|---| | v1/transfers/add | Создает перемещение | | v1/transfers/edit | Изменяет перемещение | | v1/transfers/delete | Удаляет перемещение | | v1/transfers/update_status | Меняет статус перемещения | | v1/transfers/get_list | Возвращает список перемещений | | v1/transfers/get_entry | Возвращает перемещение со строками | Поля перемещения | Поле | Тип | Описание | |---|---|---| | id | int | ID перемещения | | num | string | Номер | | date | string | Дата перемещения, YYYY-MM-DD | | status | int | Статус: 0 План, 1 Отправлено, 2 Получено | | source_storage_id | int | Склад, с которого перемещаются позиции | | source_storage_name | string | Название склада-источника | | target_storage_id | int | Склад, на который перемещаются позиции | | target_storage_name | string | Название склада-получателя | | cost | float | Себестоимость перемещенного по FIFO | | price | float | Стоимость продуктов по цене продажи. У перемещения материалов 0 | | amount | float | Общее количество. null, если у позиций разные единицы измерения | | lines | int | Количество строк | | notes | string | Заметки | Материалы или продукты Одно перемещение переносит либо материалы, либо продукты. Поэтому строки передаются только в одном из массивов: materials или products. Чтобы переместить и то и другое, создайте два перемещения. Оба склада должны хранить позиции этого типа: в настройках склада для материалов (или продуктов) не должно быть выбрано Нет. Какие позиции хранит склад, показывают поля materials и products в v1/storages/get_list. Склад-источник и склад-получатель должны различаться. Статусы Каждая строка перемещения состоит из двух движений: расхода на складе-источнике и прихода на складе-получателе. Статус определяет, какие из них уже произошли. | Код | Статус | Склад-источник | Склад-получатель | |---|---|---|---| | 0 | План | Расход запланирован | Приход запланирован | | 1 | Отправлено | Позиции списаны | Приход запланирован | | 2 | Получено | Позиции списаны | Позиции поступили | Запланированное движение не меняет остаток, а учитывается в поле planned остатков. Новое перемещение создается в статусе из настройки Статус нового перемещения по умолчанию. Сменить статус можно методом v1/transfers/update_status. Себестоимость Позиции списываются со склада-источника по FIFO и поступают на склад-получатель с той же себестоимостью. Если остатка на источнике не хватает, перемещение все равно проводится, остаток источника уходит в минус. Номер Номер перемещения строковый и задается свободно. Если не передать его при создании, Controlata присвоит следующий по порядку: наибольший числовой номер плюс 1. Уникальность номера не проверяется.
Создание перемещения
Создает перемещение материалов или продуктов между складами. v1/transfers/add.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | source_storage_id | int | Да | Склад, с которого перемещаются позиции | | target_storage_id | int | Да | Склад, на который перемещаются позиции | | materials | array | materials или products | Перемещаемые материалы: id или sku и amount | | products | array | materials или products | Перемещаемые продукты: id или sku и amount | | num | string | Нет | Номер. По умолчанию следующий по порядку | | date | string | Нет | Дата перемещения, YYYY-MM-DD. По умолчанию сегодня | | notes | string | Нет | Заметки | Строка materials и products: | Поле | Тип | Обязательное | Описание | |---|---|---|---| | id | int | id или sku | ID материала или продукта | | sku | string | id или sku | Артикул | | amount | float | Да | Количество, больше 0 | Передайте строки только в одном массиве: перемещение переносит либо материалы, либо продукты. Тип перемещения определяется по заполненному массиву. Как указывать позицию по id или артикулу, описано в статье Общие правила. Как работает - Статус берется из настройки Статус нового перемещения по умолчанию. От него зависит, списаны ли позиции с источника и поступили ли на получатель (см. Перемещения). - Склады должны различаться и хранить позиции типа перемещения. - Себестоимость считается на складе-источнике по FIFO и переносится на склад-получатель. Пример запроса { "source_storage_id": 3998, "target_storage_id": 4001, "date": "2026-10-06", "products": [ { "id": 512, "amount": 5 }, { "sku": "P-CHAIR-01", "amount": 20 } ], "notes": "В магазин на Ленина" } Пример ответа { "success": true, "transfer_id": 6967, "num": "31", "status": 0 } В ответе приходят ID, номер и код статуса нового перемещения. Ошибки | Ошибка | Причина | |---|---| | No source_storage_id in input | Не передано обязательное поле (вместо source_storage_id будет имя поля) | | A transfer moves either materials or products. Create separate transfers | Переданы и materials, и products | | No products or materials in input | Не передано ни одной строки | | Products is not an array | products не массив (так же для materials) | | Line 0 of products must be an object | Строка не объект (вместо 0 будет номер строки) | | SKU or id not set for product 0 | В строке нет ни id, ни sku | | Product with id 512 not found | Продукт не найден или удален (для артикула: Product with SKU "P-CHAIR-01" not found) | | Amount must be greater than 0 for product with id 512 | Количество не число или не больше 0 после округления | | Storage ID is not set | Склад равен 0 или пустой | | Storage ID not found | Склад не найден или удален | | Source and target storage locations must be different | Передан один и тот же склад | | Storage location 4001 does not store products | Склад не хранит позиции этого типа (для материалов: does not store materials) | | Date is not a valid date in format YYYY-MM-DD | Неверный формат даты |
Редактирование перемещения
Изменяет перемещение. Меняются только переданные поля, остальные остаются прежними. Подробнее о частичном редактировании в статье Общие правила. v1/transfers/edit.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | transfer_id | int | Да | ID перемещения | | materials | array | Нет | Перемещаемые материалы: id или sku и amount | | products | array | Нет | Перемещаемые продукты: id или sku и amount | | source_storage_id | int | Нет | Склад, с которого перемещаются позиции | | target_storage_id | int | Нет | Склад, на который перемещаются позиции | | num | string | Нет | Номер | | date | string | Нет | Дата перемещения, YYYY-MM-DD | | notes | string | Нет | Заметки | Если передан materials или products, строки заменяются целиком. Строки передаются только в одном массиве, как в v1/transfers/add. Если не передан ни один массив, строки остаются прежними. Статус этим методом не меняется, для него есть v1/transfers/update_status. Как работает - Пересчет. Перемещение проводится заново: прежние движения отменяются, строки списываются с источника по FIFO с текущими остатками. Статус сохраняется. - Тип перемещения меняется вместе со строками: передайте строки в другом массиве, например products вместо materials. - Склады проверяются, только если переданы склады или строки. Тогда оба склада, в том числе непереданный, должны существовать, различаться и хранить позиции типа перемещения. Поэтому перемещение со складом, который позже удалили, можно изменить, если не передавать склады и строки. Пример запроса { "transfer_id": 6967, "target_storage_id": 4005, "notes": "В магазин на Гагарина" } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No transfer_id in input | Не передан transfer_id | | Transfer not found or access denied | Перемещение не найдено или удалено | | A transfer moves either materials or products. Create separate transfers | Переданы и materials, и products | | No products or materials in input | Массивы строк переданы, но пустые | | Product with id 512 not found | Продукт не найден или удален | | Amount must be greater than 0 for product with id 512 | Количество не число или не больше 0 после округления | | Storage ID is not set | Склад равен 0 или пустой | | Storage ID not found | Склад не найден или удален | | Source and target storage locations must be different | Склады совпадают | | Storage location 4005 does not store products | Склад не хранит позиции этого типа | | Date is not a valid date in format YYYY-MM-DD | Неверный формат даты | Остальные ошибки строк такие же, как в v1/transfers/add.
Удаление перемещения
Удаляет перемещение. v1/transfers/delete.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | transfer_id | int | Да | ID перемещения | Как работает - Движения перемещения отменяются: позиции возвращаются на склад-источник и убираются со склада-получателя, остатки обоих складов пересчитываются. - Файлы перемещения удаляются. Пример запроса { "transfer_id": 6967 } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No transfer_id in input | Не передан transfer_id | | Transfer not found or access denied | Перемещение не найдено или уже удалено |
Смена статуса перемещения
Меняет статус перемещения. От статуса зависит, списаны ли позиции со склада-источника и поступили ли на склад-получатель. v1/transfers/update_status.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | transfer_id | int | Да | ID перемещения | | status | int | Да | Новый статус: 0 План, 1 Отправлено, 2 Получено | Как работает | Новый статус | Склад-источник | Склад-получатель | |---|---|---| | 0 План | Расход запланирован, остаток не уменьшен | Приход запланирован | | 1 Отправлено | Позиции списаны | Приход запланирован, остаток не увеличен | | 2 Получено | Позиции списаны | Позиции поступили | Статус можно менять в любом порядке, в том числе возвращать назад: например, из Получено в Отправлено позиции снова уходят с остатка получателя. Запланированные движения учитываются в поле planned остатков. Если перемещение уже в этом статусе, ничего не меняется, а метод отвечает успехом. Себестоимость при смене статуса не пересчитывается. Пример запроса { "transfer_id": 6967, "status": 2 } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No transfer_id in input | Не передано обязательное поле (вместо transfer_id будет имя поля) | | Invalid status value. Must be one of: 0, 1, 2 | Неверный код статуса | | Transfer not found or access denied | Перемещение не найдено или удалено |
Список перемещений
Возвращает перемещения компании, от новых к старым: по дате, а внутри одной даты по ID. v1/transfers/get_list.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | storage_id | int | Нет | Только перемещения, где этот склад источник или получатель | | date_from | string | Нет | Перемещения с этой даты включительно, YYYY-MM-DD | | date_to | string | Нет | Перемещения по эту дату включительно, YYYY-MM-DD | | status | int | Нет | Статус: 0 План, 1 Отправлено, 2 Получено | | limit | int | Нет | Размер страницы, от 1 до 1000 | | offset | int | Нет | Сколько записей пропустить | Без limit возвращается весь список. Подробнее о постраничной выдаче в статье Общие правила. Ответ Массив transfers с полями перемещения (см. Перемещения), без строк. Строки и тип перемещения возвращает v1/transfers/get_entry. Поле total содержит общее число перемещений, подходящих под фильтры. Пример запроса { "storage_id": 4001, "status": 1, "limit": 100, "offset": 0 } Пример ответа { "success": true, "transfers": [ { "id": "6967", "num": "31", "date": "2026-10-06", "status": "1", "source_storage_id": "3998", "source_storage_name": "Главный", "target_storage_id": "4001", "target_storage_name": "Магазин", "cost": "61500.00", "price": "125000.00", "amount": "25.000", "lines": "2", "notes": "В магазин на Ленина" } ], "total": 1 } Ошибки | Ошибка | Причина | |---|---| | Date is not a valid date in format YYYY-MM-DD | Неверный формат date_from или date_to | | Invalid limit value. Must be between 1 and 1000 | Неверный limit | | Offset requires limit | Передан offset без limit |
Данные перемещения
Возвращает перемещение с его строками. v1/transfers/get_entry.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | transfer_id | int | Да | ID перемещения | Ответ Объект transfer со всеми полями перемещения (см. Перемещения) и строками в двух массивах: materials и products. Заполнен только массив того типа, который переносит перемещение, второй приходит пустым. | Поле | Тип | Описание | |---|---|---| | id | int | ID материала или продукта | | sku | string | Артикул | | name | string | Название | | amount | float | Количество | | unit | string | Единица измерения | | cost | float | Себестоимость строки по FIFO | | position | int | Порядковый номер строки, с 0 | Строки из ответа можно отправить в v1/transfers/edit без изменений. Пример запроса { "transfer_id": 6967 } Пример ответа { "success": true, "transfer": { "id": "6967", "num": "31", "date": "2026-10-06", "status": "1", "source_storage_id": "3998", "source_storage_name": "Главный", "target_storage_id": "4001", "target_storage_name": "Магазин", "cost": "61500.00", "price": "125000.00", "amount": "25.000", "lines": "2", "notes": "В магазин на Ленина", "materials": [], "products": [ { "id": "512", "sku": "P-TABLE-01", "name": "Стол обеденный", "amount": "5", "unit": "шт", "cost": "30500", "position": "0" }, { "id": "540", "sku": "P-CHAIR-01", "name": "Стул", "amount": "20", "unit": "шт", "cost": "31000", "position": "1" } ] } } Ошибки | Ошибка | Причина | |---|---| | No transfer_id in input | Не передан transfer_id | | Transfer not found or access denied | Перемещение не найдено или удалено |