Блог Горошко Андрея Bitrix24,PHP Изменить счет crm.invoice.update

Изменить счет crm.invoice.update

При разработке и поддержке проектов на платформе 1С-Битрикс критически важно использовать современные стандарты D7 API. В этом руководстве мы детально изучим тему «Изменить счет crm.invoice.update», разберем архитектурные особенности и предоставим готовые к интеграции примеры кода.

Изменить счет crm.invoice.update

> Scope: crm
>
> Кто может выполнять метод: любой пользователь

Предупреждение
Метод устарел. Рекомендуется использовать Универсальные методы для счетов

Метод обновляет существующий счет.

Параметры метода

Название
тип
Описание
id
integer
Идентификатор счета
fields
array
Значения полей для обновления счета.

Чтобы узнать требуемый формат полей, выполните метод crm.invoice.fields и посмотрите формат пришедших значений этих полей

Примеры кода

  • cURL (Webhook)
    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": "Комментарий для клиента (обновленный).", "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 (OAuth)
    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": "Комментарий для клиента (обновленный).", "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
  • JS
    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()) + '+03:00';
    	};
    	const paddatepart = function(part)
    	{
    		return part >= 10 ? part.toString() : '0' + part.toString();
    	};
    	const id = prompt("Введите 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"] = "Комментарий для клиента (обновленный).";
    		
    		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("Обновлен счет с 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;
    }
  • PHP
    try {
        $current = new DateTime();
        $date2str = function($d) {
            return $d->format('Y-m-d\TH:i:sP');
        };
        $id = readline("Введите 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"] = "Комментарий для клиента (обновленный).";
    
            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();
    }
  • BX24.js
    // Добавление или обновление товара в счете.
    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()) + '+03:00';
    };
    var paddatepart = function(part)
    {
        return part >= 10 ? part.toString() : '0' + part.toString();
    };
    var id = prompt("Введите 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;
            // Изменение поля "Дата выставления"
            fields["DATE_BILL"] = date2str(current);
            // Изменение поля "Комментарий (отобразится в счете)"
            fields["USER_DESCRIPTION"] = "Комментарий для клиента (обновленный).";
            // Если товар с ID 703 есть в счете, то обновляем его поля.
            // Если товара с ID 703 в счете нет, то добавляем его в счет.
            // Если используется НДС, то читается что цена его включает, а сам признак включения НДС в цену будет
            // взят из каталога.
            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("Обновлен счет с 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;
    }
  • PHP CRest
    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+03: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"] = "Комментарий для клиента (обновленный).";

    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>';

💡 Экспертное мнение и рекомендации

Практические рекомендации:

  • При написании кастомных компонентов для «Изменить счет crm.invoice.update» всегда разделяйте бизнес-логику и представление (шаблон).
  • Используйте отладку SQL-запросов через конструкцию $wpdb->last_query или стандартный трекер Битрикса, чтобы контролировать нагрузку.

Похожая задача в бизнесе?

Помогу автоматизировать процессы и внедрить ИИ

Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.

Related Post

Обновить пользовательское поле user.userfield.updateОбновить пользовательское поле user.userfield.update

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Обновить пользовательское поле user.userfield.update», проанализируем лучшие практики и

Получить список участников im.dialog.users.listПолучить список участников im.dialog.users.list

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Получить список участников im.dialog.users.list», проанализируем лучшие практики и

Оптимизация работы модуля инфоблоков (IBlock) и переход на свойства типа «Справочник»Оптимизация работы модуля инфоблоков (IBlock) и переход на свойства типа «Справочник»

Высокая скорость загрузки сайта и безупречная серверная безопасность — обязательные требования для успешного коммерческого проекта на 1С-Битрикс. Услуга «Оптимизация работы модуля инфоблоков (IBlock) и переход на свойства типа «Справочник»» обеспечивает