Добавление пункта в меню списка заказов в 1С-Битрикс

Задача была: При смене сервиса фискализации продаж по 54ФЗ сделать временное решение, добавить возможность скачать список товаров с ценой и количеством у заказа в JSON формате для ручного пробития чека через сервис.

Добавления кнопки в меню списка заказов добавил код с файл /bitrix/php_interface/init.php:

<?php

// ...

AddEventHandler('main', 'OnAdminListDisplay', 'dwOnAdminListDisplay');

function dwOnAdminListDisplay(&$list)
{
	if ($list->table_id == 'tbl_sale_order') {
		foreach ($list->aRows as &$row)
		{
			$row->aActions[] = ['SEPARATOR' => true];
			$row->aActions[] = [
				'ICON' => 'edit',
				'TEXT' => 'Скачать чек',
				'LINK' => '/?dw-order-get-id=' . $row->id,
			];
		}
	}
}

Весь пример с генерацией JSON файла:

<?php

AddEventHandler('main', 'OnBeforeProlog', "dwOnBeforeProlog", 1);

function dwOnBeforeProlog()
{
	if (isset($_GET['dw-order-get-id']) && $GLOBALS['USER']->IsAdmin())
	{	
		$order_id = intval($_GET['dw-order-get-id']);
		
		if ($order_id > 0)
		{
			Bitrix\Main\Loader::includeModule("sale");
			
			$order = Bitrix\Sale\Order::load($order_id);
			
			header('Content-Type: application/json; charset=UTF-8');
			header('Content-Disposition: attachment; filename="order-check-' . $order_id . '.json"');
			
			$res = [];
			
			$orderBasket = $order->getBasket();
			$basketItems = $orderBasket->getBasketItems();
			
			foreach ($basketItems as $k => $v)
			{
				$row = [
					'name' => $v->getField('NAME'),
					'price' => $v->getPrice(),
					'quantity' => $v->getQuantity(),
					'tax' => 'vat20',
					'item_type' => 'goods',
					'payment_type' => 'full',
				];
				
				$row['sum'] = $row['price'] * $row['quantity'];
				
				$get_product = CCatalogProduct::GetByID($v->getProductId());
				
				if (isset($get_product['VAT_ID']) && $get_product['VAT_ID'] == 2)
				{
					$row['tax'] = 'vat10';
					$row['tax_sum'] = round($row['sum'] * 0.083333333333333333333333, 2);
				}
				else
				{
					$row['tax'] = 'vat20';
					$row['tax_sum'] = round($row['sum'] * 0.166666666666666666666666, 2);
				}
				
				$res[] = $row;
			}
			
			print json_encode($res, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
			
			die();
		}
	}
}

AddEventHandler('main', 'OnAdminListDisplay', 'dwOnAdminListDisplay');

function dwOnAdminListDisplay(&$list)
{
	if ($list->table_id == 'tbl_sale_order') {
		foreach ($list->aRows as &$row)
		{
			$row->aActions[] = ['SEPARATOR' => true];
			$row->aActions[] = [
				'ICON' => 'edit',
				'TEXT' => 'Скачать чек',
				'LINK' => '/?dw-order-get-id=' . $row->id,
			];
		}
	}
}

Пример JSON файла:

[
    {
        "name": "Медовый деликатес с золотом \"Golden Delicacy\" Мир мёда, 340г",
        "price": 1499,
        "quantity": 1,
        "tax": "vat20",
        "item_type": "goods",
        "payment_type": "full",
        "sum": 1499,
        "tax_sum": 249.83
    },
    {
        "name": "Леовит ONCO Коктейль белковый восстанавливающий для онкологических больных (со вкусом клубники). Банка 400 г",
        "price": 2199,
        "quantity": 1,
        "tax": "vat10",
        "item_type": "goods",
        "payment_type": "full",
        "sum": 2199,
        "tax_sum": 183.25
    },
    {
        "name": "Крем вокруг глаз Medical Collagene 3D Boto Line, 15 мл",
        "price": 659,
        "quantity": 1,
        "tax": "vat20",
        "item_type": "goods",
        "payment_type": "full",
        "sum": 659,
        "tax_sum": 109.83
    },
    {
        "name": "Микропилинг для лица Medical Collagene 3D Micro Peeling, 50 мл",
        "price": 599,
        "quantity": 1,
        "tax": "vat20",
        "item_type": "goods",
        "payment_type": "full",
        "sum": 599,
        "tax_sum": 99.83
    },
    {
        "name": "Алфит Подарочный набор \"Сила трав Алтая\"",
        "price": 1349,
        "quantity": 3,
        "tax": "vat20",
        "item_type": "goods",
        "payment_type": "full",
        "sum": 4047,
        "tax_sum": 674.5
    },
    {
        "name": "Масло Монарды с лецитином \"Алфит Плюс\" 100 мл",
        "price": 389,
        "quantity": 1,
        "tax": "vat20",
        "item_type": "goods",
        "payment_type": "full",
        "sum": 389,
        "tax_sum": 64.83
    },
    {
        "name": "Фитосбор Фитол 15 Профилактика сахарного диабета (30 брикетов утро + 30 брикетов вечер)",
        "price": 249,
        "quantity": 1,
        "tax": "vat20",
        "item_type": "goods",
        "payment_type": "full",
        "sum": 249,
        "tax_sum": 41.5
    },
    {
        "name": " Алфит Бальзам МАЛЫШ-КРЕПЫШ детский  Цветы жизни 100 мл ",
        "price": 279,
        "quantity": 1,
        "tax": "vat20",
        "item_type": "goods",
        "payment_type": "full",
        "sum": 279,
        "tax_sum": 46.5
    }
]