Списания

7 статьи Максим От Максим

Методы для списаний материалов и продуктов

Списания

Списания: расход материалов и продуктов со склада вне заказов и производства, например брак, порча или материалы на собственные нужды. Через API списания можно создавать, редактировать и удалять, менять их статус, получать список и данные списания. Пути методов указаны относительно базового адреса API, а общие для всех методов правила (авторизация, формат запросов, частичное редактирование, строки операций, постраничная выдача) описаны в статьях Обзор API и Общие правила. Методы | Метод | Что делает | |---|---| | v1/writeoffs/add | Создает списание | | v1/writeoffs/edit | Изменяет списание | | v1/writeoffs/delete | Удаляет списание | | v1/writeoffs/update_status | Меняет статус списания | | v1/writeoffs/get_list | Возвращает список списаний | | v1/writeoffs/get_entry | Возвращает списание со строками | Поля списания | Поле | Тип | Описание | |---|---|---| | id | int | ID списания | | num | string | Номер | | date | string | Дата списания, YYYY-MM-DD | | status | int | Статус: 0 План, 1 Списано | | production_id | int | ID производства, к которому привязано списание. 0, если не привязано | | materials_storage_id | int | Склад, с которого списываются материалы | | materials_storage_name | string | Название склада материалов | | products_storage_id | int | Склад, с которого списываются продукты | | products_storage_name | string | Название склада продуктов | | cost | float | Себестоимость списанного по FIFO | | amount | float | Общее количество. null, если у позиций разные единицы измерения | | lines | int | Количество строк | | notes | string | Заметки | В одном списании могут быть и материалы, и продукты: материалы списываются со склада materials_storage_id, продукты со склада products_storage_id. Статусы | Код | Статус | Остатки | |---|---|---| | 0 | План | Списание только запланировано: остаток не меняется, количество учитывается в поле planned остатков | | 1 | Списано | Материалы и продукты списаны со склада | Новое списание создается в статусе из настройки Статус нового списания по умолчанию. Сменить статус можно методом v1/writeoffs/update_status. Номер Номер списания строковый и задается свободно. Если не передать его при создании, Controlata присвоит следующий по порядку: наибольший числовой номер плюс 1. Уникальность номера не проверяется. Привязка к производству Списание можно привязать к производству полем production_id. Тогда его себестоимость добавляется к себестоимости производства и распределяется между произведенными продуктами. Так учитывают, например, брак материалов при производстве. - Стоимость добавляется сразу при привязке, независимо от статуса списания. - При изменении списания стоимость производства пересчитывается, при удалении списания или передаче production_id, равного 0, вычитается. - При удалении производства списание остается, но отвязывается от него. Подробнее о производстве в статье Производство.

Создание списания

Создает списание материалов и продуктов со склада. v1/writeoffs/add.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | materials | array | materials или products | Списываемые материалы: id или sku и amount | | products | array | materials или products | Списываемые продукты: id или sku и amount | | num | string | Нет | Номер. По умолчанию следующий по порядку | | date | string | Нет | Дата списания, YYYY-MM-DD. По умолчанию сегодня | | materials_storage_id | int | Нет | Склад, с которого списываются материалы | | products_storage_id | int | Нет | Склад, с которого списываются продукты | | production_id | int | Нет | ID производства, к себестоимости которого добавляется стоимость списания | | notes | string | Нет | Заметки | Строка materials и products: | Поле | Тип | Обязательное | Описание | |---|---|---|---| | id | int | id или sku | ID материала или продукта | | sku | string | id или sku | Артикул | | amount | float | Да | Количество, больше 0 | Нужна хотя бы одна строка. Как указывать позицию по id или артикулу, описано в статье Общие правила. Как работает - Статус берется из настройки Статус нового списания по умолчанию. В статусе Списано остатки уменьшаются сразу, в статусе План списание только планируется. - Склады. Если склад не передан или равен 0, берется Склад по умолчанию для списания материалов при производстве (для продуктов Склад по умолчанию для списания продуктов при производстве). Если там выбрано Автоматически, берется склад по умолчанию для поставок. - Себестоимость считается по FIFO. Если остатка не хватает, списание все равно проводится, остаток уходит в минус. - Привязка к производству сразу увеличивает себестоимость производства на стоимость списания (см. Списания). Пример запроса { "date": "2026-10-06", "materials": [ { "id": 2051, "amount": 0.15 } ], "products": [ { "sku": "P-TABLE-01", "amount": 1 } ], "materials_storage_id": 3998, "products_storage_id": 4001, "notes": "Брак при распиле" } Пример ответа { "success": true, "writeoff_id": 19291, "num": "48", "status": 1 } В ответе приходят ID, номер и код статуса нового списания. Ошибки | Ошибка | Причина | |---|---| | No products or materials in input | Не передано ни одной строки | | Materials is not an array | materials не массив (так же для products) | | Line 0 of materials must be an object | Строка не объект (вместо 0 будет номер строки) | | SKU or id not set for material 0 | В строке нет ни id, ни sku | | Material with id 2051 not found | Материал не найден или удален (для продукта: Product with SKU "P-TABLE-01" not found) | | Amount must be greater than 0 for material with id 2051 | Количество не число или не больше 0 после округления | | Storage ID not found | Склад не найден или удален | | Production not found or access denied | Производство из production_id не найдено | | Date is not a valid date in format YYYY-MM-DD | Неверный формат даты |

Редактирование списания

Изменяет списание. Меняются только переданные поля, остальные остаются прежними. Подробнее о частичном редактировании в статье Общие правила. v1/writeoffs/edit.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | writeoff_id | int | Да | ID списания | | materials | array | Нет | Списываемые материалы: id или sku и amount | | products | array | Нет | Списываемые продукты: id или sku и amount | | num | string | Нет | Номер | | date | string | Нет | Дата списания, YYYY-MM-DD | | materials_storage_id | int | Нет | Склад, с которого списываются материалы | | products_storage_id | int | Нет | Склад, с которого списываются продукты | | production_id | int | Нет | ID производства. 0 снимает привязку | | notes | string | Нет | Заметки | Если передан хотя бы один из массивов materials и products, строки заменяются целиком, а непереданный массив считается пустым. Если не передан ни один, строки остаются прежними. Статус этим методом не меняется, для него есть v1/writeoffs/update_status. Как работает - Списание проводится заново: прежние движения отменяются, строки списываются по FIFO с текущими остатками. Статус сохраняется. - Переданный склад должен существовать, 0 не принимается. - Если списание было привязано к производству, его прежняя стоимость вычитается из себестоимости производства, а новая добавляется к производству из production_id. Пример запроса { "writeoff_id": 19291, "materials": [ { "id": 2051, "amount": 0.2 } ], "production_id": 39978 } В этом примере передан только materials, поэтому продукт из списания удаляется. Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No writeoff_id in input | Не передан writeoff_id | | Write-off not found or access denied | Списание не найдено или удалено | | No products or materials in input | Массивы строк переданы, но пустые | | Material with id 2051 not found | Материал не найден или удален | | Amount must be greater than 0 for material with id 2051 | Количество не число или не больше 0 после округления | | Storage ID is not set | Передан склад, равный 0 или пустой | | Storage ID not found | Склад не найден или удален | | Production not found or access denied | Производство из production_id не найдено | | Date is not a valid date in format YYYY-MM-DD | Неверный формат даты | Остальные ошибки строк такие же, как в v1/writeoffs/add.

Удаление списания

Удаляет списание. v1/writeoffs/delete.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | writeoff_id | int | Да | ID списания | Как работает - Списанные материалы и продукты возвращаются на склады, остатки пересчитываются. - Если списание было привязано к производству, его стоимость вычитается из себестоимости производства. - Файлы списания удаляются. Пример запроса { "writeoff_id": 19291 } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No writeoff_id in input | Не передан writeoff_id | | Write-off not found or access denied | Списание не найдено или уже удалено |

Смена статуса списания

Меняет статус списания. От статуса зависит, списаны ли материалы и продукты со склада. v1/writeoffs/update_status.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | writeoff_id | int | Да | ID списания | | status | int | Да | Новый статус: 0 План, 1 Списано | Как работает | Новый статус | Остатки | |---|---| | 0 План | Списанное возвращается на склад, количество учитывается в поле planned остатков | | 1 Списано | Материалы и продукты списываются со склада | Если списание уже в этом статусе, ничего не меняется, а метод отвечает успехом. Себестоимость и привязка к производству от статуса не зависят и не пересчитываются. Пример запроса { "writeoff_id": 19291, "status": 1 } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No writeoff_id in input | Не передано обязательное поле (вместо writeoff_id будет имя поля) | | Invalid status value. Must be one of: 0, 1 | Неверный код статуса | | Write-off not found or access denied | Списание не найдено или удалено |

Список списаний

Возвращает списания компании, от новых к старым: по дате, а внутри одной даты по ID. v1/writeoffs/get_list.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | date_from | string | Нет | Списания с этой даты включительно, YYYY-MM-DD | | date_to | string | Нет | Списания по эту дату включительно, YYYY-MM-DD | | status | int | Нет | Статус: 0 План, 1 Списано | | limit | int | Нет | Размер страницы, от 1 до 1000 | | offset | int | Нет | Сколько записей пропустить | Без limit возвращается весь список. Подробнее о постраничной выдаче в статье Общие правила. Ответ Массив writeoffs с полями списания (см. Списания), без строк. Строки возвращает v1/writeoffs/get_entry. Поле total содержит общее число списаний, подходящих под фильтры. Пример запроса { "date_from": "2026-10-01", "date_to": "2026-10-31", "limit": 100, "offset": 0 } Пример ответа { "success": true, "writeoffs": [ { "id": "19291", "num": "48", "date": "2026-10-06", "status": "1", "production_id": "0", "materials_storage_id": "3998", "materials_storage_name": "Главный", "products_storage_id": "4001", "products_storage_name": "Готовая продукция", "cost": "26350.00", "amount": null, "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/writeoffs/get_entry.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | writeoff_id | int | Да | ID списания | Ответ Объект writeoff со всеми полями списания (см. Списания) и строками в двух массивах: materials и products. Если позиций одного типа нет, массив пустой. | Поле | Тип | Описание | |---|---|---| | id | int | ID материала или продукта | | sku | string | Артикул | | name | string | Название | | amount | float | Количество | | unit | string | Единица измерения | | cost | float | Себестоимость строки по FIFO | | position | int | Порядковый номер строки в списании, с 0. Нумерация общая для материалов и продуктов | Строки из ответа можно отправить в v1/writeoffs/edit без изменений. Пример запроса { "writeoff_id": 19291 } Пример ответа { "success": true, "writeoff": { "id": "19291", "num": "48", "date": "2026-10-06", "status": "1", "production_id": "0", "materials_storage_id": "3998", "materials_storage_name": "Главный", "products_storage_id": "4001", "products_storage_name": "Готовая продукция", "cost": "26350.00", "amount": null, "lines": "2", "notes": "Брак при распиле", "materials": [ { "id": "2051", "sku": "M010", "name": "Доска дубовая", "amount": "0.15", "unit": "куб. м", "cost": "20250", "position": "0" } ], "products": [ { "id": "512", "sku": "P-TABLE-01", "name": "Стол обеденный", "amount": "1", "unit": "шт", "cost": "6100", "position": "1" } ] } } Ошибки | Ошибка | Причина | |---|---| | No writeoff_id in input | Не передан writeoff_id | | Write-off not found or access denied | Списание не найдено или удалено |