Менеджер тратит час на сборку прайса в 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'] ?? 'RUB', '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 дней |







