В процессе разработки на 1С-Битрикс я часто сталкиваюсь с необходимостью передавать обработанные данные между различными этапами выполнения компонента. Один из наиболее частых сценариев — передача подготовленного массива данных из файла result_modifier.php в component_epilog.php. Без использования правильного подхода разработчики вынуждены дублировать запросы к базе данных или прибегать к использованию глобальных переменных, что противоречит принципам чистой архитектуры.
В этой статье я поделюсь найденным техническим решением, которое позволяет легитимно передавать данные через объект компонента, используя встроенные методы API Битрикс.
Техническая суть проблемы
Для понимания решения необходимо разобраться в жизненном цикле компонента. Когда мы работаем с типовым компонентом, последовательность выполнения файлов выглядит следующим образом:

-
result_modifier.php — здесь происходит модификация массива
$arResult, но важно понимать, что этот файл оперирует копией данных, переданной в шаблон. -
template.php — непосредственно вывод HTML с использованием подготовленных данных.
-
component_epilog.php — выполняется после шаблона и используется для операций, которые не должны влиять на кеширование (установка title, мета-тегов, обработка данных для отложенных функций).
Ключевая особенность, которую важно учитывать: массив $arResult в component_epilog.php не наследует изменения, сделанные в result_modifier.php. Это архитектурное ограничение связано с тем, что component_epilog.php выполняется в контексте самого компонента, а не его шаблона. В результате все подготовленные данные оказываются недоступны на финальном этапе.
Практическая реализация решения
Для решения этой задачи я использую прямой доступ к объекту компонента и метод SetResultCacheKeys(). Рассмотрим реализацию на конкретном примере.
Постановка задачи
Предположим, мне необходимо вывести мета-теги для корректного отображения публикации в социальных сетях (Open Graph и Twitter Cards). Данные для заполнения этих тегов должны быть получены из элемента инфоблока, обработаны в result_modifier.php и переданы для установки через $APPLICATION->SetPageProperty() в component_epilog.php.
Кстати: Стандартный компонент
bitrix:news.detailпоставляемый с модулем "Информационные блоки", автоматически кеширует ключиID,IBLOCK_ID,NAME,PREVIEW_TEXT,DETAIL_PAGE_URL,DETAIL_PICTUREиPREVIEW_PICTURE. Этого достаточно для базовой SEO-разметки, но для передачи произвольных обработанных данных требуется явное указание ключей.
Шаг 1. Модификация result_modifier.php
В файле модификатора я получаю ссылку на объект компонента и сохраняю необходимые данные:
<?php
// result_modifier.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
// Получаем объект текущего компонента
$component = $this->__component;
// Проверяем, что объект компонента существует
if (is_object($component)) {
// Формируем URL для og:image (может потребоваться ресайз или другая обработка)
if (!empty($arResult['DETAIL_PICTURE'])) {
$arResult['OG_IMAGE'] = CFile::GetPath($arResult['DETAIL_PICTURE']);
} elseif (!empty($arResult['PREVIEW_PICTURE'])) {
$arResult['OG_IMAGE'] = CFile::GetPath($arResult['PREVIEW_PICTURE']);
}
// Сохраняем данные в глобальный массив результата компонента
$component->arResult['OG_IMAGE'] = $arResult['OG_IMAGE'];
$component->arResult['OG_TITLE'] = $arResult['NAME'];
$component->arResult['OG_DESCRIPTION'] = truncateText($arResult['PREVIEW_TEXT'], 200); // пользовательская функция обработки
// Регистрируем ключи для кеширования
$component->SetResultCacheKeys([
'OG_IMAGE',
'OG_TITLE',
'OG_DESCRIPTION'
]);
}Пояснение к коду:
-
$this->__componentпредоставляет доступ к объекту компонента из любого файла шаблона -
Запись в
$component->arResultнапрямую модифицирует массив, который будет передан вcomponent_epilog.php -
SetResultCacheKeys()критически важен — без вызова этого метода сохраненные данные будут потеряны при использовании кеширования
Шаг 2. Использование данных в component_epilog.php
Теперь в файле component_epilog.php я могу получить доступ к сохраненным данным:
<?php
// component_epilog.php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
// Проверяем наличие данных перед использованием
if (!empty($arResult['OG_IMAGE'])) {
// Устанавливаем Open Graph теги
$APPLICATION->SetPageProperty('og:image', $arResult['OG_IMAGE']);
$APPLICATION->SetPageProperty('og:title', $arResult['OG_TITLE']);
$APPLICATION->SetPageProperty('og:description', $arResult['OG_DESCRIPTION']);
$APPLICATION->SetPageProperty('og:url', $APPLICATION->GetCurPage(true));
$APPLICATION->SetPageProperty('og:type', 'website');
$APPLICATION->SetPageProperty('og:locale', 'ru_RU');
// Устанавливаем теги для Twitter Cards
$APPLICATION->SetPageProperty('twitter:card', 'summary_large_image');
$APPLICATION->SetPageProperty('twitter:title', $arResult['OG_TITLE']);
$APPLICATION->SetPageProperty('twitter:description', $arResult['OG_DESCRIPTION']);
$APPLICATION->SetPageProperty('twitter:image', $arResult['OG_IMAGE']);
// Каноническая ссылка
$APPLICATION->SetPageProperty('canonical', $APPLICATION->GetCurPage(true));
}
В результате в секции <head> страницы будут корректно выведены мета-теги, необходимые для социальных сетей:
<meta property="og:url" content="https://example.com/blog/current-article/" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Заголовок текущей статьи" />
<meta property="og:description" content="Краткое описание статьи..." />
<meta property="og:image" content="https://example.com/upload/resized/image.jpg" />
<meta property="og:locale" content="ru_RU" />
<meta name="twitter:card" content="summary_large_image" />
<link href="https://example.com/blog/current-article/" rel="canonical" />Технические преимущества подхода
Применение данного метода дает несколько архитектурных преимуществ:
-
Соблюдение единства ответственности: логика подготовки данных инкапсулирована в
result_modifier.php, а логика их применения — вcomponent_epilog.php -
Кеширование без потерь: метод
SetResultCacheKeys()гарантирует, что данные сохраняются в кеше компонента -
Отсутствие дублирования запросов: не требуется повторно обращаться к базе данных или файловой системе
-
Типобезопасность: передаются оригинальные типы данных, включая массивы и объекты
Заключение
Предложенное решение позволяет эффективно организовывать работу с данными в компонентах 1С-Битрикс, избегая избыточных запросов и дублирования кода. Использование объекта компонента и метода SetResultCacheKeys() — это документированный и поддерживаемый разработчиками платформы подход, который гарантирует корректную работу как с включенным, так и с выключенным кешированием.