При стандартной интеграции «1С:Управление торговлей» (УТ) с интернет-магазином многие владельцы бизнеса сталкиваются с проблемой: красивые и понятные названия картинок товаров (например, tovar-ochen-horoshiy.jpg) при выгрузке превращаются в громоздкий и непонятный набор символов вида 3dc32dc5bfcb11e8a924c86000020f05_853d9bd7cad743e6b4bc51579d121880.jpg.
С технической точки зрения система делает это умышленно. Платформа 1С использует уникальные идентификаторы (UUID) ноmenклатуры и присоединенных файлов, чтобы гарантировать уникальность имен на сервере и избежать конфликтов (когда у двух разных товаров загружаются изображения с одинаковым именем). Однако с точки зрения поисковой оптимизации (SEO) это серьезный минус. Поисковые системы Яндекс и Google гораздо лучше ранжируют изображения, которые имеют человекопонятные названия (ЧПУ), отражающие суть товара.
В этой статье мы подробно рассмотрим, как решить эту проблему, проанализируем доступные методы и разберем по шагам варианты реализации как на стороне 1С, так и на стороне веб-ресурса.
---
Прежде чем переходить к решению, выясним причину такого поведения программы. По умолчанию в типовом обмене по протоколу CommerceML имя файла формируется по следующему шаблону:
[ИдентификаторТовара]_[ИдентификаторКартинки].jpg
В XML-файле выгрузки (обычно это import.xml) путь к картинке выглядит следующим образом:
<Картинка>import_files/3d/3dc32dc5bfcb11e8a924c86000020f05_853d9bd7cad743e6b4bc51579d121880.jpg</Картинка>
Если мы хотим, чтобы на сайт попадали ЧПУ-имена картинок, нам нужно либо научить 1С выгружать файлы под другими именами, либо настроить CMS-систему сайта так, чтобы она переименовывала их при импорте.
---
Самый надежный способ решить задачу непосредственно в источнике данных — доработать типовой механизм выгрузки 1С. Чтобы база оставалась на поддержке и без проблем обновлялась, мы рекомендуем делать это с помощью расширения конфигурации.
Рассмотрим подробнее логику, которую должен реализовать программист:
ОбменССайтомВыгрузкаСобытий или общем модуле интеграции с интернет-магазином) нужно найти функцию, отвечающую за запись картинки на диск во временную папку экспорта.Проанализируем пример функции транслитерации на языке 1С, которую можно внедрить в расширение:
Функция ТранслитерироватьСтроку(Знач ИсходнаяСтрока) Экспорт
Соответствие = Новый Соответствие;
Соответствие.Вставить("а", "a"); Соответствие.Вставить("б", "b");
Соответствие.Вставить("в", "v"); Соответствие.Вставить("г", "g");
Соответствие.Вставить("д", "d"); Соответствие.Вставить("е", "e");
Соответствие.Вставить("ё", "yo"); Соответствие.Вставить("ж", "zh");
Соответствие.Вставить("з", "z"); Соответствие.Вставить("и", "i");
Соответствие.Вставить("й", "y"); Соответствие.Вставить("к", "k");
Соответствие.Вставить("л", "l"); Соответствие.Вставить("м", "m");
Соответствие.Вставить("н", "n"); Соответствие.Вставить("о", "o");
Соответствие.Вставить("п", "p"); Соответствие.Вставить("р", "r");
Соответствие.Вставить("с", "s"); Соответствие.Вставить("т", "t");
Соответствие.Вставить("у", "u"); Соответствие.Вставить("ф", "f");
Соответствие.Вставить("х", "kh"); Соответствие.Вставить("ц", "ts");
Соответствие.Вставить("ч", "ch"); Соответствие.Вставить("ш", "sh");
Соответствие.Вставить("щ", "shch"); Соответствие.Вставить("ъ", "");
Соответствие.Вставить("ы", "y"); Соответствие.Вставить("ь", "");
Соответствие.Вставить("э", "e"); Соответствие.Вставить("ю", "yu");
Соответствие.Вставить("я", "ya");
Результат = "";
Для Индекс = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Символ = НРег(Сред(ИсходнаяСтрока, Индекс, 1));
НайденныйСимвол = Соответствие.Получить(Символ);
Если НайденныйСимвол <> Неопределено Тогда
Результат = Результат + НайденныйСимвол;
ИначеЕсли Найти("abcdefghijklmnopqrstuvwxyz0123456789-_", Символ) > 0 Тогда
Результат = Результат + Символ;
ИначеЕсли Символ = " " Тогда
Результат = Результат + "-"; // Заменяем пробелы на дефисы
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
При записи файла картинки в процедуре экспорта мы вызываем данную функцию. Например, новое имя файла будет формироваться так:
НовоеИмяФайла = ТранслитерироватьСтроку(НоменклатураСсылка.Артикул + "-" + НоменклатураСсылка.Наименование);
Важный нюанс: если у одного товара прикреплено несколько фотографий, алгоритм должен добавлять к имени порядковый индекс (например, tovar-1.jpg, tovar-2.jpg), иначе последующие фотографии будут перезаписывать первую.
---
Если вы не хотите привлекать программиста для написания кода с нуля, обратите внимание на готовые решения. Существуют специализированные внешние обработки и расширения для «1С:Управление торговлей» (например, модули от разработчиков готовых интеграций, шаблоны на профильных ресурсах вроде Инфостарт).
Такие модули часто содержат встроенный функционал для генерации SEO-имен файлов прямо «из коробки». Они позволяют:
[Артикул]_[Производитель]).---
Довольно часто переписывать логику выгрузки внутри 1С оказывается трудозатратно или нежелательно из-за частых обновлений программы. В этом случае задачу можно решить непосредственно на стороне сайта. Рассмотрим два основных способа.
Способ А. Включение стандартной опции сохранения оригинальных имен
Если ваша CMS — 1С-Битрикс, в ней предусмотрена штатная настройка. Проследуем по шагам в административной панели сайта:
Обратите внимание: эта опция сработает только в том случае, если 1С передает исходное наименование файла в метаданных XML-пакета выгрузки. Если модуль обмена передает картинку строго как UUID, этот способ не поможет.
Способ Б. Написание скрипта-обработчика события после импорта
Поскольку веб-сайт хранит связь между ID товара и его картинками в своей базе данных (например, в таблицах инфоблоков), физическое имя файла на хостинге можно безопасно изменить. Веб-разработчик может написать PHP-скрипт, который будет запускаться автоматически сразу после завершения импорта каталога из 1С.
Логика работы скрипта выглядит следующим образом:
/upload/iblock/...).Этот метод считается одним из самых безопасных, так как система 1С работает в своем штатном режиме, а вся тяжелая работа по оптимизации ложится на веб-сервер.
---
Подведем итоги нашего анализа: