7 Сентября 2016

Удаление картинок при выгрузке товаров из 1С в Битрикс

Недавно к нам поступил запрос от клиента, который не доволен работой типового обмена, потому что при удалении картинки из 1С, она не удаляется на сайте.

Ну что же, проверим как все работает. Тестировать обмен будем в режиме обмена изменениями.

На стороне сайта:

  • 1С-Битрикс, редакция «Бизнес»;
  • Модуль «Интернет-магазин», версия 16.0.31;
  • Типовое решение от 1С-Битрикс для интернет-магазина.
На стороне 1С:

  • Управление торговлей, редакция 10.3.5.1;
  • Типовой модуль обмена.

Доступа к 1С у нас не было, поэтому мы попросили предоставить две файловые выгрузки обменов:

  • после добавления картинки к товару;
  • после удаления картинки к товару.


Шаг №1: подготовка файлов.

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

Смотрим в import.xml с добавлением картинки.

001.png

«false» - это не то, что нам надо, меняем на «true».

То же самое проделываем с файлом на удаление картинки.


Шаг №2: устанавливаем на сайт скрипт для эмуляции обмена с 1С.

Используем что есть под рукой - вот этот инструмент: https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=42&CHAPTER_ID=04941&LESSON_PATH=3912.4912.4941

Ссылка на архив: http://dev.1c-bitrix.ru/upload/examples/bx_1c_import_last.zip

Распаковываем, и полученный файл bx_1c_import.php загружаем в корень сайта.


Шаг №3: еще немного подготовки

Для чистоты эксперимента находим нашу подопытную товарную позицию и удаляем ее из базы.

002.png

Создаем на сайте две папки для тестирования загрузки

  • /upload/test_1c_upload/with_picture/ - сюда выложим выгрузку с картиной
  • /upload/test_1c_upload/without_picture/ - сюда выложим выгрузку уже без картинки

Еще почистим папку с файлами для обмена заказами. Для этого удаляем все вот тут: /upload/1c_exchange


Шаг №4: первая загрузка – товар с картинкой

Так как скрипт эмуляции обмена не умеет брать файлы из папок кроме /upload/1c_catalog/, то копируем файлы сюда:

003 - копирование файлов в 1c_catalog.png

Включаем наш скрипт /bx_1c_import.php, переходим на вкладку «Импорт файлов 1С» и двойной клик по import.xml

004.png

Скрипт нам говорит об успешной загрузке

005.png

offers.xml грузить не нужно, там ничего про интересующие нас картинки не сказано.

Смотрим в элемент инфоблока соответствующий нашему товару.


Вот что у нас загрузилось:

1. Картинка для анонса загрузилась

009_0.png

2. Детальная картинка загрузилась (такая же как и картинка для анонса)

3. А еще мы видим, что фотография подгрузилась в свойство «PHOTO» (ID «MORE_PHOTO»)

009.png

Вот как эти картинки отображаются в публичном интерфейсе.

На странице карточки товара отображаются картинки, подгруженные именно в свойство «PHOTO». Это множественно свойство, и, если картинок несколько, то все они будут отображены на странице карточки товара. В случае, если в 1С к элементу номенклатуры подгружены несколько товаров, то стандартный обмен загрузит их именно в этой свойство.

Картинка для анонса как и детальная картинка (если они подгружены) отображаются ТОЛЬКО в списке товаров. При этом, если картинка для анонса и детальная картинка не заполнены, то в списке товаров будет отображаться одна из картинок из свойства «PHOTO».


ВЫВОД: Для того, чтобы удалить картинку у товара, не достаточно удалить картинки для анонса и детальную картинку. Необходимо также очистить картинки из свойства «PHOTO» (ID «MORE_PHOTO»).

Проверяем в публичном интерфейсе сайта. Все в порядке, картинка отображается в списке и в карточке товара. Теперь попробуем удалить картинку.


Шаг №5: вторая загрузка – удалили картинку (она была единственная) из товара

Удаляем файлы прежнего обмена из /upload/1c_catalog, копируем содержимое /test_1c_upload/without_picture/.

Проделываем загрузку файлов с помощью скрипта как в п.4.

В админке в списке товаров видим, что время дата и время изменения элемента обновились, значит обмен прошел. Смотрим в элемент инфоблока что изменилось:

  • Детальная картинка удалилась. Порядок.
  • Картина для анонса осталась на месте. Не порядок.
  • Картинка в свойстве «PHOTO» осталась на месте. Не порядок.

Разберемся в чем дело.


Шаг №6: смотрим как устроены файлы выгрузки

В первом файле находим тег «Картинка»:

007.png

А еще в первом файле видим тег «MORE_PHOTO» в блоке свойств товара.

007_1.png

Во втором файле также находим тег «Картинка»:

008.png

Здесь передается закрытый тег «Картинка», и собственно картинки уже нет. При этом загрузка повела себя так, что удалила детальную картинку, а картинку для анонса оставила на месте.

Также в перечне свойств мы уже не видим свойства «PHOTO». Однако картинка в свойстве «PHOTO» инфоблока не была удалена.

Итак, нам нужно добиться двух эффектов:

  1. Необходимо, чтобы удалилась картинка для анонса
  2. Необходимо, чтобы удалилась картинка из свойства «PHOTO»


Шаг №7: настраиваем удаление картинки из анонса

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

Настаиваем наш инфоблок с каталогом товаров на удаление картинки анонса (Инфоблоки – Типы инфоблоков – 1С Каталог – Каталог товаров). Вкладка «Поля», ставим флаг удаления:

010.png

Сохраняем настройки.

Теперь настраиваем интеграцию (Магазин – Настройки – Интеграция с 1С). Вкладка «Каталог», говорим, чтобы настройки изображения обрабатывались по настройкам инфоблока:

011.png

Все настроили. Теперь проделываем загрузку товара с картинкой (п.4) и после этого загрузку без картинки (п.5).

Смотрим в элемент инфоблока что изменилось:

  • Детальной нет, как и в прошлый раз. Порядок.
  • Картина для анонса удалилась! Нужный эффект произошел. Порядок.
  • Картинка в свойстве «PHOTO» осталась на месте. Не порядок.


Шаг №8: придумываем как удалить картинку свойства «PHOTO»

Осталось убрать картинку из дополнительных фотографий. Во втором import.xml нет упоминаний про свойство «PHOTO» и картинка не удаляется.

Подобное поведение мы наблюдали с остатками товара. Когда 1С регистрировала нулевое количество на складах и добавляла товар к обмену. При выгрузке тег «Количество» не записывался в файл обмена и Битрикс на своей стороне не обнулял количество. Одним из вариантов решения было принудительно добавить в выгрузку <Количество>0</Количество>.

Поступим аналогичным образом. Добавим во второй файл запись с тегом «MORE_PHOTO» с пустыми записями. Примерно вот так:

012.png

Пробуем еще раз выгрузить товар. Снова загрузим с картинкой (п.4) и после этого - без картинки (п.5).

Смотрим что изменилось:

  • Детальной нет, как и в прошлый раз. Порядок.
  • Картинки для анонса нет. Порядок.
  • Картинка в свойстве «PHOTO» удалена! Порядок!


Резюме

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

Вот как можно поступить:

  1. Доработать модуль обмена на стороне 1С, чтобы он всегда оставлял в import.xml тег «MORE_PHOTOS», даже в случае удаления картинок
  2. Делать доработку на стороне сайта, чтобы система после загрузки проверяла наличие дополнительных фотографий и делала очистку
  3. Как вариант, вместо удаления картинки на стороне 1С, подгружать однопиксельную белую картинку или «заглушку», тогда визуально это будет равно удалению.

Существуют также особые «продвинутые» версии модулей обмена как для 1С, так и для сайта. Вероятно, с их помощью можно было бы решить эту задачу. Но для этого нужен отдельный тест.

Комментарии0
К этой записи пока нет комментариев. Будьте первым!