Менеджер витрачає годину на збірку прайса в Excel — і все одно помиляється в ціні для постійного клієнта. При каталозі в 15 000 позицій ручне вивантаження займає цілий день, а помилки в ціноутворенні ведуть до втрати прибутку або клієнтів. Кожна помилка обходиться компанії в середньому в 5 000 гривень, а при щомісячному оновленні це сотні тисяч збитків. Ми налаштовуємо генерацію прайс-листів прямо з 1С-Бітрікс, щоб дані завжди були актуальні та доступні за ролями. Автоматизація виключає ручні помилки та дає менеджерам готові документи за секунди. В результаті клієнт отримує актуальний прайс за хвилини, а не години. Налаштування генерації прайс-листів 1С-Бітрікс з розмежуванням доступу та автоматичним оновленням — це основа ефективної роботи відділу продажів.
Проблеми, які вирішуємо
Ручне оновлення цін. При зміні номенклатури або вартості потрібно вручну правити файли — це загрожує неактуальними даними та невдоволенням клієнтів. На одному проекті з 50 000 товарів менеджери витрачали 3 дні на оновлення Excel.
- Помилки в розрахунках. Різні типи цін (опт, роздріб, спецпропозиції) легко переплутати. Наша система автоматично підставляє потрібну ціну під користувача, виключаючи плутанину.
- Доступ до конфіденційної інформації. Не можна, щоб роздрібний клієнт бачив оптові ціни. Розмежування через групи користувачів і типи цін вирішує це завдання.
Як ми це робимо
Використовуємо PhpSpreadsheet (phpoffice/phpspreadsheet) PhpSpreadsheet — сучасну бібліотеку для роботи з Excel. Генератор написаний на PHP 8.1+, використовує ORM Бітрікса та кешування теговане для прискорення вибірки. Всі запити оптимізовані: вибірка цін через CCatalogProduct::GetOptimalPrice, залишки — через CCatalogStoreProduct, кешування розділів.
Ось приклад генерації Excel-прайса з форматуванням та автошириною колонок:
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
}
Такий підхід дозволяє для кожного типу цін генерувати окремий прайс-лист, доступний тільки відповідній групі. Ми також налаштовуємо права доступу до файлів через веб-сервер або .htaccess.
Чому варто автоматизувати генерацію?
Автоматизація через агенти Бітрікс особливо вигідна для каталогів від 10 000 позицій. Агент запускається вночі, формує прайси для всіх типів цін та зберігає їх на сервері:
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__ . '();';
}
Економія часу для каталогу з 10 000 товарів: ручне вивантаження — 4 години, автоматичне — 2 хвилини на генерацію всіх прайсів. При цьому виключаються помилки людського фактора. Кожна помилка в ціні обходиться компанії в середньому в 5 000 грн. Автоматизація виключає такі помилки та окупається за 2–3 місяці. Для типового інтернет-магазину щомісячна економія на зарплаті менеджерів і втратах від помилок досягає 200 000 гривень.
Порівняння форматів прайс-листів
| Формат | Призначення | Особливості |
|---|---|---|
| Excel (XLSX) | Для менеджерів і представницьких цілей | Форматування, формули, кілька аркушів. Краще CSV для візуального аналізу. |
| CSV | Машинна обробка, інтеграції | Легкий, універсальний, але без оформлення. Швидше генерується. |
| Відправка клієнтам | Фіксована верстка, захист від редагування. |
Вибір формату залежить від аудиторії: менеджерам зручніше Excel, для автоматичного завантаження в ERP — CSV, для клієнтів — PDF.
Процес роботи
- Аналіз. Вивчаємо вашу структуру каталогу, типи цін, вимоги до формату. Визначаємо вузькі місця в поточному вивантаженні.
- Проектування. Узгоджуємо макет прайса, логіку доступу, періодичність генерації. Створюємо прототип.
- Реалізація. Пишемо модуль на PHP з урахуванням кешування та оптимізації запитів. Код покриваємо коментарями.
- Тестування. Перевіряємо на реальних даних, виправляємо нюанси. Тестуємо всі типи цін і групи користувачів.
- Деплой. Встановлюємо на сервер, налаштовуємо агенти, даємо доступ. Навчаємо відповідальних співробітників.
Приклад налаштування агента з cron
Додайте в /bitrix/php_interface/cron_events.php:
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
$GLOBALS['DB']->StartTransaction();
if (CAgent::CheckAgentName('GeneratePriceLists();')) {
CAgent::AddAgent('GeneratePriceLists();', 'main', 'N', 86400, '', 'Y', date('d.m.Y H:i:s', strtotime('+1 day')), 30);
}
$GLOBALS['DB']->Commit();
Після цього агент запускатиметься раз на добу в обраний час.
Що входить у роботу
- Налаштування генерації прайсів у потрібних форматах
- Розмежування доступу до різних типів цін
- Розробка та налаштування агентів автогенерації
- Інтеграція з 1С (CommerceML) за потреби
- Документація з експлуатації
- Навчання відповідальних співробітників
- Гарантія на код — 12 місяців. Наш досвід — 5+ років на ринку, більше 50 успішних проектів з Бітрікс. Ми сертифіковані спеціалісти 1С-Бітрікс. Зв'яжіться з нами для оцінки вашого проекту — розрахуємо терміни та вартість за один робочий день. Отримайте консультацію з налаштування автоматичних прайс-листів уже сьогодні.
Терміни орієнтовно
| Конфігурація | Термін |
|---|---|
| Простий прайс CSV за одним типом цін | 0,5–1 день |
| Excel з форматуванням, кілька типів цін | 2–3 дні |
| Автогенерація за розкладом + особистий кабінет | 3–5 днів |







