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

В данной статье разберём:
- Где хранить подобные данные
- Процедурный подход к получению данных
- ООП-подход (Singleton-класс)
- Дополнительные нюансы хранения и настройки
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-класс). Основные шаги таковы:
- Создать или настроить существующий инфоблок (например, «Настройки сайта»).
- Создать элемент с кодом (
SITE_SETTINGS
) и свойствами (логотип, телефон и т.д.). - В коде (чаще всего в
init.php
или специализированном классе) получить свойства при помощиCIBlockElement::GetProperty()
. - «Пробросить» данные в константы или хранить их в объекте, чтобы затем легко использовать в шаблонах.
Такое решение снижает риск дублирования информации и упрощает дальнейшее сопровождение проекта.