Когда стандартный обмен не подходит — поможет XML. Пример из жизни, который показывает, что даже самую плачевную ситуацию можно исправить.Услышал тут от одного знакомого 1С-ника такую вещь: «Да, переписанная необновляемая 1С-ка — это головная боль вечная наша, но есть умельцы, которые как-то распарсивают файлы XML и работают через них...». Приятно было осознать себя умельцем — ведь именно этим мы в «Винтра» и занимаемся )Сейчас расскажу на примере, как это происходит. Задача:Для магазина одежды необходимо импортировать каталог из «1С: Управление Торговлей» так, чтобы карточка товара отражала в себе варианты товара по комбинации параметров «цвет» и «размер».Что имеем: «1С: Управление Торговлей» содержит в себе товары по цветам, и для каждого цвета содержатся предложения по размерам. Никаких характеристик типа цвет и размер нет — они прописаны только в имени товара. Перестраивать базу данных нет возможности. Работаем с тем, что есть. То есть мы хотим видеть на выходе это:Начинаем разбирать файлы, получаемые из «1С».1. Файл import Файл importЧто мы в нем видим? Товары прописаны как «Футболка детская Oversize бежевый», «Футболка детская Oversize белый» и так далее.Для каждого товара в файле есть «Ид» товара, привязка к категории, артикул, картинки, описание.2. Файл offers Файл offersВ данном файле идет перечисление предложений, при этом родительский вариант прописан в одном массиве с его предложениями. Его отличие в том, что его «Ид» не содержит символа # и в названии нет размера. Для его предложений же «Ид» выглядит уже как:ИДродителя#ИДпредложенияА в названии есть указание размера «Футболка детская Oversize бежевый (92-98)».3. Файлы prices и rests стандартные — привязка к конкретному предложению в формате:ИДродителя#ИДпредложенияОбозначим проблемы1. Самая очевидная. Характеристики цвет и размер содержатся в имени товара.2. Цвет не является учетной характеристикой, и в базу данных товары с различными цветами занесены как разные товары-родители. В нашем примере нам необходимо получить структуру вида:—Товар — футболка Предложения:• Товар — футболка. Цвет — белая. Размер — 92–98.• Товар — футболка. Цвет — белая. Размер — 104–110.• ...• Товар — футболка. Цвет — черная. Размер — 92–98.и так далее.А на момент начала работы было так:— Товар — футболка белая. Предложения:• Товар — футболка белая (92-98).• Товар — футболка белая (104-110)....— Товар — футболка, черная. Предложения:• Товар — футболка черная (92-98).• Товар — футболка черная (104-110).Как говорится почувствуйте разницу.3. Картинки, описание товара, артикул привязаны к вариантам товара по цвету.4. Структура категорий в «1С» вообще никак не совпадает с планируемой структурой на сайте. Более того, товары из нескольких категорий 1С в новой структуре будут объединены в одну категорию на сайте.План работСамое важное, что бросается в глаза и с чего мы должны начать — это попытаться вытянуть из названия цвет и размер. Для обработки необходимо что-то, за что можно зацепиться. Решением стало небольшое изменение названия: мы взяли цвет в квадратные скобки. И оно стало таким:Футболка детская Oversize [бежевый] (92-98)Благодаря этому стало точно известно, что в [ ] содержится цвет, а в ( ) указан размер.Для импорта мы используем решение для обработки XML-файлов от Esolutions. Считаем данное решение вершиной эволюции разбора XML. С его помощью, а также благодаря поддержке сверхпониманию задач Дмитрия Кривочурова, разработчика решения, мы можем реализовывать практически любую задумку, главное, обозначить четкую задачу и выстроить логику.Обработка файлов XML и настройка импорта1. Обработка файла import1.1. Обязательно для обработки файла нужно чтобы все товары именовались по формуле:<Наименование>Футболка детская Oversize [серый меланж]</Наименование>В процессе чтения файла в ходе импорта мы преобразуем имя отрезаем цвет [серый меланж] и остается чистое название «Футболка детская Oversize». В файле присутствует несколько вариантов товара:Футболка детская Oversize [серый меланж]Футболка детская Oversize [черный]и так далее. После удаления из имени цвета оно становится одинаковым, и мы склеиваем все эти товары в один.Так мы получаем родительский товар.1.2. Так как склеиваются 4 товара с разными цветами, важно, чтобы имя до цвета было одинаковым. То есть если будет так:Футболка детская Oversize [серый меланж] Детская футболка oversize [черный]то мы получим 2 товара родителя — за этим нужно следить. 1.3. При склеивании товаров с разными цветами, если у какого-то из них описание отсутствует, то обработчик при импорте посчитает, что это поле описания пустое и затрет информацию из него у создаваемого родительского товара. Поэтому мы поставили дополнительную проверку на наполненность поля: пустые — не загружаются, заполненные — импортируются.1.4. Тут же в этом файле мы родительский товар привязываем к его категории по внешнему коду равному «Ид» группы из файла.1.5. Выводы по файлу: обработка файла по сути — это создание общего товара-заглушки с общими свойствами. Например: описание, категория, вес. Сюда же можно добавить производителя, страну изготовления и так далее. Но для этого нужно, чтобы эти свойства сначала были добавлены в «1С» — тогда мы сможем и импортировать.2. Обработка файла offers2.1. По сути в файле offers как раз содержатся уже непосредственно сами товары — то, что можно купить. Единственное, мы имеем в начале каждой группы одинаковых офферов товар-родитель:<Ид>ed6d2b1d-4309-11ed-80e2-00155d01fa02</Ид>Поэтому для обработки мы отбираем офферы, у которых в «Ид» присутствует символ #:<Ид>ed6d2b1d-4309-11ed-80e2-00155d01fa02#f828ea23-4309-11ed-80e2-00155d01fa02</Ид>2.2. Обязательно для обработки файла нужно, чтобы все товары именовались по формуле:<Наименование>Футболка детская Oversize [бежевый] (92-98)</Наименование>Привязка предложений к своему товару-родителю происходит по имени. Здесь мы точно также у каждого торгового предложения вырезаем цвет [бежевый] и размер (92-98). В результате в имени остается только чистое название: «Футболка детская Oversize». Именно так система понимает, что есть товар родитель с именем «Футболка детская Oversize», и к нему привязываются все варианты предложений из файла с именем «Футболка детская Oversize». Важно! Чтобы все варианты не оказались с одинаковым именем после удаления цвета и размера, для каждого торгового предложения мы записываем внешний код:<Ид>ed6d2b1d-4309-11ed-80e2-00155d01fa02#f828ea23-4309-11ed-80e2-00155d01fa02</Ид>То есть «Ид» предложения из файла. По нему дальше мы сможем подгружать цены и остатки для предложения.В результате для товара «Футболка детская Oversize» мы имеем 20 предложений с разными вариантами размера и цвета.2.3. Имя для самого предложения не обрезается: мы грузим имя предложения как в файле. Так легче идентифицировать потом товары их в системе, чтобы не путаться внутри сайта. Да и название приходит в корзину полное: видно, что именно человек выбрал. 2.4. Из названия предложения мы забираем [цвет] и (размер) и загружаем их в специальные свойства. Так для каждого родителя мы можем показать 2 свойства для отбора предложений по цвету и размеру. И при выборе, например, одного цвета размеры подгружаются только доступные для выбранного цвета. 2.5. Так как картинки для белой футболки и черной разные, мы вынуждены прогрузить картинки для каждого из 20 предложений. Использовать выгрузку из «1С» невозможно, поэтому мы импортируем картинки из внешнего хранилища. Здесь главное дать правильное имя картинке. Для этого важно взять «Ид» товара из файла import или первую часть «Ид» до символа # из файла offers.Например, товар <Ид>ed6d2b1d-4309-11ed-80e2-00155d01fa02#f828ea23-4309-11ed-80e2-00155d01fa02</Ид>— это «Футболка детская Oversize [бежевый] (92-98)». Чтобы прогрузить для этого предложения картинки — нам нужно дать им названия:ed6d2b1d-4309-11ed-80e2-00155d01fa02_1.jpged6d2b1d-4309-11ed-80e2-00155d01fa02_2.jpgи так далее.Здесь важно:• сколько картинок будет — столько раз увеличивается порядковый номер после символа «_».• всегда картинка с индексом _1 будет анонсной картинкой, то есть первой в списке картинок товара.Система же настроена таким образом, что она перебирает по маске «_*» все доступные файлы и прогружает их как дополнительные картинки для предложения. Товар-родитель же показывает нам первое фото из относящихся к нему вариантов предложения, поэтому отдельно для него грузить картинку нет необходимости. 2.6. Загружаем штрихкод для каждого предложения. Он уходит в корзину потом и выводится в карточке товара. По нему можно идентифицировать быстро товар. Например, если клиент позвонит и задаст вопрос по товару, он может использовать этот штрихкод как точный уникальный определитель.2.7. Мы можем доработать созданный файл и добавить в него специальное поле. Например, «Выгружать на сайт». Так появляется возможность контролировать, что именно доступно к выгрузке: импортироваться будут только позиции со значением, например, «Да». Иначе мы будем загружать на сайт все, что нам пришло в файле. 2.8. Цены мы обрабатываем по внешнему коду предложения. Берем значение с типом цены:<ИдТипаЦены>dc1df5b0-ec57-11ec-80c1-00155d01fa02</ИдТипаЦены>И загружаем его для каждого предложения как розничную цену. Так, для предложения из файла offers <Ид>ed6d2b1d-4309-11ed-80e2-00155d01fa02#f828ea23-4309-11ed-80e2-00155d01fa02</Ид>есть цена 1800 р. — именно ее мы и загружаем для предложения. В итоге для каждого предложения указывается правильная цена — при переключении цвета в карточке товара цена меняется.В общую карточку товара в списке товаров категории мы грузим сначала самое дешевое предложение и его вариант. Тут мы показываем футболку в цвете «черный», размер 152-158, так как ее цена 1000 р.2.9. Остатки мы обрабатываем по внешнему коду предложения. Сначала добавили склад и присвоили ему внешний код склада: «6c9cef62-9bae-11ed-8d59-00505690b0a2».И для каждого предложения с запись об остатке на складе выглядит так:<Ид>6c9cef62-9bae-11ed-8d59-00505690b0a2</Ид> = 1Также мы установили нужную логику вывода остатков: сделали «в наличии», если больше 0, «нет в наличии» — меньше 1. В результате мы имеем структуру вида:Товар — футболка Предложения:• Товар — футболка. Характеристики: цвет — белый, размер — 92–98. Цена предложения. Остаток на складе 1, остаток на складе 2 и так далее.• Товар — футболка. Характеристики: цвет — белый, размер — 104–110. Цена предложения. Остаток на складе 1, остаток на складе 2 и так далее.• ...• Товар — футболка. Характеристики: цвет — белый, размер — 92–98. Цена предложения. Остаток на складе 1, остаток на складе 2 и так далее.Всего в конкретном примере получилось 20 штук таких товаров, отображающихся на сайте в одной карточке товара-родителя.Немного дополненийИмпорт товаров и предложений оставили в ручном виде. Процесс не быстрый из-за большого числа картинок. Новые модели добавляются не часто, поэтому достаточно ручного режима. Процесс длится 5-10 минут, в течение которого обрабатываются 2000 предложений.А вот обработку файлов prices и rests поставили на cron с обработкой раз в час. Так «1С» отдает нам раз в час нужные файлы. Они содержат только текст, поэтому обрабатываются очень быстро. В результате — на сайте всегда актуальные остатки и цены. Максимальная задержка 2 часа. При необходимости можно уменьшить интервал обработки задания cronом: нужно смотреть по факту.ИтогЛогика + правильный софт — и решение найдется даже в самой плачевной ситуации. Ну что, вы отчаялись из-за того, что ваша 1С-ка не годится для работы с сайтом и использовать стандартную интеграцию нет возможности? Значит, пришла пора обратить внимание на возможное решение — выгрузку с обработкой XML. Ждем ваших примеров и постараемся разобраться в каждом из них.#битрикс #1c #1cбитрикс #1cbitrix #xml #интеграция
Отличное решение. 1с подружить штатно всегда проблемы. Тут же мы можем делать всё что хотим. Универсальный импорт это благо. Но нужно следить за наполнением товаров в 1с
Спасибо большое за такую полезную информацию!
Как удачно я нашел Вас! Обязательно обращусь с данной проблемой.
Подробнее статьи и не встречал! Благодарю. Пригодится.