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

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

Как увеличить количество показов элементов (SHOW_COUNTER)

Зачем увеличивать SHOW_COUNTER?

  1. Тестирование. Если нужно проверить, корректно ли работает отображение количества просмотров на сайте (в карточках товаров, новостей и т.п.).
  2. Перенос данных. При миграции сайта на новый домен или при импорте элементов может возникнуть задача «прокинуть» старую статистику просмотров.
  3. Демонстрационные цели. Случается, что для презентации заказчику требуется «красивая» статистика посещений.

Однако всегда помните, что реальная статистика просмотров имеет смысл только при корректной работе механизма подсчёта, а «накрученные» значения обычно нужны лишь для внутренних целей и тестов.

Способ 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-запросом.

Что делать, если изменения не видны в админке?

  1. Кэш. В админке Битрикс периодически «держит» некоторые данные в кэше (особенно счётчики). Попробуйте сбросить кэш через «Настройки» → «Автокеширование».
  2. Отображение столбца SHOW_COUNTER. Убедитесь, что в списке элементов инфоблока вы действительно выводите колонку «Показов». Если её нет, добавьте через «Настройку списка».
  3. Обновление TIMESTAMP_X. При прямом SQL-запросе поле с датой модификации не меняется, и в админке может показаться, что «ничего не произошло», если ориентироваться на столбец «Изменено».

Рекомендации и лучшие практики

  1. Всегда делайте резервную копию. Перед любыми массовыми изменениями (особенно, если речь идёт о прямом SQL) не поленитесь сохранить дамп базы данных.
  2. Обдумайте цель. Если задача — «накрутить» счётчики для клиента, помните, что это исказит реальную статистику просмотров. Лучше настроить корректную систему аналитики (например, Яндекс.Метрику или Google Analytics).
  3. Не злоупотребляйте. Постоянные массовые изменения «статистики» могут приводить к путанице в данных и усложнять жизнь вашим коллегам или будущему разработчику, который возьмёт в руки этот проект.

Заключение

Чтобы массово увеличить SHOW_COUNTER в 1С-Битрикс, проще всего воспользоваться прямым SQL-запросом к таблице b_iblock_element. Если же вам важно запускать события обновления элемента или вы хотите более «корректный» путь через API, попробуйте CIBlockElement::Update(). Однако не удивляйтесь, что SHOW_COUNTER — системное поле, и ядро не всегда даёт его менять напрямую. Функция CounterInc() отлично подходит для реальных просмотров, но не годится для разового массового повышения счётчика — её механизм заточен под реальное поведение пользователей (проверка сессии).

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

Теги:  SHOW_COUNTER, увеличение показов, инфоблок, раздел, SQL-запрос, CIBlockElement, CounterInc

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

Лендинг

от 3 дней

от 25 000 рублей

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

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

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

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

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

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

Участие в проекте

привлечение в проект на part-time основе

от 20 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная