В 1С-Битрикс для каждого элемента инфоблока по умолчанию ведётся счётчик показов. Его значение хранится в поле SHOW_COUNTER таблицы b_iblock_element. Иногда возникает необходимость искусственно увеличить эти показатели — например, для тестирования, аналитики или при переносе данных. Ниже я разберу несколько способов, как это сделать, и дам практические примеры кода.

Зачем увеличивать SHOW_COUNTER?
- Тестирование. Если нужно проверить, корректно ли работает отображение количества просмотров на сайте (в карточках товаров, новостей и т.п.).
- Перенос данных. При миграции сайта на новый домен или при импорте элементов может возникнуть задача «прокинуть» старую статистику просмотров.
- Демонстрационные цели. Случается, что для презентации заказчику требуется «красивая» статистика посещений.
Однако всегда помните, что реальная статистика просмотров имеет смысл только при корректной работе механизма подсчёта, а «накрученные» значения обычно нужны лишь для внутренних целей и тестов.
Способ 1. Массовое обновление через SQL-запрос
Когда использовать
Этот метод подойдёт, если вам нужно одним махом увеличить счётчики всех (или части) элементов без сложной дополнительной логики. Прямой запрос к базе данных — самый быстрый и простой способ.
Пример кода (старый пролог)
Если ваш проект всё ещё использует традиционный пролог (без D7), вы можете обратиться к глобальной переменной $DB:
<?php
global $DB;
$iblockId = 1; // ID нужного инфоблока
$addValue = 10; // На сколько увеличить SHOW_COUNTER для каждого элемента
// Формируем SQL-запрос
$strSql = "
UPDATE b_iblock_element
SET SHOW_COUNTER = SHOW_COUNTER + ".(int)$addValue."
WHERE IBLOCK_ID = ".(int)$iblockId."
";
// Выполняем запрос
$DB->Query($strSql);
?>
Если нужно увеличить счётчики только для элементов конкретного раздела, придётся дополнительно использовать таблицу b_iblock_section_element (чтобы ограничить выборку). Например:
<?php
$strSql = "
UPDATE b_iblock_element el
JOIN b_iblock_section_element se ON el.ID = se.IBLOCK_ELEMENT_ID
SET el.SHOW_COUNTER = el.SHOW_COUNTER + ".(int)$addValue."
WHERE el.IBLOCK_ID = ".(int)$iblockId."
AND se.IBLOCK_SECTION_ID = ".(int)$sectionId."
";
$DB->Query($strSql);
?>
Пример кода (D7-подход)
В современных проектах можно использовать класс Bitrix\Main\Application:
<?php
use Bitrix\Main\Application;
$connection = Application::getConnection();
$iblockId = 1;
$addValue = 10;
$sql = "
UPDATE b_iblock_element
SET SHOW_COUNTER = SHOW_COUNTER + ".(int)$addValue."
WHERE IBLOCK_ID = ".(int)$iblockId."
";
$connection->queryExecute($sql);
?>
Плюсы:
- Максимальная скорость;
- Менее чем в десяток строк кода решается задача массовой «накрутки»;
- Не нужно писать циклы и вручную проходить по элементам.
Минусы:
- Прямое обращение к базе данных не вызывает события 1С-Битрикс (например, OnBeforeIBlockElementUpdate, OnAfterIBlockElementUpdate);
- Не обновляются некоторые служебные поля вроде TIMESTAMP_X (если это важно, нужно дополнить запрос TIMESTAMP_X = NOW() или использовать $DB->CurrentTimeFunction()).
Способ 2. Использование CIBlockElement::Update()
Когда использовать
Если вам критично, чтобы сработали события ядра (например, какие-то модули слушают OnBeforeIBlockElementUpdate) или чтобы корректно обновлялось поле TIMESTAMP_X, вы можете пройтись циклом по элементам через метод CIBlockElement::Update().
Пример кода
<?php
$iblockId = 1;
$addValue = 10; // На сколько увеличить счетчики
$arFilter = [
'IBLOCK_ID' => $iblockId,
// Если нужно ограничить по разделу:
// 'SECTION_ID' => <ID раздела>,
// 'INCLUDE_SUBSECTIONS' => 'Y',
];
$res = CIBlockElement::GetList(
[],
$arFilter,
false,
false,
['ID', 'SHOW_COUNTER']
);
$element = new CIBlockElement;
while ($arItem = $res->Fetch())
{
$newShowCounter = (int)$arItem['SHOW_COUNTER'] + $addValue;
// Пробуем обновить поле SHOW_COUNTER
$fields = [
'SHOW_COUNTER' => $newShowCounter
];
$result = $element->Update($arItem['ID'], $fields);
if (!$result)
{
// Выводим ошибку, если что-то пошло не так
echo "Ошибка при обновлении элемента ID=".$arItem['ID'].": ".$element->LAST_ERROR."<br>";
}
else
{
echo "Элемент ID=".$arItem['ID']." успешно обновлён.<br>";
}
}
?>
Однако у такого подхода есть одна особенность: не все поля ядро позволяет обновлять через Update(). SHOW_COUNTER формально считается системным полем, и в некоторых версиях Битрикс оно может игнорироваться. Если метод не срабатывает (значения не меняются, или LAST_ERROR пустая), придётся либо добавить костыль (например, одновременно обновлять ещё какое-то поле), либо вернуться к прямому SQL-запросу.
Способ 3. Использовать функцию CounterInc()
Когда использовать
CounterInc($ID) — стандартная функция для увеличения счётчика просмотров конкретного элемента на 1. Она вызывается, когда пользователь переходит на детальную страницу элемента. Однако она не подходит для массового увеличения в цикле, поскольку внутри неё есть проверка:
if(in_array($ID, $_SESSION["IBLOCK_COUNTER"]))
return;
То есть повторное обращение к CounterInc() для одного и того же элемента в рамках одной сессии не увеличит счётчик. Чтобы «накручивать» показы, нужно либо сбрасывать $_SESSION["IBLOCK_COUNTER"], либо эмулировать разных пользователей/сессии (что часто не стоит потраченных усилий).
Пример «тестового» кода
<?php
// Эмулируем несколько разных элементов
$elements = [101, 102, 103];
foreach ($elements as $elementId) {
// Обнуляем массив, чтобы CounterInc() сработала
$_SESSION["IBLOCK_COUNTER"] = [];
CIBlockElement::CounterInc($elementId);
}
?>
Подобный подход иногда используют, чтобы разово проверить логику счётчиков на нескольких элементах. Но если требуется увеличить счётчик на сотни единиц, тут проще (и безопаснее) воспользоваться SQL-запросом.
Что делать, если изменения не видны в админке?
- Кэш. В админке Битрикс периодически «держит» некоторые данные в кэше (особенно счётчики). Попробуйте сбросить кэш через «Настройки» → «Автокеширование».
- Отображение столбца SHOW_COUNTER. Убедитесь, что в списке элементов инфоблока вы действительно выводите колонку «Показов». Если её нет, добавьте через «Настройку списка».
- Обновление TIMESTAMP_X. При прямом SQL-запросе поле с датой модификации не меняется, и в админке может показаться, что «ничего не произошло», если ориентироваться на столбец «Изменено».
Рекомендации и лучшие практики
- Всегда делайте резервную копию. Перед любыми массовыми изменениями (особенно, если речь идёт о прямом SQL) не поленитесь сохранить дамп базы данных.
- Обдумайте цель. Если задача — «накрутить» счётчики для клиента, помните, что это исказит реальную статистику просмотров. Лучше настроить корректную систему аналитики (например, Яндекс.Метрику или Google Analytics).
- Не злоупотребляйте. Постоянные массовые изменения «статистики» могут приводить к путанице в данных и усложнять жизнь вашим коллегам или будущему разработчику, который возьмёт в руки этот проект.
Заключение
Чтобы массово увеличить SHOW_COUNTER в 1С-Битрикс, проще всего воспользоваться прямым SQL-запросом к таблице b_iblock_element. Если же вам важно запускать события обновления элемента или вы хотите более «корректный» путь через API, попробуйте CIBlockElement::Update(). Однако не удивляйтесь, что SHOW_COUNTER — системное поле, и ядро не всегда даёт его менять напрямую. Функция CounterInc() отлично подходит для реальных просмотров, но не годится для разового массового повышения счётчика — её механизм заточен под реальное поведение пользователей (проверка сессии).
Надеюсь, теперь у вас не останется вопросов, и вы без труда поднимете показатель просмотров для нужных элементов инфоблока или разделов в 1С-Битрикс. При грамотном использовании приведённые методы отлично справляются с задачей и помогают избежать ошибок, связанных с массовой модификацией статистических данных.