[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fcatalog-products\u002Fupdate":3,"docs-tabs-entities\u002Fcatalog-products\u002Fupdate":6},{"content":4,"lastmod":5},"\n## Обновить товар\n\n`PATCH \u002Fv1\u002Fcatalog-products\u002F:id`\n\nИзменяет существующий товар. Поля передаются плоско в корне JSON. Передавайте только изменяемые поля — остальные сохраняют текущие значения. В ответ приходит полный объект обновлённого товара.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор товара |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `name` | string | нет | Название товара |\n| `active` | boolean | нет | Активен ли товар |\n| `iblockSectionId` | number | нет | ID раздела каталога. Список: `GET \u002Fv1\u002Fcatalog-sections` |\n| `measure` | number | нет | ID единицы измерения |\n| `weight` | number | нет | Вес единицы товара |\n| `vatIncluded` | boolean | нет | НДС включён в цену |\n| `canBuyZero` | boolean | нет | Разрешить покупку при нулевом остатке |\n| `quantityTrace` | boolean | нет | Включить учёт количества |\n| `subscribe` | boolean | нет | Разрешить подписку на товар |\n| `barcodeMulti` | boolean | нет | Отдельные штрихкоды для единиц товара |\n| `withoutOrder` | boolean | нет | Доступен к заказу без наличия на складе |\n| `purchasingPrice` | number | нет | Закупочная цена. Не применяется при включённом управлении складом |\n| `purchasingCurrency` | string | нет | Валюта закупочной цены. Не применяется при включённом управлении складом |\n| `quantity` | number | нет | Остаток на складе. Не применяется при включённом управлении складом |\n| `code` | string | нет | Символьный код товара |\n| `xmlId` | string | нет | Внешний код |\n| `sort` | number | нет | Индекс сортировки |\n| `vatId` | number | нет | ID ставки НДС |\n| `height` | number | нет | Высота |\n| `length` | number | нет | Длина |\n| `width` | number | нет | Ширина |\n| `dateActiveFrom` | datetime | нет | Начало активности |\n| `dateActiveTo` | datetime | нет | Конец активности |\n| `previewText` | string | нет | Описание для анонса |\n| `detailText` | string | нет | Детальное описание |\n| `previewTextType` | string | нет | Тип описания анонса: `text` или `html` |\n| `detailTextType` | string | нет | Тип детального описания: `text` или `html` |\n| `previewPicture` | object | нет | Картинка анонса: `{ \"fileData\": [\"имя.png\", \"\u003Cbase64>\"] }` или `{ \"remove\": \"Y\" }` |\n| `detailPicture` | object | нет | Детальная картинка (тот же формат) |\n| `iblockSection` | object | нет | Массив всех разделов, к которым привязан товар |\n| `propertyNNN` | object\u002Farray | нет | Значение свойства товара, где `NNN` — ID свойства: `{ \"valueId\": …, \"value\": … }` (или массив для множественных) |\n\nПользовательские свойства товара передаются как `propertyNNN`; on-premise-поля (`recurSchemeType`, `recurSchemeLength`, `trialPriceId`) тоже принимаются. Полный список полей — в [`GET \u002Fv1\u002Fcatalog-products\u002Ffields`](.\u002Ffields.md).\n\n**Тело должно содержать хотя бы одно записываемое поле.** Пустой `PATCH` (`{}`) отклоняется с `400 EMPTY_UPDATE_BODY`, а `PATCH`, в котором нет ни одного распознанного записываемого поля (например только опечатки), — с `400 NO_RECOGNIZED_UPDATE_FIELDS`. Раньше такой запрос возвращал `200` с неизменённым объектом, вводя клиента в заблуждение. Поля-объекты `iblockSection`\u002F`previewPicture`\u002F`detailPicture` пишутся, но по ним нельзя фильтровать и сортировать (запрос отклоняется явной ошибкой `UNKNOWN_FILTER_FIELD`\u002F`UNKNOWN_SORT_FIELD`); для надёжной фильтрации используйте индексируемые поля (`code`, `xmlId`, `sort`, `vatId`, размеры).\n\n`id` передаётся в пути, в теле его передавать нельзя — он только для чтения. Поля `available` и `bundle` вычисляются Битрикс24 и при записи отвечают `READONLY_FIELD`. `iblockId` задаётся только при создании: смена каталога через `PATCH` отклоняется с `READONLY_FIELD` — Битрикс24 не переносит товар между каталогами (раньше такой запрос возвращал `200`, но товар оставался на месте). Поля аудита `createdBy` и `modifiedBy` заполняются системой и при записи тоже отвечают `READONLY_FIELD`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcatalog-products\u002F541\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Кабель USB-C, 2 м\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcatalog-products\u002F541\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Кабель USB-C, 2 м\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcatalog-products\u002F541', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    name: 'Кабель USB-C, 2 м',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Новое название:', data.name)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcatalog-products\u002F541', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    name: 'Кабель USB-C, 2 м',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | object | Полный объект обновлённого товара. Набор полей — как у [`GET \u002Fv1\u002Fcatalog-products\u002F:id`](.\u002Fget.md) |\n\n## Пример ответа\n\nПоказаны основные поля.\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 541,\n    \"iblockId\": 25,\n    \"iblockSectionId\": null,\n    \"name\": \"Кабель USB-C, 2 м\",\n    \"active\": true,\n    \"measure\": 9,\n    \"available\": true,\n    \"bundle\": false,\n    \"canBuyZero\": true,\n    \"quantityTrace\": false,\n    \"subscribe\": true,\n    \"vatIncluded\": false,\n    \"purchasingPrice\": 110,\n    \"purchasingCurrency\": \"RUB\",\n    \"quantity\": null,\n    \"dateCreate\": \"2021-08-06T12:59:15.000Z\",\n    \"timestampX\": \"2026-06-15T13:11:33.000Z\",\n    \"xmlId\": \"541\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — товара с указанным `id` не существует:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"product does not exist.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 422 | `BITRIX_ERROR` | Товара с указанным `id` не существует (`product does not exist.`) |\n| 400 | `EMPTY_UPDATE_BODY` | Тело запроса пустое — передайте хотя бы одно поле |\n| 400 | `NO_RECOGNIZED_UPDATE_FIELDS` | В теле нет ни одного распознанного записываемого поля (только опечатки\u002Fмусор) |\n| 400 | `READONLY_FIELD` | В теле передано поле только для чтения, например `id`, `available` или `bundle` |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `catalog` |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Создать товар](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Fcreate)\n- [Список товаров](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Flist)\n- [Получить товар](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Fget)\n- [Удалить товар](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Fdelete)\n- [Цены каталога](\u002Fdocs\u002Fentities\u002Fcatalog-prices)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","2026-07-10",{}]