Настройка генерации PDF-каталогов 1С-Битрикс
Потребность в PDF-каталоге возникает на B2B-проектах: менеджер хочет отправить клиенту актуальный прайс с логотипом, изображениями и ценами конкретного типа цен. Ручное обновление PDF-файлов ведёт к ошибкам и задержкам. Мы автоматизируем генерацию «на лету» из данных Битрикс — это экономит часы работы менеджеров и исключает устаревшие версии. Например, на одном из проектов с каталогом на 10 000 товаров ручное обновление занимало 2 дня, а автоматизация сократила это до 2 минут, что дало существенную экономию времени менеджеров. Экономия на ручном обновлении достигает 20 000 рублей в месяц при еженедельных рассылках.
Наш опыт: 10+ лет разработки на Битрикс, более 50 проектов с интеграцией PDF. Документация mPDF рекомендует правильную настройку шрифтов и кэширования для стабильной генерации даже на каталогах с 10 000+ товаров. Каждый сгенерированный PDF экономит в среднем 15 минут времени менеджера.
Проблемы, которые решаем
- Утечка памяти при генерации больших PDF. Стандартный подход с загрузкой всех данных в память приводит к ошибкам «Out of memory». Мы используем потоковую запись в mPDF и разбиваем выборку на чанки по 500 записей, что позволяет обрабатывать каталоги любого объёма.
- Кириллица и шрифты. Без корректных шрифтов PDF выглядит как набор кракозябр. Настройка
fontDirиfontdataс Roboto или Noto Sans решает проблему. Мы подбираем шрифты, соответствующие фирменному стилю заказчика. - Кэширование и инвалидация. Генерация 500 товаров с картинками занимает 5–15 секунд. Без кэша каждый запрос грузит сервер. Мы реализуем файловое кэширование с TTL 1 час и сбросом по событиям
OnAfterIBlockElementUpdateиOnAfterIBlockElementAdd, чтобы менеджеры всегда получали актуальные данные.
Почему mPDF — лучший выбор для кириллических PDF?
mPDF превосходит TCPDF по поддержке современного CSS (flexbox, grid), что упрощает вёрстку сложных макетов. TCPDF быстрее на простых таблицах, но для каталогов с картинками и логотипом mPDF удобнее. wkhtmltopdf выдаёт идеальное качество, но требует установки системного бинаря — для shared-хостингов не подходит. Мы рекомендуем mPDF как оптимальный компромисс между функциональностью и простотой деплоя.
| Библиотека | Кириллица | CSS-поддержка | Производительность | Деплой |
|---|---|---|---|---|
| mPDF | Отличная | Хорошая (flex, grid) | Средняя | Composer |
| TCPDF | Хорошая | Базовая | Высокая | Composer |
| wkhtmltopdf | Зависит от шрифтов | Полная (WebKit) | Средняя | Требует бинарный файл |
Как настроить шрифты для кириллицы в mPDF?
Без явного указания шрифтов mPDF использует встроенные латинские шрифты. Для кириллицы нужно добавить конфигурацию fontDir и fontdata. Пример настройки с Roboto:
$mpdf = new Mpdf([
'mode' => 'utf-8',
'fontDir' => [$_SERVER['DOCUMENT_ROOT'] . '/local/fonts/'],
'fontdata' => [
'roboto' => [
'R' => 'Roboto-Regular.ttf',
'B' => 'Roboto-Bold.ttf',
],
],
'default_font' => 'roboto',
]);
Убедитесь, что файлы шрифтов скопированы в указанную директорию. После этого кириллица будет отображаться корректно.
Как реализована генерация на mPDF?
Используем компонент 2.0 и ORM для выборки товаров с постраничной загрузкой, чтобы избежать переполнения памяти.
use Mpdf\Mpdf;
use Mpdf\Config\ConfigVariables;
use Mpdf\Config\FontVariables;
class BitrixCatalogPdfGenerator
{
public function generate(int $sectionId, int $priceTypeId): string
{
// Получаем товары раздела с пагинацией
$products = $this->getProducts($sectionId, $priceTypeId);
// Рендерим HTML через шаблон Битрикс
ob_start();
require $_SERVER['DOCUMENT_ROOT'] . '/local/pdf_templates/catalog.php';
$html = ob_get_clean();
$mpdf = new Mpdf([
'mode' => 'utf-8',
'format' => 'A4',
'margin_left' => 15,
'margin_right' => 15,
'margin_top' => 20,
'margin_bottom' => 20,
'fontDir' => [$_SERVER['DOCUMENT_ROOT'] . '/local/fonts/'],
'fontdata' => [
'roboto' => [
'R' => 'Roboto-Regular.ttf',
'B' => 'Roboto-Bold.ttf',
],
],
'default_font' => 'roboto',
]);
$mpdf->WriteHTML($html);
return $mpdf->Output('', 'S'); // S = return as string
}
private function getProducts(int $sectionId, int $priceTypeId): array
{
$userGroups = \Bitrix\Main\UserTable::getUserGroupIds(
\Bitrix\Main\Context::getCurrent()->getUser()->getId()
);
$result = [];
$res = \CIBlockElement::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'SECTION_ID' => $sectionId, 'ACTIVE' => 'Y'],
false,
['nPageSize' => 500],
['ID', 'NAME', 'PREVIEW_PICTURE', 'PROPERTY_ARTICLE']
);
while ($item = $res->GetNextElement()) {
$fields = $item->GetFields();
$priceData = \CCatalogProduct::GetOptimalPrice($fields['ID'], 1, $userGroups);
$fields['PRICE'] = $priceData['PRICE']['PRICE'] ?? null;
$result[] = $fields;
}
return $result;
}
}
Роутинг и кэширование
PDF-каталог генерируется по запросу через кастомный роут или AJAX-обработчик. Генерация 500 товаров с картинками занимает 5–15 секунд — кэшировать обязательно:
// /local/ajax/pdf_catalog.php
$sectionId = (int)$_GET['section_id'];
$cacheKey = 'pdf_catalog_' . $sectionId . '_' . SITE_ID;
$cachePath = $_SERVER['DOCUMENT_ROOT'] . '/upload/pdf_cache/';
$cacheFile = $cachePath . $cacheKey . '.pdf';
// Инвалидируем кэш при изменении товаров через событие
// OnAfterIBlockElementUpdate, OnAfterIBlockElementAdd
if (!file_exists($cacheFile) || filemtime($cacheFile) < time() - 3600) {
$generator = new BitrixCatalogPdfGenerator();
$pdfContent = $generator->generate($sectionId, $priceTypeId);
file_put_contents($cacheFile, $pdfContent);
}
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="catalog_' . $sectionId . '.pdf"');
readfile($cacheFile);
Интеграция с 1С через CommerceML обновляет цены и остатки автоматически. Мы настраиваем сброс кэша PDF по событию обновления каталога, чтобы прайс-лист всегда соответствовал данным в системе.
Процесс работы
- Аналитика — изучаем структуру каталога, типы цен, требования к макету.
- Проектирование — выбираем библиотеку (mPDF / TCPDF / wkhtmltopdf), проектируем шаблон и кэш.
- Реализация — пишем класс генерации, интегрируем с событиями сброса кэша.
- Тестирование — проверяем на каталоге с 1000+ товаров, с разными шрифтами и ценами.
- Деплой — настраиваем на боевом сервере, обучаем менеджеров.
Что входит в работу
- Код генерации — класс
BitrixCatalogPdfGeneratorс постраничной выборкой и поддержкой mPDF. - Шаблон PDF — HTML-вёрстка с логотипом, картинками, ценами и артикулами.
- Кэширование — файловый кэш с автоматическим сбросом по событиям
OnAfterIBlockElementUpdate. - Интеграция — роутинг через AJAX или отдельную страницу.
- Документация — описание настроек шрифтов и конфигурации.
- Поддержка — 1 месяц гарантийного сопровождения после сдачи.
Сроки и стоимость
| Конфигурация | Срок, дней |
|---|---|
| Простой PDF (таблица товаров без картинок) | 1–2 |
| PDF с картинками, логотипом, форматированием | 2–4 |
| PDF с динамическими ценами по типу + кэш | 4–6 |
Стоимость рассчитывается индивидуально в зависимости от сложности каталога и требований к дизайну. Оценим ваш проект за один рабочий день. Получите консультацию — напишите нам. При ручном обновлении каталога из 500 товаров менеджер тратит около 2 часов; при еженедельных обновлениях экономия достигает 16 часов в месяц. Наше решение окупается в первые 2 месяца использования.
Типичные ошибки и как их избежать
- Забыли про шрифты — без
fontdatamPDF падает на кириллице. Проверяйте в конфигурации. - Кэш не инвалидируется — если не подписаться на события обновления товаров, менеджеры получат устаревшие PDF. Используйте
EventManager. - Не учитываются группы пользователей — цены могут быть разными для оптовиков и розницы. Убедитесь, что передаёте
$userGroupsвGetOptimalPrice.
Мы гарантируем корректную работу решения на версиях Битрикс «Малый бизнес» и «Бизнес», PHP 8.1+, MySQL/MariaDB. Сертифицированные специалисты с опытом 10+ лет. Свяжитесь с нами, чтобы обсудить ваш проект. Получите консультацию — мы подготовим предложение за один день.







