Здравствуйте, коллеги. Хочу поделиться опытом интеграции магазина с УТ (10.3) с использованием импорта каталога в УТ из магазина (недавний функционал, описанный в статье http://1c.1c-bitrix.ru/blog/blog1c/catalog_import.php). Это не подробный мануал, а только лишь попытка указать на принципиальные проблемы, с которыми пришлось столкнуться.
Итак, имеем интернет-магазин белья с заполненным каталогом. Товары имеют SKU, достаточно много SKU (штук по 60 на товар). Решаем в 1С иметь дело только с учетной информацией (названия, артикулы, цены, остатки, ну и основные картинки товаров, для красоты), свойства оставляем только на сайте.
Итак, делаем новую базу УТ, ставим дополнение от Битрикса. Находим обработку "Помощник импорта товаров с сайта...", запускаем. В настройках снимаем флаг "Создавать свойства товаров" (остальные флаги ставим), стартуем импорт, и...
Проблема первая. При загрузке товаров в базу сразу получаем от 1С синтаксическую ошибку:
Код
{Обработка.РИ_ПомощникИмпортаТоваровБитрикс.МодульОбъекта(1483)}: Ошибка при вызове метода контекста (Записать)
Зап.Записать();
по причине:
Запись не верна! Значение поля "Объект" не может быть пустым!: ЗначенияСвойствОбъектов: , (Регистр сведений: Значения свойств объектов)
Хм. Лезем в конфигуратор, выясняем, что перед "Зап.Записать()" вызывается метод "Зап.Прочитать()", который и очищает все, что можно было записать. В дебри не лезем, ремим этот "Зап.Прочитать()", обновляем базу, снова запускаем процесс. Ура! Все выгрузилось! Каталог товаров на месте, SKU на месте, цены есть. Соответствия кодов товаров и SKU проставлены - красота. Конечно, неправильно просто заремить строчку, не разобравшись в логике, но поскольку результат нас устраивает, закрываем на это глаза.
Имеем право думать, что теперь стандартный обмен с 1С взлетит по щелчку пальцев - нам ведь ничего хитрого не надо - цены и остатки. Соответствия у товаров есть, чего еще желать? К делу: приходуем тестовый товар на склад, меняем цену, заодно корректируем название, запускаем обмен. Смотрим результат...
Проблема вторая. Создались новые инфоблоки для товаров и SKU, и все выгружено в них. Ёксель. Вот тебе и соответствия. Ок, прописываем внешние коды в нужные инфоблоки вручную — несложно, но как-то неприятно в контексте того, что каталог был выгружен с сайта. Следующий запуск обмена. Ага, наименование товара поменялось, хорошо, а что это в "торговых предложениях"?..
Проблема третья. Торговые предложения создались заново, что категорически неприемлемо, поскольку в созданных ранее предложениях есть важные для работы магазина свойства. Кроме того, названия этих новых SKU не такие, как должны быть, а составные - имя товара, а в скобочках имя SKU. Полная самодеятельность, короче. Разбираемся, почему SKU создались заново. В 1С, в регистре сведений "Идентификаторы характеристик номенклатуры CMS 1С-Битрикс", значения внешних кодов стоят правильные, такие же, как у старых SKU. Ну-ка, а у созданнных после обмена SKU? А У ЭТИХ ДРУГИЕ ВНЕШНИЕ КОДЫ! Составные: код товара#код предложения... И эти коды есть в xml-файле выгрузки, т.е. они сгенерированы в 1С. Идем в 1С, открываем модуль обработки "ОбменССайтом", и в процедуре РИ_ЗаполнитьСписокЗначенийПредложения меняем строчку
Код
Наименование = Наименование + " (" + Выборка.ХарактеристикаНаименование + "";
на
Код
Наименование = Выборка.ХарактеристикаНаименование;
Проблема с названиями решена. Теперь кажется логичным в этой же процедуре подкорректировать строку
Код
Ид = Ид + "#" + ИдХарактеристики;
Кажется ведь, что если так сделать, то внешние коды у выгруженных SKU будут правильными, и выгрузка пройдет нормально.. Но нет, внешние коды в xml-файле будут правильными, но на сайт изменения не загрузятся - такой составной код используется при поиске нужного SKU в коде импорта. Так что единственный выход - корректировать внешние коды SKU на сайте. Дела-то: написать скрипт, который заменит текущие XML_ID SKU на составные. И тут, случайно, взгляд падает на
Четвертую проблему. XML_ID не уникальны. Т.е. по умолчанию при создании, например, SKU, оно получает XML_ID, равный ID. Но если вы копируете SKU (а я думаю, многие так делают, это удобно), то XML_ID тоже копируется. Соответственно, это рубит на корню всю идею такого обмена. Значит ПЕРЕД ВЫГРУЗКОЙ КАТАЛОГА В 1С необходимо пробежаться скриптом, поменять XML_ID элементов на ID (и предусмотреть такую замену в обработчике события добавления элемента).
Дальше рассказывать нечего, все выгрузилось, все загружается (тьфу-тьфу)).
Резюме. Схема, при которой каталог с SKU велся на сайте, вы его выгружаете в 1С и имеете корректно действующий обмен, работать без доработки НЕ БУДЕТ. Необходимо: 1. Перед выгрузкой каталога в УТ, убедиться, что XML_ID товаров и SKU уникальны и будут оставаться уникальными. 2. После выгрузки каталога в УТ необходимо поменять XML_ID торговых предложений на сайте (на составные "кодТовара#кодПредложения" ;) , чтобы при дальнейшем обмене срабатывало соответствие. 3. Если вас не устраивает, что названия SKU после загрузки из 1С изменятся, то нужно поправить строчку в процедуре РИ_ЗаполнитьСписокЗначенийПредложения. 4. Вручную указать внешние коды инфоблоков
1. Известна. В каких то версиях модуля поправлено. 3 . Если оставить только наименование, то может быть путаница на сайте. 4. Да, XML ID должен быть уникальный. 2. Не понял о чем это.