Блог разработчика 1С-Битрикс

Как автоматизировать переименование файлов в 1С-Битрикс. Разбор кода

В этой статье мы разберем, как с помощью PHP и 1С-Битрикс можно автоматизировать процесс переименования файлов в системе. Рассмотрим пример кода, который поможет вам переименовать файлы с пробелами в их именах, заменив пробелы на подчеркивания, а также обновить соответствующие данные в базе данных.

Как автоматизировать переименование файлов в 1С-Битрикс

Код:


    $rs = \Bitrix\Main\FileTable::getList([
        'filter' => ['MODULE_ID' => 'main', '%FILE_NAME' => ' '],
        'select' => ['ID', 'SUBDIR', 'FILE_NAME', 'DESCRIPTION'],
        'limit' => 10
    ]);

    $dir = $_SERVER['DOCUMENT_ROOT'].'/upload/';
    $connection = \Bitrix\Main\Application::getConnection();

    while($row = $rs->fetch()){
        $file = $dir.$row['SUBDIR'].'/'.$row['FILE_NAME'];
        if(file_exists($file)){
            $newFileName = str_replace(' ', '_', $row['FILE_NAME']);
            $toFile = $dir.$row['SUBDIR'].'/'.$newFileName;
            var_dump($row);
            var_dump(rename($file, $toFile));
            $connection->query('UPDATE b_file SET FILE_NAME = "'.$newFileName.'" WHERE ID = '.$row['ID']);
        }
    }
    

Что делает код и как работает:

  1. Получение данных из базы данных:

    
                $rs = \Bitrix\Main\FileTable::getList([
                    'filter' => ['MODULE_ID' => 'main', '%FILE_NAME' => ' '],
                    'select' => ['ID', 'SUBDIR', 'FILE_NAME', 'DESCRIPTION'],
                    'limit' => 10
                ]);
                

    Этот блок выполняет запрос к базе данных с использованием класса FileTable из пространства имен Bitrix\Main. Он ищет все файлы, у которых в имени есть пробел (условие %FILE_NAME => ' '). При этом результат ограничен первыми 10 записями, чтобы избежать излишней нагрузки на систему.

    • MODULE_ID — фильтр по модулю. В данном случае выбираются только те файлы, которые относятся к модулю main.
    • %FILE_NAME => ' ' — ищутся все файлы, чьи имена содержат пробел.
    • select — выбираются только нужные поля: ID, путь к подкаталогу (SUBDIR), имя файла (FILE_NAME) и описание (DESCRIPTION).
    • limit — ограничение на количество возвращаемых файлов (в данном случае 10).
  2. Настройка пути к директории:

    
                $dir = $_SERVER['DOCUMENT_ROOT'].'/upload/';
                

    Переменная $dir указывает на корневую директорию для загрузки файлов на сервере. Это место, где в 1С-Битрикс обычно хранятся все загруженные файлы — папка /upload/.

  3. Подключение к базе данных:

    
                $connection = \Bitrix\Main\Application::getConnection();
                

    Создается объект $connection, который используется для выполнения запросов к базе данных.

  4. Обработка каждого файла:

    
                while($row = $rs->fetch()){
                    $file = $dir.$row['SUBDIR'].'/'.$row['FILE_NAME'];
                    if(file_exists($file)){
                        $newFileName = str_replace(' ', '_', $row['FILE_NAME']);
                        $toFile = $dir.$row['SUBDIR'].'/'.$newFileName;
                        var_dump($row);
                        var_dump(rename($file, $toFile));
                        $connection->query('UPDATE b_file SET FILE_NAME = "'.$newFileName.'" WHERE ID = '.$row['ID']);
                    }
                }
                

    Этот блок выполняет обработку каждого файла, который был найден на предыдущем шаге:

    • $file = $dir.$row['SUBDIR'].'/'.$row['FILE_NAME']; — строится полный путь к файлу, используя директорию и имя файла.
    • file_exists($file) — проверяется, существует ли файл по указанному пути.
    • str_replace(' ', '_', $row['FILE_NAME']) — заменяются пробелы на подчеркивания в имени файла.
    • $toFile = $dir.$row['SUBDIR'].'/'.$newFileName; — создается новый путь с обновленным именем файла.
    • rename($file, $toFile) — переименовывает файл, если он существует.
    • $connection->query('UPDATE b_file SET FILE_NAME = "'.$newFileName.'" WHERE ID = '.$row['ID']); — обновляется имя файла в базе данных, чтобы отражать изменения.

    Используется var_dump для вывода отладочной информации, которая может быть полезной для отслеживания изменений.

Что важно помнить:

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

Заключение:

Этот пример показывает, как можно легко и быстро автоматизировать процесс переименования файлов в 1С-Битрикс с помощью стандартных инструментов PHP и Bitrix API. Он будет полезен для тех, кто хочет поддерживать чистоту и порядок в именах файлов, избегая пробелов, которые могут вызывать проблемы в некоторых случаях (например, при использовании этих файлов в URL или в системах, которые не поддерживают пробелы в именах).

Теги: автоматизация, переименование файлов, PHP, база данных


Валерий Макеев
04.09.2025 11:34
Этот код безопасно находит файлы с пробелами в именах в 1С-Битрикс, отображает их с путями и статусами, и позволяет включить автоматическое переименование с обновлением базы данных — всё это можно проверить в браузере.
Код
<?php
// /local/tools/check_files.php

// Подключаем ядро Битрикс
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Main\Application;
use Bitrix\Main\FileTable;

// Проверка прав: только для администраторов
if (!CModule::IncludeModule("main") || !$USER->IsAdmin()) {
    die("Доступ запрещён.");
}

// Настройки
$uploadDir = $_SERVER["DOCUMENT_ROOT"] . "/upload/";
$maxFiles = 10;
$processed = 0;
$log = [];

// Получаем файлы с пробелами в имени
$rsFiles = FileTable::getList([
    'filter' => [
        'MODULE_ID' => 'main',
        '%FILE_NAME' => ' '  // Ищем файлы, где имя содержит пробел
    ],
    'select' => ['ID', 'SUBDIR', 'FILE_NAME'],
    'limit' => $maxFiles
]);

echo "<h2>:f09f948d: Поиск файлов с пробелами в имени</h2>";
echo "<table border='1' cellpadding='8' style='border-collapse: collapse; font-family: sans-serif;'>";
echo "<tr style='background: #f0f0f0;'><th>ID</th><th>Старое имя</th><th>Путь</th><th>Новое имя</th><th>Статус</th></tr>";

while ($file = $rsFiles->fetch()) {
    $oldPath = $uploadDir . $file['SUBDIR'] . '/' . $file['FILE_NAME'];
    $newFileName = str_replace(' ', '_', $file['FILE_NAME']);
    $newPath = $uploadDir . $file['SUBDIR'] . '/' . $newFileName;

    $status = [];

    if (!file_exists($oldPath)) {
        $status[] = "❌ Файл не найден на диске";
    } else {
        if (file_exists($newPath)) {
            $status[] = "⚠️ Уже существует: $newFileName";
        } else {
            $status[] = "✅ Готов к переименованию";
        }
    }

    echo "<tr>";
    echo "<td>{$file['ID']}</td>";
    echo "<td><strong>{$file['FILE_NAME']}</strong></td>";
    echo "<td style='font-size: 0.9em; color: #555;'>{$file['SUBDIR']}/{$file['FILE_NAME']}</td>";
    echo "<td><code>{$newFileName}</code></td>";
    echo "<td>" . implode("<br>", $status) . "</td>";
    echo "</tr>";

    $log[] = [
        'id' => $file['ID'],
        'old' => $file['FILE_NAME'],
        'new' => $newFileName,
        'path' => $oldPath,
        'exists' => file_exists($oldPath),
        'conflict' => file_exists($newPath)
    ];
    $processed++;
}

if ($processed === 0) {
    echo "<tr><td colspan='5' style='text-align: center; color: green;'>✅ Нет файлов с пробелами в имени (в пределах лимита)</td></tr>";
}

echo "</table>";

echo "<p><strong>Найдено файлов:</strong> $processed (показаны первые $maxFiles)</p>";

// :f09f9481: Раскомментируйте блок ниже, чтобы включить реальное переименование
/*
echo "<h2>:f09f9484: Выполнение переименования...</h2>";
$connection = Application::getConnection();
$renamed = 0;

foreach ($log as $item) {
    if ($item['exists'] && !$item['conflict']) {
        if (rename($item['path'], dirname($item['path']) . '/' . $item['new'])) {
            $connection->queryExecute("UPDATE b_file SET FILE_NAME = '{$item['new']}' WHERE ID = {$item['id']}");
            echo "✅ {$item['old']} → {$item['new']} (обновлено в БД)<br>";
            $renamed++;
        }
    }
}
echo "<p>✅ Успешно переименовано: $renamed файлов</p>";
*/

require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php");

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

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

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

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

от 4 недель

от 90 000 рублей

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

Техническая поддержка

сайтов на CMS 1C-Битрикс

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

* стоимость зависит от объема и сложности выполняемых работ