Налаштування виставлення рахунків на оплату в 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 дня |







