Настройка генерации PDF-каталогов 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Настройка генерации PDF-каталогов 1С-Битрикс
Простой
~1 день
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1321
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    914
  • 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 Appointment Booking Widget for a Medical Center
    663
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    810
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    709
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1043

Настройка генерации 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 по событию обновления каталога, чтобы прайс-лист всегда соответствовал данным в системе.

Процесс работы

  1. Аналитика — изучаем структуру каталога, типы цен, требования к макету.
  2. Проектирование — выбираем библиотеку (mPDF / TCPDF / wkhtmltopdf), проектируем шаблон и кэш.
  3. Реализация — пишем класс генерации, интегрируем с событиями сброса кэша.
  4. Тестирование — проверяем на каталоге с 1000+ товаров, с разными шрифтами и ценами.
  5. Деплой — настраиваем на боевом сервере, обучаем менеджеров.

Что входит в работу

  • Код генерации — класс BitrixCatalogPdfGenerator с постраничной выборкой и поддержкой mPDF.
  • Шаблон PDF — HTML-вёрстка с логотипом, картинками, ценами и артикулами.
  • Кэширование — файловый кэш с автоматическим сбросом по событиям OnAfterIBlockElementUpdate.
  • Интеграция — роутинг через AJAX или отдельную страницу.
  • Документация — описание настроек шрифтов и конфигурации.
  • Поддержка — 1 месяц гарантийного сопровождения после сдачи.

Сроки и стоимость

Конфигурация Срок, дней
Простой PDF (таблица товаров без картинок) 1–2
PDF с картинками, логотипом, форматированием 2–4
PDF с динамическими ценами по типу + кэш 4–6

Стоимость рассчитывается индивидуально в зависимости от сложности каталога и требований к дизайну. Оценим ваш проект за один рабочий день. Получите консультацию — напишите нам. При ручном обновлении каталога из 500 товаров менеджер тратит около 2 часов; при еженедельных обновлениях экономия достигает 16 часов в месяц. Наше решение окупается в первые 2 месяца использования.

Типичные ошибки и как их избежать

  • Забыли про шрифты — без fontdata mPDF падает на кириллице. Проверяйте в конфигурации.
  • Кэш не инвалидируется — если не подписаться на события обновления товаров, менеджеры получат устаревшие PDF. Используйте EventManager.
  • Не учитываются группы пользователей — цены могут быть разными для оптовиков и розницы. Убедитесь, что передаёте $userGroups в GetOptimalPrice.

Мы гарантируем корректную работу решения на версиях Битрикс «Малый бизнес» и «Бизнес», PHP 8.1+, MySQL/MariaDB. Сертифицированные специалисты с опытом 10+ лет. Свяжитесь с нами, чтобы обсудить ваш проект. Получите консультацию — мы подготовим предложение за один день.