Установить товарные позиции предложения crm.quote.productrows.set
Scope:
crmКто может выполнять метод: пользователь с правом «изменения» коммерческих предложений
DEPRECATED
Развитие метода остановлено. Используйте crm.item.productrow.*.
Метод crm.quote.productrows.set создает или обновляет товарные позиции коммерческого предложения.
Чтобы изменить только одну позицию, используйте методы crm.item.productrow.*.
Параметры метода
Обязательные параметры отмечены *
|
Название |
Описание |
|
id* |
Идентификатор коммерческого предложения. Идентификатор можно получить с помощью методов crm.quote.list или crm.quote.add |
|
rows |
Массив товарных позиций. Формат элемента массива:
где:
Список основных полей описан ниже |
Список доступных полей у товарных позиций
|
Название |
Описание |
|
PRODUCT_ID |
Идентификатор товара в каталоге. Список товаров можно получить методом catalog.product.list. Если |
|
PRODUCT_NAME |
Наименование товарной позиции |
|
PRODUCT_DESCRIPTION |
Описание товарной позиции |
|
PRICE |
Итоговая стоимость товара за единицу |
|
QUANTITY |
Количество единиц товара |
|
DISCOUNT_TYPE_ID |
Тип скидки:
|
|
DISCOUNT_RATE |
Значение скидки в процентах |
|
DISCOUNT_SUM |
Абсолютное значение скидки |
|
TAX_RATE |
Ставка налога в процентах |
|
TAX_INCLUDED |
Включен ли налог в стоимость:
|
|
MEASURE_CODE |
Код единицы измерения |
|
MEASURE_NAME |
Текстовое представление единицы измерения |
|
SORT |
Сортировка |
Полный список полей товарной позиции и типов можно получить методом crm.productrow.fields.
Примеры кода
Как использовать примеры в документации
Установить две товарные позиции для предложения с id = 1.
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"id":1,"rows":[{"PRODUCT_ID":459,"PRICE":3000,"QUANTITY":1,"DISCOUNT_TYPE_ID":2,"DISCOUNT_RATE":0,"TAX_RATE":0,"TAX_INCLUDED":"Y","MEASURE_CODE":796,"MEASURE_NAME":"шт","SORT":10},{"PRODUCT_NAME":"Услуга сопровождения","PRICE":1500,"QUANTITY":2,"DISCOUNT_TYPE_ID":2,"DISCOUNT_RATE":0,"TAX_RATE":0,"TAX_INCLUDED":"Y","MEASURE_CODE":796,"MEASURE_NAME":"шт","SORT":20}]}' \
https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/crm.quote.productrows.set
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"id":1,"rows":[{"PRODUCT_ID":459,"PRICE":3000,"QUANTITY":1,"DISCOUNT_TYPE_ID":2,"DISCOUNT_RATE":0,"TAX_RATE":0,"TAX_INCLUDED":"Y","MEASURE_CODE":796,"MEASURE_NAME":"шт","SORT":10},{"PRODUCT_NAME":"Услуга сопровождения","PRICE":1500,"QUANTITY":2,"DISCOUNT_TYPE_ID":2,"DISCOUNT_RATE":0,"TAX_RATE":0,"TAX_INCLUDED":"Y","MEASURE_CODE":796,"MEASURE_NAME":"шт","SORT":20}],"auth":"**put_access_token_here**"}' \
https://**put_your_bitrix24_address**/rest/crm.quote.productrows.set
try
{
const response = await $b24.callMethod(
'crm.quote.productrows.set',
{
id: 1,
rows: [
{
PRODUCT_ID: 459,
PRICE: 3000,
QUANTITY: 1,
DISCOUNT_TYPE_ID: 2,
DISCOUNT_RATE: 0,
TAX_RATE: 0,
TAX_INCLUDED: 'Y',
MEASURE_CODE: 796,
MEASURE_NAME: 'шт',
SORT: 10,
},
{
PRODUCT_NAME: 'Услуга сопровождения',
PRICE: 1500,
QUANTITY: 2,
DISCOUNT_TYPE_ID: 2,
DISCOUNT_RATE: 0,
TAX_RATE: 0,
TAX_INCLUDED: 'Y',
MEASURE_CODE: 796,
MEASURE_NAME: 'шт',
SORT: 20,
},
],
}
);
const result = response.getData().result;
console.info(result);
}
catch( error )
{
console.error('Error:', error);
}
try {
$response = $b24Service
->core
->call(
'crm.quote.productrows.set',
[
'id' => 1,
'rows' => [
[
'PRODUCT_ID' => 459,
'PRICE' => 3000,
'QUANTITY' => 1,
'DISCOUNT_TYPE_ID' => 2,
'DISCOUNT_RATE' => 0,
'TAX_RATE' => 0,
'TAX_INCLUDED' => 'Y',
'MEASURE_CODE' => 796,
'MEASURE_NAME' => 'шт',
'SORT' => 10,
],
[
'PRODUCT_NAME' => 'Услуга сопровождения',
'PRICE' => 1500,
'QUANTITY' => 2,
'DISCOUNT_TYPE_ID' => 2,
'DISCOUNT_RATE' => 0,
'TAX_RATE' => 0,
'TAX_INCLUDED' => 'Y',
'MEASURE_CODE' => 796,
'MEASURE_NAME' => 'шт',
'SORT' => 20,
],
],
]
);
$result = $response
->getResponseData()
->getResult();
echo 'Updated: ' . ($result ? 'true' : 'false');
} catch (Throwable $e) {
error_log($e->getMessage());
echo 'Error setting quote product rows: ' . $e->getMessage();
}
BX24.callMethod(
'crm.quote.productrows.set',
{
id: 1,
rows: [
{
PRODUCT_ID: 459,
PRICE: 3000,
QUANTITY: 1,
DISCOUNT_TYPE_ID: 2,
DISCOUNT_RATE: 0,
TAX_RATE: 0,
TAX_INCLUDED: 'Y',
MEASURE_CODE: 796,
MEASURE_NAME: 'шт',
SORT: 10,
},
{
PRODUCT_NAME: 'Услуга сопровождения',
PRICE: 1500,
QUANTITY: 2,
DISCOUNT_TYPE_ID: 2,
DISCOUNT_RATE: 0,
TAX_RATE: 0,
TAX_INCLUDED: 'Y',
MEASURE_CODE: 796,
MEASURE_NAME: 'шт',
SORT: 20,
},
],
},
(result) => {
result.error()
? console.error(result.error())
: console.info(result.data())
;
},
);
require_once('crest.php');
$result = CRest::call(
'crm.quote.productrows.set',
[
'id' => 1,
'rows' => [
[
'PRODUCT_ID' => 459,
'PRICE' => 3000,
'QUANTITY' => 1,
'DISCOUNT_TYPE_ID' => 2,
'DISCOUNT_RATE' => 0,
'TAX_RATE' => 0,
'TAX_INCLUDED' => 'Y',
'MEASURE_CODE' => 796,
'MEASURE_NAME' => 'шт',
'SORT' => 10,
],
[
'PRODUCT_NAME' => 'Услуга сопровождения',
'PRICE' => 1500,
'QUANTITY' => 2,
'DISCOUNT_TYPE_ID' => 2,
'DISCOUNT_RATE' => 0,
'TAX_RATE' => 0,
'TAX_INCLUDED' => 'Y',
'MEASURE_CODE' => 796,
'MEASURE_NAME' => 'шт',
'SORT' => 20,
],
],
]
);
echo '<PRE>';
print_r($result);
echo '</PRE>';
Обработка ответа
HTTP-статус: 200
{
"result": true,
"time": {
"start": 1773416018,
"finish": 1773416018.877651,
"duration": 0.8776509761810303,
"processing": 0,
"date_start": "2026-03-13T18:33:38+03:00",
"date_finish": "2026-03-13T18:33:38+03:00",
"operating_reset_at": 1773416618,
"operating": 0.5666530132293701
}
}
Возвращаемые данные
|
Название |
Описание |
|
result |
Корневой элемент ответа. Содержит:
|
|
time |
Информация о времени выполнения запроса |
Обработка ошибок
HTTP-статус: 400
{
"error": "",
"error_description": "Not found."
}
|
Название |
Описание |
|
error |
Строковый код ошибки. Может состоять из цифр, латинских букв и знака подчеркивания |
|
error_description |
Текстовое описание ошибки. Описание не предназначено для показа конечному пользователю в необработанном виде |
Возможные коды ошибок
|
Код |
Описание |
Значение |
|
|
|
В параметр |
|
|
|
В параметр |
|
|
|
У пользователя нет прав на изменение коммерческого предложения |
|
|
|
Коммерческое предложение с переданным |
|
|
Текст ошибки проверки прав каталога |
Ошибка проверки прав на товары каталога и/или ограничения каталога для переданных позиций |
Статусы и коды системных ошибок
HTTP-статус: 20x, 40x, 50x
Описанные ниже ошибки могут возникнуть при вызове любого метода
|
Статус |
Код |
Описание |
|
|
|
Возникла внутренняя ошибка сервера, обратитесь к администратору сервера или в техническую поддержку Битрикс24 |
|
|
|
Возникла внутренняя ошибка сервера, обратитесь к администратору сервера или в техническую поддержку Битрикс24 |
|
|
|
Превышен лимит на интенсивность запросов |
|
|
|
Текущий метод не разрешен для вызова с помощью batch |
|
|
|
Превышена максимальная длина параметров, переданных в метод batch |
|
|
|
Неверный access-токен или код вебхука |
|
|
|
Для вызовов методов требуется использовать протокол HTTPS |
|
|
|
REST API заблокирован из-за перегрузки. Это ручная индивидуальная блокировка, для снятия необходимо обращаться в техническую поддержку Битрикс24 |
|
|
|
REST API доступен только на коммерческих планах |
|
|
|
У пользователя, с чьим access-токеном или вебхуком был вызван метод, не хватает прав |
|
|
|
Манифест недоступен |
|
|
|
Запрос требует более высоких привилегий, чем предоставляет токен вебхука |
|
|
|
Предоставленный access-токен доступа истек |
|
|
|
Пользователь не имеет доступа к приложению. Это означает, что приложение установлено, но администратор портала разрешил доступ к этому приложению только конкретным пользователям |
|
|
|
Публичная часть сайта закрыта. Чтобы открыть публичную часть сайта на коробочной установке отключите опцию «Временное закрытие публичной части сайта». Путь к настройке: Рабочий стол > Настройки > Настройки продукта > Настройки модулей > Главный модуль > Временное закрытие публичной части сайта |
Продолжите изучение
- Получить товарные позиции предложения crm.quote.productrows.get
- Получить коммерческое предложение по идентификатору crm.quote.get
- Изменить коммерческое предложение crm.quote.update
- Добавить коммерческое предложение crm.quote.add
- Получить поля коммерческого предложения crm.quote.fields