Как передать значения из элемента инфоблока в константы 1С-Битрикс и использовать их в шаблонах сайта

В процессе разработки на 1С-Битрикс часто возникает задача — хранить относительно постоянные данные (логотипы, телефоны, режим работы и т.п.) в одном месте, чтобы легко управлять ими и выводить на нескольких страницах. Удобным решением является хранение такой информации в инфоблоке и дальнейшее «пробрасывание» этих данных в константы или глобальные переменные для использования в шаблонах (header.php, footer.php и т.д.).

Как передать значения из элемента инфоблока в константы 1С-Битрикс

В данной статье разберём:

  1. Где хранить подобные данные
  2. Процедурный подход к получению данных
  3. ООП-подход (Singleton-класс)
  4. Дополнительные нюансы хранения и настройки

1. Где хранить подобные данные

Инфоблоки — основной инструмент 1С-Битрикс для структурирования контента. Чтобы хранить общие настройки сайта:

  • Создайте или используйте существующий инфоблок (например, «Настройки сайта»).
  • В нём заведите один элемент (например, с символьным кодом SITE_SETTINGS).
  • Добавьте свойства для логотипа, телефона, адреса, времени работы и т.д.

Таким образом, вы получаете централизованное хранилище, к которому можно обращаться в любом месте кода.

Выбор таблиц

По умолчанию элементы инфоблоков хранятся в общей таблице b_iblock_element, а значения их свойств — в таблицах b_iblock_element_prop_sXX / b_iblock_element_prop_mXX. Если у вас включено хранение свойств в отдельных таблицах, то механизм запроса свойств не меняется — просто создаются отдельные физические таблицы для конкретного инфоблока.

Highload-блоки (HL-блоки) используют иной принцип и собственные ORM-классы, однако для простого и нечасто меняющегося набора данных обычно достаточно стандартных инфоблоков.

2. Процедурный подход к получению данных

Для извлечения информации из элемента инфоблока в 1С-Битрикс можно использовать метод CIBlockElement::GetProperty(). В результате вы получите все нужные свойства и сможете определить их как константы (или глобальные переменные).

Пример кода (в init.php или другом подключаемом файле):

 $iblockId,
    'CODE'      => $elementCode,
    'ACTIVE'    => 'Y'
];

$res = CIBlockElement::GetList([], $arFilter, false, false, ['ID', 'NAME']);
if ($ob = $res->GetNextElement()) {
    $elementId = $ob->GetFields()['ID'];

    // Получаем свойства элемента
    $propertyRes = CIBlockElement::GetProperty($iblockId, $elementId, [], ['ACTIVE' => 'Y']);
    $arProps = [];
    while ($prop = $propertyRes->Fetch()) {
        $code = $prop['CODE'];
        $arProps[$code] = $prop['VALUE'];
    }

    // Извлекаем данные
    $logoId = isset($arProps['COMPANY_LOGO']) ? $arProps['COMPANY_LOGO'] : '';
    $phone  = isset($arProps['PHONE'])        ? $arProps['PHONE']        : '';
    $address = isset($arProps['ADDRESS'])     ? $arProps['ADDRESS']      : '';
    $workTime = isset($arProps['WORK_TIME'])  ? $arProps['WORK_TIME']    : '';

    // Преобразуем логотип из ID файла в путь
    define("COMPANY_LOGO", CFile::GetPath($logoId));
    define("PHONE", $phone);
    define("ADDRESS", $address);
    define("WORK_TIME", $workTime);
} else {
    // Обработка ситуации, когда элемент не найден
    echo "Элемент с кодом SITE_SETTINGS не найден";
}
?>

После выполнения этого кода по всему сайту становятся доступны константы COMPANY_LOGO, PHONE, ADDRESS, WORK_TIME.

Использование констант в шаблонах

В файле header.php или другом месте, где нужно вывести значения:

<img src="<?= COMPANY_LOGO ?>" alt="Логотип" />
<p>Телефон: <?= PHONE ?></p>
<p>Адрес: <?= ADDRESS ?></p>
<p>Время работы: <?= WORK_TIME ?></p>

3. Объектно-ориентированный подход

Если вы стремитесь к более «правильной» архитектуре или у вас проект с множеством настроек, можно воспользоваться ООП-подходом. Например, через паттерн Singleton: создать класс, который единожды загружает данные из инфоблока, хранит их в себе и предоставляет методы для доступа.

Пример класса настроек

<?php

namespace Local\Utils;

use Bitrix\Main\Loader;
use CIBlockElement;
use CFile;

class SiteSettings
{
    private static $instance = null;
    private $data = [];

    private function __construct()
    {
        $this->loadData();
    }

    public static function getInstance()
    {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function loadData()
    {
        Loader::includeModule('iblock');
        $iblockId = 10; // ID вашего инфоблока
        $elementCode = 'SITE_SETTINGS';

        $res = CIBlockElement::GetList([], [
            'IBLOCK_ID' => $iblockId,
            'CODE' => $elementCode,
            'ACTIVE' => 'Y'
        ], false, false, ['ID', 'NAME']);

        if ($obj = $res->GetNextElement()) {
            $elementId = $obj->GetFields()['ID'];

            $propertyRes = CIBlockElement::GetProperty($iblockId, $elementId, [], ['ACTIVE' => 'Y']);
            while ($prop = $propertyRes->Fetch()) {
                $code = $prop['CODE'];
                $this->data[$code] = $prop['VALUE'];
            }
        }
    }

    // Геттер для произвольного ключа
    public function get($key)
    {
        return isset($this->data[$key]) ? $this->data[$key] : null;
    }

    // Удобные методы для конкретных свойств
    public function getLogo()
    {
        $logoId = $this->get('COMPANY_LOGO');
        return CFile::GetPath($logoId);
    }

    public function getPhone()
    {
        return $this->get('PHONE');
    }

    public function getAddress()
    {
        return $this->get('ADDRESS');
    }

    public function getWorkTime()
    {
        return $this->get('WORK_TIME');
    }
}

?>

Использование в коде

<?php
use Local\Utils\SiteSettings;

$settings = SiteSettings::getInstance();

// Вывод логотипа
echo '<img src="' . $settings->getLogo() . '" alt="Логотип" />';
// Телефон
echo '<p>Телефон: ' . $settings->getPhone() . '</p>';
// Адрес
echo '<p>Адрес: ' . $settings->getAddress() . '</p>';
// Время работы
echo '<p>Время работы: ' . $settings->getWorkTime() . '</p>';
?>

Такой подход хорош в проектах, где предстоит расширять функциональность (добавлять логгер, кеширование, разные сценарии работы с настройками).

4. Дополнительные нюансы

Кеширование

Частые запросы к инфоблоку на каждом хите могут нагружать систему. Для оптимизации используйте кеш:

  • Системный кеш компонентов (если данные выводятся через компонент).
  • Ручное кеширование, сохраняя результат в файлах или опциях (Bitrix\Main\Config\Option), чтобы не ходить в базу каждый раз.

Многосайтовость

Если на установке 1С-Битрикс несколько сайтов, то удобнее:

  • Либо делать несколько элементов (по одному на каждый сайт).
  • Либо заводить несколько инфоблоков (каждый сайт хранит свои настройки).
  • Либо организовать набор свойств, где передаётся ID сайта.

Типы данных и форматирование

Будьте внимательны, если в свойствах лежит:

  • Файл (логотип, иконки) — придётся конвертировать ID файла через CFile::GetPath().
  • Список (для выбора опций) — возможно, нужно получать значения и XML_ID.
  • Числа — стоит учитывать форматирование (разделитель тысяч и т. п.).

Итог

Для хранения редко меняющихся настроек сайта, вроде контактных данных и логотипа, удобно использовать инфоблоки. Вы можете сделать это через процедурный подход (определяя константы) или объектно-ориентированную реализацию (создав Singleton-класс). Основные шаги таковы:

  1. Создать или настроить существующий инфоблок (например, «Настройки сайта»).
  2. Создать элемент с кодом (SITE_SETTINGS) и свойствами (логотип, телефон и т.д.).
  3. В коде (чаще всего в init.php или специализированном классе) получить свойства при помощи CIBlockElement::GetProperty().
  4. «Пробросить» данные в константы или хранить их в объекте, чтобы затем легко использовать в шаблонах.

Такое решение снижает риск дублирования информации и упрощает дальнейшее сопровождение проекта.

Теги:  инфоблоки, константы, настройки сайта, PHP, OOP, Singleton

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.