Налаштування виставлення рахунків на оплату 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування виставлення рахунків на оплату 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування виставлення рахунків на оплату в 1С-Бітрікс

Рахунок на оплату — документ, що виставляється покупцеві (фізичній або юридичній особі) і містить реквізити для оплати. У B2B-сегменті це обов'язковий етап: бухгалтерія контрагента повинна отримати рахунок, завізувати його та оплатити банківським переказом. У Бітрікс виставлення рахунків — окрема функціональність, яка може бути реалізована через модуль CRM (Бітрікс24), через кастомні компоненти у сайтовій частині, або через інтеграцію з 1С.

Рахунок з адміністративної частини замовлення

Найпростіший варіант — генерація рахунку на основі існуючого замовлення. Додаємо кнопку «Виставити рахунок» до картки замовлення:

// /bitrix/admin/sale_order_invoice.php
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php';
\Bitrix\Main\Loader::includeModule('sale');

$orderId = (int)$_GET['ORDER_ID'];
$order   = \Bitrix\Sale\Order::load($orderId);

if ($_POST['generate']) {
    $generator = new InvoiceGenerator();
    $pdfPath   = $generator->generate($order);

    // Надсилаємо email з PDF
    $mailer = new InvoiceMailer();
    $mailer->send($order, $pdfPath);

    // Зберігаємо факт виставлення рахунку у властивість замовлення
    $order->setField('INVOICE_DATE', date('d.m.Y'));
    $order->setField('INVOICE_NUMBER', generateInvoiceNumber($orderId));
    $order->save();

    LocalRedirect('/bitrix/admin/sale_order_detail.php?ID=' . $orderId . '&lang=ru');
}

Структура рахунку: обов'язкові поля

Згідно з вимогами бухгалтерського обліку рахунок повинен містити:

  • Номер і дата виставлення
  • Реквізити продавця: найменування, ІПН/КПП, банк, розрахунковий рахунок, БІК
  • Реквізити покупця: найменування, ІПН/КПП, адреса
  • Перелік товарів/послуг із кількістю, ціною, сумою
  • ПДВ (якщо застосовується): ставка та сума
  • Підсумкова сума прописом
  • Підпис керівника та головного бухгалтера

Генерація PDF рахунку

use Mpdf\Mpdf;

class InvoiceGenerator
{
    private array $sellerDetails;

    public function __construct()
    {
        $this->sellerDetails = [
            'name'         => 'ТОВ "Мій Магазин"',
            'inn'          => '7701234567',
            'kpp'          => '770101001',
            'address'      => '115093, м. Москва, вул. Прикладна, буд. 1',
            'bank'         => 'ПАТ Ощадбанк',
            'bik'          => '044525225',
            'account'      => '40702810938000000001',
            'corr_account' => '30101810400000000225',
            'director'     => 'Іванов І.І.',
            'accountant'   => 'Петрова А.А.',
        ];
    }

    public function generate(\Bitrix\Sale\Order $order, string $invoiceNumber): string
    {
        $mpdf = new Mpdf([
            'format'      => 'A4',
            'orientation' => 'P',
            'margin_top'  => 15,
            'margin_left' => 20,
            'margin_right'=> 15,
        ]);
        $mpdf->SetFont('dejavusans');

        $buyer  = $this->getBuyerDetails($order);
        $items  = $this->getOrderItems($order);
        $totals = $this->calculateTotals($items);

        $html = $this->renderInvoiceHtml([
            'number'   => $invoiceNumber,
            'date'     => date('d.m.Y'),
            'seller'   => $this->sellerDetails,
            'buyer'    => $buyer,
            'items'    => $items,
            'totals'   => $totals,
            'in_words' => $this->amountInWords($totals['total']),
        ]);

        $mpdf->WriteHTML($html);

        $uploadDir = '/upload/invoices/';
        if (!is_dir($_SERVER['DOCUMENT_ROOT'] . $uploadDir)) {
            mkdir($_SERVER['DOCUMENT_ROOT'] . $uploadDir, 0755, true);
        }

        $filename = 'invoice_' . $order->getId() . '_' . date('Ymd') . '.pdf';
        $fullPath = $_SERVER['DOCUMENT_ROOT'] . $uploadDir . $filename;
        $mpdf->Output($fullPath, 'F');

        return $uploadDir . $filename;
    }

    private function getOrderItems(\Bitrix\Sale\Order $order): array
    {
        $items = [];
        $num   = 1;
        foreach ($order->getBasket()->getOrderableItems() as $item) {
            $price = $item->getBasePrice();
            $qty   = $item->getQuantity();
            $items[] = [
                'num'   => $num++,
                'name'  => $item->getField('NAME'),
                'unit'  => 'шт.',
                'qty'   => $qty,
                'price' => $price,
                'total' => $price * $qty,
                'vat'   => 0,  // або розрахувати зі ставки ПДВ товару
            ];
        }
        return $items;
    }
}

Нумерація рахунків

Номер рахунку повинен бути унікальним. Рекомендований формат: РХ-YYYY-NNNN (рік + порядковий номер):

function generateInvoiceNumber(): string
{
    $year    = date('Y');
    $counter = (int)COption::GetOptionInt('my_module', 'invoice_counter_' . $year, 0) + 1;
    COption::SetOptionInt('my_module', 'invoice_counter_' . $year, $counter);
    return 'РХ-' . $year . '-' . str_pad($counter, 4, '0', STR_PAD_LEFT);
}

Надсилання рахунку по email

$event = new \Bitrix\Main\Mail\Event([
    'EVENT_NAME'  => 'ORDER_INVOICE',
    'TO_EMAIL'    => $buyerEmail,
    'ATTACHMENTS' => [
        [
            'path' => $_SERVER['DOCUMENT_ROOT'] . $pdfPath,
            'name' => 'Рахунок_' . $invoiceNumber . '.pdf',
        ],
    ],
    'FIELDS' => [
        'INVOICE_NUMBER' => $invoiceNumber,
        'ORDER_ID'       => $orderId,
        'BUYER_NAME'     => $buyerName,
        'AMOUNT'         => $totalAmount,
    ],
]);
\Bitrix\Main\Mail\Event::send($event);

Терміни

Завдання Термін
Генератор PDF рахунку (mPDF/TCPDF) 1–2 дні
Нумерація, шаблон рахунку 0.5 дня
Кнопка в Admin + надсилання по email 0.5 дня