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