Update Invoice crm.invoice.update
If you are developing integrations for Bitrix24 using AI tools (Codex, Claude Code, Cursor), connect to the MCP server so that the assistant can utilize the official REST documentation.
Scope:
crmWho can execute the method: any user
DEPRECATED
The development of this method has been halted. Please use Universal Methods for Invoices.
This method updates an existing invoice.
Method Parameters
Required parameters are marked with *
|
Name |
Description |
|
id |
Invoice identifier |
|
fields |
Field values for updating the invoice. To find out the required format for the fields, execute the method crm.invoice.fields and check the format of the incoming values for these fields |
Code Examples
cURL (Webhook)
cURL (OAuth)
JS
PHP
BX24.js
PHP CRest
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"id": "**put_invoice_id_here**", "fields": {"DATE_BILL": "**put_date_here**", "USER_DESCRIPTION": "Comment for the client (updated).", "PRODUCT_ROWS": [{"ID": "**put_row_id_here**", "PRODUCT_ID": 703, "QUANTITY": 4, "PRICE": 779.60}]}}' \
https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/crm.invoice.update
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"id": "**put_invoice_id_here**", "fields": {"DATE_BILL": "**put_date_here**", "USER_DESCRIPTION": "Comment for the client (updated).", "PRODUCT_ROWS": [{"ID": "**put_row_id_here**", "PRODUCT_ID": 703, "QUANTITY": 4, "PRICE": 779.60}]}, "auth": "**put_access_token_here**"}' \
https://**put_your_bitrix24_address**/rest/crm.invoice.update
try
{
const current = new Date();
const date2str = function(d)
{
return d.getFullYear() + '-' + paddatepart(1 + d.getMonth()) + '-' + paddatepart(d.getDate()) + 'T' + paddatepart(d.getHours()) + ':' + paddatepart(d.getMinutes()) + ':' + paddatepart(d.getSeconds()) + '+01:00';
};
const paddatepart = function(part)
{
return part >= 10 ? part.toString() : '0' + part.toString();
};
const id = prompt("Enter ID");
const response = await $b24.callMethod('crm.invoice.get', {"id": id});
const result = response.getData().result;
if(result.error())
{
console.error(result.error());
}
else
{
const fields = clone(result.data());
const n = fields['PRODUCT_ROWS'].length;
let productUpdated = false;
fields["DATE_BILL"] = date2str(current);
fields["USER_DESCRIPTION"] = "Comment for the client (updated).";
for (let i in fields['PRODUCT_ROWS'])
{
if (fields['PRODUCT_ROWS'][i]["PRODUCT_ID"] == 703)
{
const rowId = fields['PRODUCT_ROWS'][i]["ID"];
fields['PRODUCT_ROWS'][i] = {
"ID": rowId, "PRODUCT_ID": 703, "QUANTITY": 4, "PRICE": 779.60
};
productUpdated = true;
break;
}
}
if (!productUpdated && n > 0)
{
fields['PRODUCT_ROWS'][n] = {
"ID": 0, "PRODUCT_ID": 703, "QUANTITY": 5, "PRICE": 779.60
};
}
const updateResponse = await $b24.callMethod('crm.invoice.update', {"id": id, "fields": fields});
const updateResult = updateResponse.getData().result;
console.info("Invoice updated with ID " + updateResult);
}
}
catch(error)
{
console.error(error);
}
function clone(src)
{
let dst;
if (src instanceof Object)
{
dst = {};
for (let i in src)
{
if (src[i] instanceof Object)
dst[i] = clone(src[i]);
else
dst[i] = src[i];
}
}
else dst = src;
return dst;
}
try {
$current = new DateTime();
$date2str = function($d) {
return $d->format('Y-m-d\TH:i:sP');
};
$id = readline("Enter ID");
$response = $b24Service
->core
->call(
'crm.invoice.get',
["id" => $id]
);
$result = $response
->getResponseData()
->getResult();
if ($result->error()) {
error_log($result->error());
echo 'Error getting invoice: ' . $result->error();
} else {
$fields = clone($result->data());
$n = count($fields['PRODUCT_ROWS']);
$productUpdated = false;
$fields["DATE_BILL"] = $date2str($current);
$fields["USER_DESCRIPTION"] = "Comment for the client (updated).";
foreach ($fields['PRODUCT_ROWS'] as $key => $row) {
if ($row["PRODUCT_ID"] == 703) {
$rowId = $row["ID"];
$fields['PRODUCT_ROWS'][$key] = [
"ID" => $rowId,
"PRODUCT_ID" => 703,
"QUANTITY" => 4,
"PRICE" => 779.60
];
$productUpdated = true;
break;
}
}
if (!$productUpdated && $n > 0) {
$fields['PRODUCT_ROWS'][$n] = [
"ID" => 0,
"PRODUCT_ID" => 703,
"QUANTITY" => 5,
"PRICE" => 779.60
];
}
$responseUpdate = $b24Service
->core
->call(
'crm.invoice.update',
["id" => $id, "fields" => $fields]
);
$resultUpdate = $responseUpdate
->getResponseData()
->getResult();
if ($resultUpdate->error()) {
error_log($resultUpdate->error());
echo 'Error updating invoice: ' . $resultUpdate->error();
} else {
echo 'Invoice updated with ID: ' . $resultUpdate->data();
}
}
} catch (Throwable $e) {
error_log($e->getMessage());
echo 'Error: ' . $e->getMessage();
}
// Adding or updating a product in the invoice.
var current = new Date();
var date2str = function(d)
{
return d.getFullYear() + '-' + paddatepart(1 + d.getMonth()) + '-' + paddatepart(d.getDate()) + 'T' + paddatepart(d.getHours()) + ':' + paddatepart(d.getMinutes()) + ':' + paddatepart(d.getSeconds()) + '+01:00';
};
var paddatepart = function(part)
{
return part >= 10 ? part.toString() : '0' + part.toString();
};
var id = prompt("Enter ID");
BX24.callMethod('crm.invoice.get', {"id": id}, addProduct);
function addProduct(result)
{
if(result.error())
console.error(result.error());
else
{
var fields = clone(result.data());
var n = fields['PRODUCT_ROWS'].length;
var productUpdated = false;
// Changing the "Invoice Date" field
fields["DATE_BILL"] = date2str(current);
// Changing the "Comment (will appear on the invoice)" field
fields["USER_DESCRIPTION"] = "Comment for the client (updated).";
// If the product with ID 703 exists in the invoice, update its fields.
// If the product with ID 703 does not exist in the invoice, add it to the invoice.
// If VAT is used, it is read that the price includes it, and the flag for including VAT in the price will
// be taken from the catalog.
for (var i in fields['PRODUCT_ROWS'])
{
if (fields['PRODUCT_ROWS'][i]["PRODUCT_ID"] == 703)
{
var rowId = fields['PRODUCT_ROWS'][i]["ID"]
fields['PRODUCT_ROWS'][i] = {
"ID": rowId, "PRODUCT_ID": 703, "QUANTITY": 4, "PRICE": 779.60
};
productUpdated = true;
break;
}
}
if (!productUpdated && n > 0)
{
fields['PRODUCT_ROWS'][n] = {
"ID": 0, "PRODUCT_ID": 703, "QUANTITY": 5, "PRICE": 779.60
};
}
BX24.callMethod('crm.invoice.update', {"id": id, "fields": fields},
function(result)
{
if(result.error())
console.error(result.error());
else
{
console.info("Invoice updated with ID " + result.data());
}
}
);
}
}
function clone(src)
{
var dst;
if (src instanceof Object)
{
dst = {};
for (var i in src)
{
if (src[i] instanceof Object)
dst[i] = clone(src[i]);
else
dst[i] = src[i];
}
}
else dst = src;
return dst;
}
require_once('crest.php');
$id = $_REQUEST['id']; // Assuming ID is passed as a request parameter
$current = new DateTime();
$date2str = function($d) {
return $d->format('Y-m-d\TH:i:s+01:00');
};
$fields = CRest::call(
'crm.invoice.get',
['id' => $id]
)['result'];
$n = count($fields['PRODUCT_ROWS']);
$productUpdated = false;
$fields["DATE_BILL"] = $date2str($current);
$fields["USER_DESCRIPTION"] = "Comment for the client (updated).";
foreach ($fields['PRODUCT_ROWS'] as $i => $row) {
if ($row["PRODUCT_ID"] == 703) {
$fields['PRODUCT_ROWS'][$i] = [
"ID" => $row["ID"], "PRODUCT_ID" => 703, "QUANTITY" => 4, "PRICE" => 779.60
];
$productUpdated = true;
break;
}
}
if (!$productUpdated && $n > 0) {
$fields['PRODUCT_ROWS'][$n] = [
"ID" => 0, "PRODUCT_ID" => 703, "QUANTITY" => 5, "PRICE" => 779.60
];
}
$result = CRest::call(
'crm.invoice.update',
["id" => $id, "fields" => $fields]
);
echo '<PRE>';
print_r($result);
echo '</PRE>';
Copied