Связка конфигурации 1С:Управление нашей фирмой (УНФ) и интернет-магазина на платформе OpenCart — одно из самых популярных решений для автоматизации торговли. Однако в процессе эксплуатации интеграции пользователи часто сталкиваются с неочевидными техническими проблемами. Периодический автообмен может внезапно перестать работать «по расписанию», а повторно загруженные оптимизированные фотографии товаров почему-то упорно выгружаются на сайт в своем исходном «тяжелом» разрешении, забивая дисковое пространство хостинга.
В этой статье мы подробно разберем причины возникновения этих сбоев и пошагово решим каждую из проблем: настроим стабильный регламентный обмен, очистим скрытые кэши картинок в 1С и на сайте, полностью удалим ненужные медиафайлы из базы данных и разберемся, как заставить систему выгружать изображения с понятными именами по артикулу вместо длинных системных кодов GUID.
Проанализируем ситуацию по каждой проблеме отдельно.
Если ручной запуск синхронизации в 1С проходит успешно, но настроенный автообмен срабатывает нестабильно (через раз или полностью прекращает работу), первоочередно выясним режим работы нашей информационной базы. В зависимости от того, файловая это база или клиент-серверная, механизмы запуска регламентных заданий принципиально различаются.
Рассмотрим основные причины сбоя регламентного задания обмена в файловом режиме:
default.vrd, который находится в каталоге публикации на веб-сервере. В нем обязательно должен быть взведен параметр allowexecutescheduledjobs="true".Посмотрим на пример правильной структуры файла default.vrd для IIS или Apache:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/UNF_Exchange"
ib="File="C:\1C_Bases\UNF";"
allowexecutescheduledjobs="true">
<ws>
<point name="Exchange" alias="exchange.1cws" enable="true"/>
</ws>
</point>
Если параметр allowexecutescheduledjobs установлен в значение false или вовсе отсутствует, веб-сервер будет игнорировать запуск расписания фоновых задач.
Вторая сторона медали — это тайм-ауты и ограничения со стороны хостинга OpenCart. Процесс передачи номенклатуры и картинок из 1С может занимать длительное время. Если сервер хостинга обрывает соединение до завершения транзакции, 1С выдает ошибку обмена, и расписание сбивается. Совместно с веб-мастером вашего сайта проанализируйте настройки веб-сервера и PHP на хостинге. Необходимо увеличить следующие лимиты в файле php.ini или настройках панели управления хостингом:
max_execution_time — установите не менее 300 (а лучше 600) секунд. Это время, в течение которого скрипт импорта на сайте имеет право обрабатывать пакет данных от 1С.memory_limit — выделите скрипту минимум 256 МБ (оптимально — 512 МБ) оперативной памяти. Обработка изображений библиотеками хостинга требует больших ресурсов.post_max_size и upload_max_filesize — установите лимит в 64 МБ или 128 МБ, чтобы сайт мог безболезненно принимать тяжелые пакеты обмена с картинками.Это крайне распространенная проблема. Вы уменьшили исходные файлы изображений (например, с 8 МБ до 60 КБ), перезагрузили их в карточки товаров в 1С, но при выполнении синхронизации сайт по-прежнему сообщает о загрузке огромных файлов. Выясним, почему так происходит.
Дело в многоуровневом кэшировании и особенностях работы планов обмена 1С:
import.xml, offers.xml и папка import_files) 1С собирает выгружаемые картинки во временную папку операционной системы текущего пользователя (обычно это %USERPROFILE%\AppData\Local\Temp). Если имена файлов не меняются, алгоритм выгрузки может посчитать, что файлы в папке временных файлов актуальны, и отправить старые закэшированные тяжелые версии картинок на сайт вместо обращения к обновленной базе данных. Очистите папку Temp на компьютере, с которого запускается обмен.image/catalog/, а для отображения на страницах сайта создаются уменьшенные копии в папке image/cache/. Если вы заменили изображение в 1С, но имя файла (его GUID-идентификатор) осталось прежним, OpenCart при импорте может пропустить перезапись файла, посчитав его уже загруженным, либо продолжит отдавать пользователям старую картинку из папки cache. После обновления картинок в 1С обязательно очищайте кэш изображений в панели администрирования OpenCart или вручную удаляйте содержимое папки image/cache/ через FTP/файловый менеджер хостинга.Просто очистить поле картинки в карточке номенклатуры в «1С:УНФ» недостаточно. База данных устроена так, что все файлы хранятся в подчиненном справочнике присоединенных файлов. Сами файлы физически остаются в таблицах базы данных, увеличивая её размер и продолжая выгружаться при сбоях алгоритмов обмена.
Рассмотрим по шагам, как полностью очистить базу 1С от загруженных ранее картинок товаров без остатка:
Для начала нам нужно убрать ссылки на основные изображения в самих товарах. Воспользуемся встроенным инструментом «Групповое изменение реквизитов»:
Номенклатура.Файл картинки (или Основное изображение) и установим для него галочку изменения, оставив значение пустым (будет установлена «Пустая ссылка»).Сами файлы всё еще хранятся в системе как самостоятельные объекты. Теперь пометим их на удаление:
Присоединенные файлы (Номенклатура) (в метаданных он называется НоменклатураПрисоединенныеФайлы).Пометка удаления.Завершим очистку удалением объектов из базы данных:
1Cv8.1CD на диске после этого шага не уменьшится автоматически. Чтобы освободить место на жестком диске компьютера, запустите конфигуратор, перейдите в меню Администрирование — Тестирование и исправление, отметьте пункт Сжатие таблиц информационной базы и выполните процедуру. Для клиент-серверной базы потребуется выполнить операцию «Shrink» (сжатие базы данных) средствами вашей СУБД (MS SQL Server, PostgreSQL).Для программистов и опытных администраторов приведем пример кода на встроенном языке 1С, который позволяет быстро автоматизировать процедуру отвязки и пометки на удаление всех присоединенных файлов картинок для выбранного списка номенклатуры:
ВыборкаНоменклатуры = Справочники.Номенклатура.Выбрать();
Пока ВыборкаНоменклатуры.Следующий() Цикл
// Проверим наличие основной картинки
Если ЗначениеЗаполнено(ВыборкаНоменклатуры.ФайлКартинки) Тогда
ОбъектНоменклатуры = ВыборкаНоменклатуры.ПолучитьОбъект();
СтараяКартинка = ОбъектНоменклатуры.ФайлКартинки;
// Отвязываем изображение от карточки товара
ОбъектНоменклатуры.ФайлКартинки = Справочники.НоменклатураПрисоединенныеФайлы.ПустаяСсылка();
ОбъектНоменклатуры.Записать();
// Помечаем файл на удаление в подчиненном справочнике
ОбъектФайла = СтараяКартинка.ПолучитьОбъект();
Если Не ОбъектФайла.ПометкаУдаления Тогда
ОбъектФайла.УстановитьПометкуУдаления(Истина);
ОбъектФайла.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
По умолчанию типовые механизмы выгрузки 1С используют международный стандарт CommerceML. Согласно этому стандарту, файлы картинок при передаче переименовываются в уникальные GUID-идентификаторы (например, import_files/3a/3a12b45c-d78e-11ef-80f2-00155d012345.jpg). Это гарантирует отсутствие конфликтов имен на сервере, но крайне неудобно для SEO-оптимизации сайта (поисковые роботы любят осмысленные названия изображений) и ручной работы с файлами на хостинге.
Проанализируем варианты решения этой задачи:
Вместо того чтобы переписывать закрытый программный код выгрузки внутри платформы 1С, правильнее и безопаснее решить эту проблему на стороне сайта. Современные модули обмена для OpenCart (например, популярные модули от NeoSeo, Elit-Board или «Обмен 1С предпритиями» от разработчиков OpenCart) имеют встроенный функционал SEO-транслитерации.
Вам необходимо зайти в настройки модуля обмена на стороне CMS OpenCart, найти вкладку «Изображения» или «SEO» и активировать опцию «Переименовывать файлы изображений при импорте». В качестве шаблона переименования выберите [артикул] или [название_товара_транслит]. При получении пакета CommerceML от 1С модуль сайта сам переименует файлы на диске хостинга и правильно привяжет их в базе данных MySQL сайта. Исходная база 1С при этом останется типовой и обновляемой.
Если вам принципиально нужно формировать файлы с именами-артикулами непосредственно на этапе выгрузки из 1С, потребуется внести изменения в конфигурацию. Лучше всего сделать это с помощью механизма Расширений конфигурации, чтобы не снимать базу с поддержки.
В коде модуля выгрузки (за формирование имен файлов отвечает модуль ОбменССайтамиВыгрузкаОбъектов) необходимо переопределить функцию генерации имени присоединенного файла. Вместо вызова УникальныйИдентификатор() система должна обращаться к реквизиту Артикул владельца файла (Номенклатуры) и очищать полученную строку от символов, запрещенных в именах файлов операционных систем (таких как слэши, двоеточия и кавычки).
Совместная последовательная настройка этих параметров позволит вам добиться полностью стабильного автоматического обмена между 1С:УНФ и сайтом на OpenCart, минимизировать нагрузку на хостинг и оптимизировать изображения под требования поисковых систем.