Производство

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

Методы для производства и его статусов

Производство

Производство: выпуск продуктов по их составу. Вы передаете только продукты и количество, а Controlata сама рассчитывает расход материалов, использованных продуктов и ресурсов по составам продуктов и себестоимость по FIFO. Через API производство можно создавать, редактировать и удалять, менять его статус, получать список и данные производства. Пути методов указаны относительно базового адреса API, а общие для всех методов правила (авторизация, формат запросов, частичное редактирование, строки операций, постраничная выдача) описаны в статьях Обзор API и Общие правила. Методы | Метод | Что делает | |---|---| | v1/production/get_statuses | Возвращает статусы производства компании | | v1/production/add | Создает производство | | v1/production/edit | Изменяет производство | | v1/production/delete | Удаляет производство | | v1/production/update_status | Меняет статус производства | | v1/production/get_list | Возвращает список производств | | v1/production/get_entry | Возвращает производство с продуктами и расходом | Поля производства | Поле | Тип | Описание | |---|---|---| | id | int | ID производства | | num | int | Номер. Присваивается автоматически: следующий по порядку | | name | string | Название | | date | string | Дата производства, YYYY-MM-DD | | status | int | Код статуса из v1/production/get_statuses | | order_id | int | ID заказа, под который создано производство. 0, если производство не связано с заказом | | produce_subproducts | int | 1, если заготовки производятся вместе с продуктами | | materials_storage_id | int | Склад, с которого списываются материалы. 0, если склад выбирается автоматически | | materials_storage_name | string | Название склада материалов | | products_storage_id | int | Склад, на который поступают произведенные продукты | | products_storage_name | string | Название склада произведенных продуктов | | subproducts_storage_id | int | Склад, с которого списываются использованные продукты. 0, если склад выбирается автоматически | | subproducts_storage_name | string | Название склада использованных продуктов | | cost | float | Себестоимость всего производства, включая стоимость привязанных списаний | | price | float | Стоимость произведенных продуктов по их цене продажи | | amount | float | Общее количество продуктов. null, если у продуктов разные единицы измерения | | lines | int | Количество строк продуктов | | bom_changed | int | 1, если составы продуктов изменились после последнего расчета производства | | notes | string | Заметки | Статусы Статусы производства настраиваются в каждой компании: их число, названия и порядок задаются в Controlata в разделе Настройки → Статусы производства. По умолчанию их три: План, В процессе и Сделано. Не зашивайте коды статусов в интеграцию, получайте их методом v1/production/get_statuses. Коды идут по порядку статусов, начиная с 0. Статус определяет, что уже произошло на складе. У каждого статуса есть четыре флага: | Флаг | Что значит 1 | |---|---| | materials_fact | Материалы списаны со склада | | subproducts_fact | Использованные продукты списаны со склада | | resources_fact | Ресурсы учтены как использованные. У амортизируемых ресурсов уменьшается оставшийся срок службы | | products_fact | Произведенные продукты поступили на склад | Если флаг равен 0, движение только запланировано: остаток не меняется, а количество попадает в поле planned остатков (см. Материалы). Флаги отражают общие правила статусов. Если в настройках статусов заданы условные правила для категорий, позиции этих категорий списываются или поступают уже в более раннем статусе. Новое производство создается в статусе из настройки Статус нового производства по умолчанию. Сменить статус можно методом v1/production/update_status. Склады У производства три склада: - materials_storage_id: откуда списываются материалы. По умолчанию это Склад по умолчанию для списания материалов при производстве. - subproducts_storage_id: откуда списываются продукты, которые входят в состав выпускаемых (использованные продукты). По умолчанию это Склад по умолчанию для списания продуктов при производстве. - products_storage_id: куда поступают произведенные продукты. По умолчанию это Склад по умолчанию для произведенных продуктов. Склады по умолчанию задаются в Controlata на странице Склады. Если там для списания выбрано Автоматически, каждый материал или продукт списывается со склада, где его остаток больше всего, и в поле склада производства хранится 0. Явно выбрать автоматический склад через API нельзя: он применяется, только если выбран в складах по умолчанию, а склад не передан при создании производства. Расход и себестоимость Расход рассчитывается по составу каждого продукта на момент создания или редактирования производства. Материалы и использованные продукты списываются по FIFO, их себестоимость вместе с ресурсами составляет себестоимость производства. Если остатка не хватает, производство все равно проводится, а недостающее количество оценивается по цене последней партии. Расход можно уточнить вручную только в Controlata (кнопка Уточнить расход в карточке производства). Ручные уточнения сохраняются при редактировании производства через API. Если составы продуктов изменились после расчета, у производства появляется флаг bom_changed. Производство при этом не пересчитывается само: расход обновится при следующем вызове v1/production/edit. Заготовки Заготовки: продукты, которые входят в состав других продуктов. Поле produce_subproducts определяет, что с ними происходит: - 0: заготовки берутся готовыми, списываются со склада subproducts_storage_id; - 1: заготовки производятся вместе с основными продуктами. Вместо них списываются материалы и ресурсы из их состава, на любой глубине вложенности. Производство под заказ Если в заказе включено производство, Controlata создает производство «Под заказ <номер>» и связывает его с заказом (поле order_id). Подробнее в статье Заказы. - Продукты такого производства задает заказ. Изменить их через v1/production/edit нельзя, а название, дату, заметки, склады и produce_subproducts можно. - Удалить такое производство нельзя: оно удаляется вместе с заказом или при отключении производства в заказе. - Произведенные продукты не поступают на склад, а сразу уходят в заказ. Поэтому products_storage_id на остатки не влияет. Привязанные списания К производству можно привязать списание (поле production_id списания). Стоимость списания добавляется к себестоимости производства и распределяется между произведенными продуктами. Подробнее в статье Списания.

Статусы производства

Возвращает статусы производства компании в том порядке, в каком они идут в Controlata. Статусы настраиваются в каждой компании отдельно, поэтому получайте коды этим методом, а не задавайте их в интеграции вручную. v1/production/get_statuses.php Параметры Метод не принимает параметров. Передайте пустой объект. Ответ Массив statuses. Коды и флаги в этом методе приходят числами. | Поле | Тип | Описание | |---|---|---| | code | int | Код статуса. Его передают в status методов v1/production/update_status и v1/production/get_list | | name | string | Название статуса | | materials_fact | int | 1, если в этом статусе материалы списаны со склада | | subproducts_fact | int | 1, если использованные продукты списаны со склада | | resources_fact | int | 1, если ресурсы учтены как использованные | | products_fact | int | 1, если произведенные продукты поступили на склад | Коды идут по порядку, начиная с 0. Если флаг равен 0, движение только запланировано. Подробнее о флагах и условных правилах для категорий в статье Производство. Если компания не настраивала статусы, возвращаются статусы по умолчанию: План, В процессе и Сделано. Статусы, созданные в компании, приходят с названиями, которые им дали в Controlata. Пример запроса {} Пример ответа { "success": true, "statuses": [ { "code": 0, "name": "План", "materials_fact": 0, "subproducts_fact": 0, "resources_fact": 0, "products_fact": 0 }, { "code": 1, "name": "В процессе", "materials_fact": 1, "subproducts_fact": 1, "resources_fact": 1, "products_fact": 0 }, { "code": 2, "name": "Сделано", "materials_fact": 1, "subproducts_fact": 1, "resources_fact": 1, "products_fact": 1 } ] } Ошибки Метод возвращает только общие ошибки авторизации и лимита запросов, см. Обзор API.

Создание производства

Создает производство. Расход материалов, использованных продуктов и ресурсов Controlata рассчитывает сама по составам продуктов, передавать его не нужно. v1/production/add.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | products | array | Да | Выпускаемые продукты, см. ниже | | date | string | Нет | Дата производства, YYYY-MM-DD. По умолчанию сегодня | | name | string | Нет | Название | | notes | string | Нет | Заметки | | produce_subproducts | int | Нет | 1: производить заготовки вместе с продуктами. По умолчанию 0 | | materials_storage_id | int | Нет | Склад, с которого списываются материалы | | subproducts_storage_id | int | Нет | Склад, с которого списываются использованные продукты | | products_storage_id | int | Нет | Склад, на который поступают произведенные продукты | Строка products: | Поле | Тип | Обязательное | Описание | |---|---|---|---| | id | int | id или sku | ID продукта | | sku | string | id или sku | Артикул продукта | | amount | float | Да | Количество, больше 0 | Как указывать продукт по id или артикулу, описано в статье Общие правила. Один продукт можно указать в нескольких строках. Как работает - Статус берется из настройки Статус нового производства по умолчанию. От него зависит, списываются ли материалы и поступают ли продукты на склад сразу (см. Производство). - Склады. Если склад не передан или равен 0, берется склад по умолчанию из настроек складов. Если для списания там выбрано Автоматически, каждый материал или продукт списывается со склада с наибольшим остатком. - Заготовки. Настройка компании Производить заготовки по умолчанию в API не применяется: без produce_subproducts заготовки списываются со склада готовыми. - Номер присваивается автоматически, задать его нельзя. - Нехватка остатка не мешает созданию: материалы списываются в минус. Пример запроса { "date": "2026-10-06", "name": "Партия столов", "products": [ { "id": 512, "amount": 10 }, { "sku": "P-CHAIR-01", "amount": 40 } ], "materials_storage_id": 3998, "products_storage_id": 4001, "produce_subproducts": 1 } Пример ответа { "success": true, "production_id": 39978, "num": 152, "status": 0 } В ответе приходят ID, номер и код статуса нового производства. Ошибки | Ошибка | Причина | |---|---| | No products in input | Не передан products или передан пустой массив | | Products is not an array | products не массив | | Line 0 of products must be an object | Строка products не объект (вместо 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 not found | Склад не найден или удален | | Date is not a valid date in format YYYY-MM-DD | Неверный формат даты |

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

Изменяет производство. Меняются только переданные поля, остальные остаются прежними. Подробнее о частичном редактировании в статье Общие правила. v1/production/edit.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | production_id | int | Да | ID производства | | products | array | Нет | Выпускаемые продукты: id или sku и amount, как в v1/production/add. Заменяют текущие целиком | | date | string | Нет | Дата производства, YYYY-MM-DD | | name | string | Нет | Название | | notes | string | Нет | Заметки | | produce_subproducts | int | Нет | 1: производить заготовки вместе с продуктами, 0: списывать их со склада | | materials_storage_id | int | Нет | Склад, с которого списываются материалы | | subproducts_storage_id | int | Нет | Склад, с которого списываются использованные продукты | | products_storage_id | int | Нет | Склад, на который поступают произведенные продукты | Статус этим методом не меняется, для него есть v1/production/update_status. Номер изменить нельзя. Как работает - Пересчет. Любое изменение, даже только заметок, заново рассчитывает расход по текущим составам продуктов и текущим остаткам. Флаг bom_changed после этого сбрасывается в 0. Производство остается в своем статусе. - Ручные уточнения расхода, сделанные в Controlata, сохраняются. Исключение: при produce_subproducts, равном 1, уточнения по использованным продуктам удаляются, потому что заготовки производятся по своим составам. - Склады. Переданный склад должен существовать, 0 не принимается. Если у производства выбран автоматический склад, не передавайте поле склада, чтобы его сохранить. - Привязанные списания после пересчета снова добавляются к себестоимости производства. - Производство под заказ (order_id больше 0). Продукты задает заказ, поэтому products можно передать только с теми же продуктами и количеством, например в другом порядке. Остальные поля меняются как обычно. Пример запроса { "production_id": 39978, "products": [ { "id": 512, "amount": 12 } ], "notes": "Добавили два стола" } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No production_id in input | Не передан production_id | | Production not found or access denied | Производство не найдено или удалено | | Products of a production linked to a sale cannot be changed. Edit the sale instead | Изменение продуктов производства под заказ | | No products in input | Передан пустой массив products | | Products is not an array | products не массив | | 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 | Склад не найден или удален | | Date is not a valid date in format YYYY-MM-DD | Неверный формат даты | Остальные ошибки строк products такие же, как в v1/production/add.

Удаление производства

Удаляет производство. v1/production/delete.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | production_id | int | Да | ID производства | Как работает - Движения производства отменяются: материалы и использованные продукты возвращаются на склады, произведенные продукты убираются со склада, остатки пересчитываются. - Ручные уточнения расхода и файлы производства удаляются. - Привязанные списания остаются, но отвязываются от производства (их production_id становится 0). - Производство под заказ (order_id больше 0) этим методом не удаляется. Отключите производство в заказе или удалите заказ, см. Заказы. Пример запроса { "production_id": 39978 } Пример ответа { "success": true } Ошибки | Ошибка | Причина | |---|---| | No production_id in input | Не передан production_id | | Production not found or access denied | Производство не найдено или уже удалено | | A production linked to a sale cannot be deleted. Edit the sale instead | Производство создано под заказ |

Смена статуса производства

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

Список производств

Возвращает производства компании, от новых к старым: по дате, а внутри одной даты по номеру. v1/production/get_list.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | date_from | string | Нет | Производства с этой даты включительно, YYYY-MM-DD | | date_to | string | Нет | Производства по эту дату включительно, YYYY-MM-DD | | status | int | Нет | Код статуса из v1/production/get_statuses | | limit | int | Нет | Размер страницы, от 1 до 1000 | | offset | int | Нет | Сколько записей пропустить | Без limit возвращается весь список. Подробнее о постраничной выдаче в статье Общие правила. Ответ Массив production с полями производства (см. Производство), без продуктов и расхода. Их возвращает v1/production/get_entry. Поле total содержит общее число производств, подходящих под фильтры. Пример запроса { "date_from": "2026-10-01", "status": 0, "limit": 100, "offset": 0 } Пример ответа { "success": true, "production": [ { "id": "39978", "num": "152", "name": "Партия столов", "date": "2026-10-06", "status": "0", "order_id": "0", "produce_subproducts": "1", "materials_storage_id": "3998", "materials_storage_name": "Главный", "products_storage_id": "4001", "products_storage_name": "Готовая продукция", "subproducts_storage_id": "0", "subproducts_storage_name": null, "cost": "184250.00", "price": "390000.00", "amount": "50.000", "lines": "2", "bom_changed": "0", "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/production/get_entry.php Параметры | Поле | Тип | Обязательное | Описание | |---|---|---|---| | production_id | int | Да | ID производства | Ответ Объект production со всеми полями производства (см. Производство) и четырьмя массивами. products: выпускаемые продукты в порядке строк. | Поле | Тип | Описание | |---|---|---| | id | int | ID продукта | | sku | string | Артикул | | name | string | Название | | amount | float | Количество | | unit | string | Единица измерения | | cost | float | Себестоимость строки, включая долю привязанных списаний | | price | float | Стоимость строки по цене продажи продукта | | position | int | Порядковый номер строки, с 0 | materials: расход материалов по всему производству. Если материал списан с нескольких складов, для каждого склада приходит отдельная строка. | Поле | Тип | Описание | |---|---|---| | id | int | ID материала | | sku | string | Артикул | | name | string | Название | | storage_id | int | Склад, с которого списан материал | | amount | float | Количество | | unit | string | Единица измерения | | cost | float | Себестоимость по FIFO | subproducts: использованные продукты из состава выпускаемых. Поля те же, что у materials. Если заготовки производятся (produce_subproducts равно 1), они сюда не попадают: вместо них в materials и resources входит расход по их составу. resources: использованные ресурсы. | Поле | Тип | Описание | |---|---|---| | id | int | ID ресурса | | name | string | Название | | type | string | Тип расчета: «rate» фиксированная ставка, «percent» процент, «amortized» амортизация | | amount | float | Количество | | unit | string | Единица измерения, у процентного ресурса «%» | | cost | float | Стоимость | Массив products можно отправить в v1/production/edit без изменений. Расход через API не меняется: он рассчитывается по составам продуктов. Пример запроса { "production_id": 39978 } Пример ответа { "success": true, "production": { "id": "39978", "num": "152", "name": "Партия столов", "date": "2026-10-06", "status": "1", "order_id": "0", "produce_subproducts": "0", "materials_storage_id": "3998", "materials_storage_name": "Главный", "products_storage_id": "4001", "products_storage_name": "Готовая продукция", "subproducts_storage_id": "3998", "subproducts_storage_name": "Главный", "cost": "61540.00", "price": "130000.00", "amount": "10.000", "lines": "1", "bom_changed": "0", "notes": "", "products": [ { "id": "512", "sku": "P-TABLE-01", "name": "Стол обеденный", "amount": "10", "unit": "шт", "cost": "61540", "price": "130000", "position": "0" } ], "materials": [ { "id": "2051", "sku": "M010", "name": "Доска дубовая", "storage_id": "3998", "amount": "0.4", "unit": "куб. м", "cost": "54000" } ], "subproducts": [ { "id": "530", "sku": "P-LEG-01", "name": "Ножка стола", "storage_id": "3998", "amount": "40", "unit": "шт", "cost": "6000" } ], "resources": [ { "id": "77", "name": "Работа столяра", "type": "rate", "amount": "20", "unit": "ч", "cost": "1540" } ] } } Ошибки | Ошибка | Причина | |---|---| | No production_id in input | Не передан production_id | | Production not found or access denied | Производство не найдено или удалено |