Налаштування генерації прайс-листів 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 днів |







