loader
СГБ - Сологуб
Заказать услуги

Материалы с меткой: 1-с битрикс

Вчера в 07:04 Читать ~ 0 минут 9
0ответов
Example blog post alt

Пятница, почти ночь. В офисе темно, светится только монитор. Прилетает сообщение от клиента: «Слушай, каталог захламлён, надо удалить всё, что в файле remsku.txt, там артикулов под 37 тысяч. Сделаешь к понедельнику?»

Первая мысль — открыть админку и удалять товары вручную по одному. Вторая мысль, более здравая — сесть и написать скрипт, который сделает всё сам. На это ушло примерно 15 минут, а вся чистка каталога заняла около часа.

В чём была задача

Есть текстовый файл на 37 тысяч строк, в каждой строке — артикул товара, который нужно снести из каталога. Руками это делать бессмысленно: и медленно, и высокий риск ошибиться, задев не тот товар.

Логика решения простая:

  1. Читаем файл построчно, каждая строка — это артикул.
  2. По артикулу ищем товар в инфоблоке через стандартный CIBlockElement.
  3. Если товар найден, удаляем его через API Битрикса, а не прямыми запросами в базу.
  4. Логируем результат: что удалено, что не найдено, что пошло не так.

Почему не через SQL

Соблазн простой: написать один DELETE-запрос и закрыть задачу за минуту. Но у товара в Битриксе куча связанных сущностей — торговые предложения, свойства, изображения, связи с разделами, остатки. Прямое удаление из таблицы оставит после себя мусор в базе, который потом всплывёт в самый неудобный момент. Поэтому используется штатный CIBlockElement::Delete(), который чистит все связи корректно.

Что важно при обработке 37 тысяч строк

Большой объём данных — это отдельная головная боль. Если просто гнать цикл без остановок, велик шанс упереться в лимит времени выполнения PHP или память. Поэтому скрипт:

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

Что чуть не пошло не так

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

Итог

Задача, которая руками растянулась бы на несколько дней с риском ошибок, решилась одним прогоном скрипта. Каталог почистили, лишние 37 тысяч позиций ушли, а клиент получил результат раньше дедлайна.

Скрипт проверялся на «1С-Битрикс: Управление сайтом» редакции «Бизнес», PHP 7.4 и выше. На старых версиях ядра может потребоваться небольшая адаптация.

Сам скрипт чистки по артикула 1-С Битрикс

x
Тема пуша
Сообщение пуша
Наверх
Отправить заявку
Нажимая на кнопку, вы даете согласие на обработку своих персональных данных