Главное Авторские колонки Вакансии Образование
733 5 В избр. Сохранено
Авторизуйтесь
Вход с паролем

Нестандартная интеграция с 1С

Перед нами стояла задача - реализовать полноценную выгрузку товаров компании Nordberg из их базы 1С. Для достижения цели нами был разработан импорт выгрузки товаров, состоящий из двух скриптов. Далее детально разберемся со структурой и этапами работы.
Мнение автора может не совпадать с мнением редакции

Цель - выгрузка товаров на новый корпоративный сайт Nordberg, а также загрузка полного ассортимента товаров в каталог проекта, разработанного нами для партнеров компании Мастер Инструмент. Сайт Nordberg и все сайты, входящие в партнерский проект работают на системе 1С-Битрикс.

Этапы выгрузки:

  • Номенклатура, дерево каталога и свойства товаров выгружаются из 1С на сервер компании Nordberg.
  • Фотографии хранятся на сервере компании Nordberg разбитые по папкам с артикулами товаров.
  • Мы забираем все файлы на сервер, где срабатывает скрипт импорта.
  • Поэтапно загружаем либо обновляем дерево каталога, номенклатуру, свойства.
  • Загружаем или обновляем фотографии категорий и товаров.
  • Очищаем кэш, переиндексируем модуль поиска по сайту, обновляем фасетный индекс.
  • Отдельным скриптом запускаем обновление цен и наличия.
  • Отправляем на почту нашего технического отдела и технического отдела компании Nordberg полноценный автоматический отчет с результатами выгрузки.

Импорт постоянно обновляется, дорабатывается и с каждым разом становится лучше, потребляет меньше ресурсов. Мы находим интересные технологические решения, чтобы наращивать стабильность продукта, а также улучшаем автоматическое информирование, чтобы понимать какие товары выгрузились, а какие нет и почему. Крупные обновления скрипта были выпущены на прошлой неделе и в скором времени будут еще более крутые доработки.

Давайте детально рассмотрим как разрабатывался импорт товаров, как мы оптимизировали этапы, и как пришли к тому, что есть на данный момент. Это техническая статья, но мы постарались сделать ее максимально понятной и без лишней терминологии.

Запуск импорта

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

Скрипт мы разделили на две части:

Первая - загрузка номенклатуры, дерева каталога, фотографий. Товары не так часто обновляются, а скрипт потребляет немало ресурсов сервера во время работы, поэтому запускаем мы его один раз в день автоматически через CRON в 10 часов вечера, когда нагрузка на все сайты, с которыми работает скрипт минимальна. Раньше этот скрипт запускался каждые пол часа и от этого возникало много проблем.

Вторая - мы отделили обновление цен и наличия в отдельный скрипт, он максимально прост. Его задача обновлять только цены в рублях и остатки на складе. Отрабатывает он за 20 секунд, где большая часть времени уходит на очистку кэша сайта. Этот скрипт особо не потребляет ресурсов и работает через CRON каждые 30 минут.

В основе скриптов стоят простейшие файлы, которые задают все основные настройки импорта и подключают последовательно файлы с разными этапами импорта через волшебный glob и простейший цикл.

Загрузка файлов

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

На данном этапе была решена очень интересная техническая задача. Раньше файлы и фотографии загружались вместе. Так как все это хранится на сервере с закрытым FTP доступом, то мы все скачивали через FTP. Скачивание 5000 фотографий занимало до получаса. Мы сумели оптимизировать этот процесс, благодаря UNIX команде wget, которая умеет работать с FTP. Благодаря этому мы смогли ускорить процесс в несколько раз, а скачивание 5000 фотографий стало занимать всего одну минуту! Ниже, в разделе посвященном фотографиям, мы опишем, как мы решили еще более интересную задачу с загрузкой.

Создание дерева каталога

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

Добавление и обновление номенклатуры

Следующим этапом добавляем и обновляем товары на сайтах. Мы построчно считываем CSV файл с номенклатурой (раньше это был огромный кусок кода, больше похожий на хаос). Со временем мы разделили все на классы, теперь все написано аккуратно, документировано, и каждый метод занимает всего несколько строк.

На начальном этапе мы ничего не добавляем в базу данных. Мы собираем массив объектов товаров, который проходит множество проверок:

  • Указан ли артикул;
  • Указано ли название товара;
  • Корректность строки в CSV файле и т.д.

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

Далее очищаются имена товаров:

  • Убирается название производителя;
  • Удаляются лишние слова типа "новинка", "акция" и т.д.
  • Все название переводится в нижний регистр, и только первая буква должна быть заглавной. Для этого мы написали простую функцию mb_ucfirst, так как PHP не умеет делать такой магии с кириллическими буквами.

После мы обрабатываем CSV файл со свойствами товаров, который хранит данные по категориям товара и его техническим характеристикам. Все это добавляется к объектам товаров, проходит еще несколько проверок на корректность и полноту данных.

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

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

В данном этапе мы также получаем список всех разделов каталога, проверяем какие есть в системе, каких нет. Отсеиваем некорректные товары. Также получаем список внешних кодов всех загруженных в систему товаров, что дает нам возможность понимать, нужно ли добавлять товар, либо достаточно его обновить.

Говоря о процессе обновления, мы также сократили до минимума количество обращений к базе данных. Мы вытаскиваем информацию по всем товарам и их свойствам используя SQL JOIN’ы, на это уходит всего один запрос. А дальше сравниваем информацию собранную из CSV файлов и информацию, полученную из базы данных. Если информация не отличается, товар не трогаем, а значит и не тревожим лишний раз базу данных.

Загрузка описания товаров

Загрузка описания товаров процесс простой. Разбираем XML файл, все, что нам нужно - это артикул, чтобы понимать к какому товару прикреплять информацию. И непосредственно само описание. Описание добавляется только один раз, при условии, что у товара еще нет описания. Так как сайтов получающих данные много, а пользователи могут захотеть изменить информацию вручную, то мы не обновляем описание каждый раз. Полноценное обновление информации из 1С реализовано только для официального сайта Nordberg.

На данном этапе мы также работаем с собственными SQL запросами, чтобы максимально сэкономить ресурсы. А сэкономили мы их значительно. Все данные экранируются, чтобы ничего лишнего не попало в базу данных.

Загрузка и обновление фотографий

Этот этап был самым интересным, и по нему одному можно написать целую книгу, но мы максимально сократим описание, рассказав о самом главном.

Начнем с истории как мы FTP мучали. Качали мы файлы сначала через FTP, приходилось получать списки директорий, создавать их на сервере, загружать поэтапно в них файлы - очень долго, очень трудно, очень много ресурсов. Потом мы вспомнили о любимом wget. Стандартная UNIX команда wget умеет скачивать что угодно, и при этом быстро. Скачивание файлов стало занимать минуту вместо 20 минут. Директории wget создает сам, поэтому мы удалили кучу старого ненужного кода и выдохнули - жаль, что не придумали это сразу.

После загрузки фотографии необходимо обновлять. Могут появится новые фотографии товаров или старые фотографии могут быть поменяны местами на FTP сервере, это все необходимо учитывать. Изначально мы решили эту задачу чрезмерно просто - удалили все файлы изображений, а потом залили все заново. Задача была решена, фотографии успешно обновлялись, но возникли ужасные последствия.

Во-первых, Битрикс загружает файлы каждый раз по новому пути, а значит роботы Яндекса, Google и других поисковиков каждый раз индексируют новые картинки и начинают реально DDOS’ить сервер, посылая кучу запросов в секунду.

Во-вторых, кэшированные файлы, а также старые файлы могут не удалиться, и место на сервере в итоге закончится. Для понимания - 5000 фоток весят примерно пол гигабайта.

В-третьих, для удаления одного файла и его загрузки на сервер Битрикс использует ни много ни мало 96 запросов. Это 50 000 запросов к базе данных для обновления всех фотографий.

Мы искали решение и нашли. Стали записывать в буфер результат загрузки файлов полученный через wget, далее записывать вывод буфера в файл. После, благодаря другой UNIX команде egrep, мы находили внутри этого файла строки, которые говорили нам, что один или несколько файлов в директории товара (директория равна артикулу) были изменены. Теперь мы собираем в массив только те артикулы товаров, где реально происходили какие-то изменения, и обновляем только их. Фотографии меняются не так часто. Плюс если раньше обновление происходило каждые пол часа, то теперь только один раз в 10 вечера.

Оставалась одна проблема - это 96 запросов на удаление файла из системы, и потом на его загрузку обратно. Долго мы изучали запросы, всю магию, которую Битрикс делал для того, чтобы удалить и загрузить файлы. В итоге, стали удалять и загружать файлы из базы напрямую своим SQL. Теперь на удаление одного файла и его загрузку уходит 5 запросов вместо 96. Это дало большой прирост производительности и стало экономить кучу времени.

Оптимизация базы данных и очистка кэша

Теперь, когда все необходимые данные на сайте, нам осталось сделать всего несколько важных и обязательных операций, где мы уже не стали изобретать свои велосипеды, а использовали стандартный D7 Битрикса.

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

Далее мы обновляем модуль поиска по инфоблоку, ведь товары в поиске не будут доступны сразу. Чтобы пользователь смог секунда-в-секунду воспользоваться поиском — D7 в помощь.

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

Логирование

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

Обновление цен и наличия

Это простейший скрипт:

  • Скачиваем CSV файл номенклатуры;
  • Достаем из файла цены и остатки;
  • Получаем список товаров;
  • Обновляем данные;
  • Чистим кэш.

Скрипт отрабатывает за несколько секунд, запускается через CRON каждые 30 минут.

Заключение

Данная интеграция реально интересная задача. Работы по ней не останавливаются, импорт становится более оптимизированным, чистым, документированным и обрастает все большим количеством проверок, логирования и функциональности. На самом деле объем работ не мал. Описывая детально каждый этап мы могли бы написать целый цикл статей, а возможно даже маленькую книгу. Ежедневно мы получаем сотни отчетов со многих сайтов, где уже работает данная выгрузка, это позволяет улучшать сервис и предоставлять партнерам компании Nordberg лучшие и быстрые выгрузки с актуальной информацией.

0
В избр. Сохранено
Авторизуйтесь
Вход с паролем