Налаштування генерації прайс-листів 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-клієнта це документ з актуальними цінами його типу, з артикулами, залишками та знижками. Автоматична генерація прайса з 1С-Бітрікс виключає помилки ручного оновлення і дає менеджеру завжди актуальні дані.

Формати та інструменти

Прайс-листи генерують у трьох форматах:

Excel (XLSX) — найбільш затребуваний. Використовують бібліотеку PhpSpreadsheet (phpoffice/phpspreadsheet). Підтримує форматування, формули, кілька аркушів.

CSV — простий варіант для машинної обробки, без форматування.

PDF — для надсилання клієнтам як представницький документ (див. статтю по PDF-каталогах).

Генерація Excel через PhpSpreadsheet

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;

class BitrixPriceListGenerator
{
    public function generate(int $priceTypeId, array $userGroups): string
    {
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setTitle('Прайс-лист');

        // Заголовки
        $headers = ['Артикул', 'Найменування', 'Розділ', 'Ціна', 'Валюта', 'Залишок'];
        foreach ($headers as $col => $header) {
            $sheet->setCellValueByColumnAndRow($col + 1, 1, $header);
        }

        // Стиль заголовка
        $sheet->getStyle('A1:F1')->getFont()->setBold(true);
        $sheet->getStyle('A1:F1')->getFill()
            ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
            ->getStartColor()->setARGB('FFE0E0E0');

        $row = 2;
        $res = $this->getProductsWithPrices($priceTypeId, $userGroups);

        foreach ($res as $product) {
            $sheet->setCellValueByColumnAndRow(1, $row, $product['ARTICLE']);
            $sheet->setCellValueByColumnAndRow(2, $row, $product['NAME']);
            $sheet->setCellValueByColumnAndRow(3, $row, $product['SECTION']);
            $sheet->setCellValueByColumnAndRow(4, $row, $product['PRICE']);
            $sheet->setCellValueByColumnAndRow(5, $row, $product['CURRENCY']);
            $sheet->setCellValueByColumnAndRow(6, $row, $product['QUANTITY']);

            // Форматування числа ціни
            $sheet->getStyleByColumnAndRow(4, $row)
                ->getNumberFormat()
                ->setFormatCode(NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED2);
            $row++;
        }

        // Автоширина колонок
        foreach (range('A', 'F') as $col) {
            $sheet->getColumnDimension($col)->setAutoSize(true);
        }

        // Додаємо дату генерації
        $sheet->setCellValue('A' . ($row + 1), 'Дата формування: ' . date('d.m.Y H:i'));

        $writer = new Xlsx($spreadsheet);
        $tempFile = tempnam(sys_get_temp_dir(), 'pricelist_');
        $writer->save($tempFile);

        return $tempFile;
    }

    private function getProductsWithPrices(int $priceTypeId, array $userGroups): array
    {
        $result = [];
        $dbRes = \CIBlockElement::GetList(
            ['SECTION_ID' => 'ASC', 'SORT' => 'ASC'],
            ['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
            false,
            false,
            ['ID', 'NAME', 'IBLOCK_SECTION_ID', 'PROPERTY_ARTICLE']
        );

        $sectionCache = [];

        while ($el = $dbRes->GetNextElement()) {
            $fields = $el->GetFields();
            $productId = $fields['ID'];

            // Отримуємо ціну для типу
            $priceRes = \CCatalogProduct::GetOptimalPrice($productId, 1, $userGroups);
            $price = $priceRes['PRICE']['PRICE'] ?? 0;

            // Кешуємо назви розділів
            $sectionId = $fields['IBLOCK_SECTION_ID'];
            if (!isset($sectionCache[$sectionId])) {
                $sectionCache[$sectionId] = \CIBlockSection::GetByID($sectionId)->GetNext()['NAME'] ?? '';
            }

            // Залишки
            $storeData = \CCatalogStoreProduct::GetList(
                [], ['PRODUCT_ID' => $productId]
            )->Fetch();
            $quantity = $storeData['AMOUNT'] ?? 0;

            $result[] = [
                'ARTICLE' => $fields['PROPERTY_ARTICLE_VALUE'],
                'NAME'    => $fields['NAME'],
                'SECTION' => $sectionCache[$sectionId],
                'PRICE'   => $price,
                'CURRENCY' => $priceRes['PRICE']['CURRENCY'] ?? 'UAH',
                'QUANTITY' => $quantity,
            ];
        }

        return $result;
    }
}

Доступ та розмежування прайсів

Різні типи клієнтів отримують різні прайси. Контроль доступу — через групи користувачів та типи цін:

// Визначаємо тип прайса для поточного користувача
$userId = \Bitrix\Main\Context::getCurrent()->getUser()->getId();
$userGroups = \CUser::GetUserGroup($userId);

$priceTypeId = 1; // базовий
if (in_array(WHOLESALE_GROUP_ID, $userGroups)) {
    $priceTypeId = 2; // оптовий
} elseif (in_array(VIP_GROUP_ID, $userGroups)) {
    $priceTypeId = 3; // VIP
}

Автогенерація за розкладом

Для великих каталогів (10 000+ позицій) генерацію виносять в агент 1С-Бітрікс, що запускається вночі, зі збереженням файлу в /upload/pricelists/:

// Агент, додається через AddEventHandler або вручну в b_agent
function GeneratePriceLists(): string
{
    $generator = new BitrixPriceListGenerator();
    foreach (getPriceTypes() as $type) {
        $file = $generator->generate($type['ID'], $type['USER_GROUPS']);
        $targetPath = '/upload/pricelists/pricelist_' . $type['CODE'] . '.xlsx';
        rename($file, $_SERVER['DOCUMENT_ROOT'] . $targetPath);
    }
    return __FUNCTION__ . '();'; // Агент повертає себе для повторного запуску
}

Терміни

Конфігурація Термін
Простий прайс CSV за одним типом цін 0,5–1 день
Excel із форматуванням, кілька типів цін 2–3 дні
Автогенерація за розкладом + особистий кабінет 3–5 днів