• Архив

    «   Август 2018   »
    Пн Вт Ср Чт Пт Сб Вс
        1 2 3 4 5
    6 7 8 9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30 31    

Если несколько узлов обмена 1С УТ импортируют товары в Битрикс одновременно

Когда-то давно я уже писала пост http://dev.1c-bitrix.ru/community/web...blog/6859/ о том, как на стороне сайта разделить одновременные импорты каталога по разным временным таблицам и разным папкам для присылаемых от 1С файлов. В том посте речь шла об импорте данных из разных баз. На одном из проектов вновь пришлось столкнуться с той же самой задачей, но с другого бока: серверная 1С УТ должна была по расписанию вести импорт по нескольким узлам обмена одновременно.

Соответсвенно, встала задача сделать так, чтобы разные узлы обмена передавали скрипту обмена на стороне сайта свой уникальный идентификатор, который и будет служить потом параметром IB_ID (это был не ид инфоблока, а ид информационной базы) кастомизированного компонента из вышеуказанного поста.

Задача решается кастомизацией функции ПолучитьДанныеССервера из битриксовского модуля обмена. Находим место, где посылается http запрос и ожидается ответ и пишем так:

HTTPОтвет = Соединение.Получить(СокрЛП(ПараметрыЗапроса)+"&KodUzla="+формат(Число(ПараметрыОбмена.ссылка.код),"ЧГ=0";), ИмяФайлаОтвета, СокрЛП(Заголовки));

Аналогичное изменение нужно внести и в функцию ПолучитьРезультатОтправкиФайлаНаСервер

Еще раз про импорт каталога из 1С-Битрикс в 1С Предприятие и обратно

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

Итак,
1) В ситуации, когда источником данных о номенклатуре являлся сайт мы оказывались не единожды, и ни разу не было такого, чтобы у товаров на сайте не было каких-то XML_ID Обычно клиенты забивают товары на сайт не вручную, а пользуясь различными импортами, в следствии которых XML_ID - рождается. Так вот, прежде чем импортировать каталог в 1С необходимо убедиться, что все XML_ID товаров и разделов на сайте - уникальны. То есть, если есть раздел с XML_ID, к примеру, "121", то товара с XML_ID "121" уже быть не должно, потому что, когда они придут на сторону 1С - они будут записываться в справочник, а элемент справочника отличается от группы справочника только флажком, и вот такая неуникальность среди кодов разделов и товаров потом приводит к куче скрытых багов - обмен может не ругнуться, если у товара с неуникальным кодом нет картинки.

2) Если мы используем стандартную обработку "Помощник импорта...", нужно помнить, что если не дай бог, в первый раз номенклатура загрузится как-то не так, то нам ее придется помечать на удаление и удалять перед следующим запуском обработки - что может оказаться на большой базе жутким геморроем, Поэтому сначала нужно пробовать на 1м разделе или на небольшом участке (для этого кастомайзим сторону сайта - об этом в моем предыдущем посте есть). Или дописываем сами апдейт полей, которые нужно перезаписать, в функции
НайтиСоздатьНоменклатуру на стороне 1С

Например, так:
Иначе 
Номенклатура=НоменклатураСсылка.ПолучитьОбъект(); 
УстановитьРодителя(Номенклатура, СтрокаТовара.Группы); 
Номенклатура.Записать(); 
КонецЕсли; 
КонецПроцедуры; 

3) Успешно загрузили номенклатуру с сайта в 1С? Радоваться рано. Можно сэмулировать прикольный баг, когда обратный импорт на сайт потрет картинки на сайте. Для этого нужно создать узел полного обмена товарами и сделать полную выгрузку сначала в тестовый инфоблок на сайте, обрадоваться, что все хорошо пришло, скопировать его внешний код во внешний код рабочего инфоблока, снести тестовый и снова выполнить полный обмен. Вуаля - картинок нет. Примерно такая последовательность. А чтобы такого не случилось, при первом импорте в рабочий инфоблок нужно делать принудительную полную выгрузку.

ЧПУ для фильтра: опыт разработки

Наверное, каждому разработчику и владельцу интернет-магазинов, приходилось не раз слышать от SEOшника: «нужно сделать ЧПУ для фильтра, как на розетке, как на розетке, как на розетке...». Не знаю уж, почему именно пресловутая розетка так нравится SEO-специалистам, но спрос породил предложение. Прежде, чем рассказать о нашем опыте реализации ЧПУ для фильтра и о нашем новом модуле под маркетплейс (который сейчас на стадии бета-тестирования), я хотела бы немного рассказать о самой сути задачи.

В чем особенность фильтра «какнарозетке»?
http://rozetka.com.ua/memory-cards/a-...0044/v242/
  1. Имитация статичности динамических страниц, сформированных фильтром. У страниц каталога, к которым применен фильтр — красивые человекопонятные URL-адреса.;
  2. Перелинковка за счет использования ссылок в качестве лейблов чекбоксов фильтра;
  3. Возможность указания отдельного заголовка, мета-описания и ключевых слов для каждой фильтрованной страницы каталога.
Поисковым системам очень нравится такая организация каталога. В индекс попадает бешеное количество (число страниц потенциально равно количеству сочетаний значений свойств раздела без перестановок) перелинкованных друг с другом страниц с уникальным описанием и уникальными метатегами и, как следствие, высокорелевантных низкочастотным поисковым запросам.

Проанализировав работу фильтра на сайте http://rozetka.com.ua/ мы поняли, что, используя мощь движка 1С-Битрикс, мы можем сделать и точно так, и даже красивее (а именно: на розетке количество свойств раздела, для фильтрации по которым организуется ЧПУ — ограниченно небольшим числом, и ЧПУ — не мнемонично — человекопонятным его можно назвать лишь с натяжкой. Мы же нашли решение для неограниченного числа свойств, а так же предусмотрели вариант автоматической генерации метатегов на тот случай, когда контент-менеджер не успевает их придумывать).

Однако в силу различий в архитектуре интернет-магазинов, на которых нам приходилось организовывать подобный фильтр, каждый раз нам приходилось изобретать этот велосипед практически с нуля. Порой мне казалось, что универсальное и одновременно изящное решение данной задачи — невозможно.

К примеру, в интернет-магазине электроники kfk.ru нам пришлось учитывать наличие в системе предсозданных SEO-страниц, на которые пользователь должен был попадать, выбирая определенную комбинацию фильтра.

http://kfk.ru/podborki/sat-50m-koaksi...nyj-kabel/
Сняв же галочку фильтра на такой посадочной странице или выбрав другой фильтр, пользователь должен был попадать обратно — на динамическую страницу каталога.

http://kfk.ru/catalog/kabel-koaksialn...0m-rg_59u/

В интернет-магазинах http://uptosport.ru/ и http://uptodream.ru/ нам пришлось дать контент-менеджерам инструмент для присвоения свойствам и их значениям символьных кодов (они не велись ранее), а так же контролировать их уникальность.

В итоге получились вот такие красивые ЧПУ-ссылки на фильтрованные разделы:

http://uptosport.ru/catalog/dlya_zhen...ue/size=L/

http://uptodream.ru/catalog/dlya_zhen...or=purple/

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

Мы придумали, как расширить выгрузку из 1С УТ для того, чтобы можно было передавать символьные коды свойств и их значений, не нарушая формата CML2 и не ломая налаженный на проектах обмен с 1С. Дополнили выгрузку XML следующим образом:

<Свойство>
<Ид>83875106-f414-11e0-83db-0023ae2ed3a2</Ид>
<Наименование>Цвет</Наименование>
<ТипЗначений>Справочник</ТипЗначений>
<СимвольныйКод>color</СимвольныйКод>
<ВариантыЗначений>
<Справочник>
<ИдЗначения>83875108-f414-11e0-83db-0023ae2ed3a2</ИдЗначения>
<Значение>Красный</Значение>
<СимвольныйКод>red</СимвольныйКод>
</Справочник>
</ВариантыЗначений>
</Свойство>

И, естественно, мы добавили поддержку выгрузки символьного кода свойств и значений свойств в свой модуль интеграцииhttp://marketplace.1c-bitrix.ru/solut...tegraciya/ (выйдет на днях в составе фундаментального обновления 3.0.0).

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

В своем же модуле фильтра «какнарозетке» (мы еще думаем над его официальным названием) мы добавили поддержку своего модуля интеграции. То есть, если в системе будут установлены оба наших модуля — они будут работать совместно, и производительность ЧПУ-фильтра увеличится в разы. Но если в системе будет установлен только наш модуль ЧПУ, он будет выбирать символьные коды свойств из вспомогательного инфоблока или highload-инфоблока-справочника значений каждого конкретного свойства.

Об обновлении нашего модуля интеграции 3.0.0 я напишу в отдельном посте.

Решение - импорт данных из формата YML - доступно в Маркетплейс Битрикс

Решение - импорт данных из формата YML - доступно в Маркетплейс Битрикс

Решение позволяет импортировать в товарные инфоблоки Битрикс данные из файлов YML формата.

Что такое YML формат? Это формат, в котором магазины обычно готовят выгрузку для Яндекс.Маркета. Экспорт в формат YML - есть в стандартной поставке Битрикс Бизнес и Битрикс Малый Бизнес. А вот импорта из данного формата - в стандартной поставке 1С-Битрикс - нет.

С помощью решения для импорта данных из YML в 1С-Битрикс Вы можете:

- наполнить каталог товаров своего интернет-магазина, используя yml-файлы вашего поставщика.

- организовать свой каталог интернет-магазинов - на подобии Яндекс.Маркета.

Решение позволяет регулярно импортировать товары из YML файла в режимах полного обновления или в режиме обновления только цен.

Пользоваться решением - легко:

Видеодемонстрация

Решение в Маркетплейс доступно по адресу: http://marketplace.1c-bitrix.ru/solut...ymlimport/

Интеграция 1С Предприятия и 1С Битрикс: про то, как мы добавили возможность передачи архива по FTP

Работая над одним из проектов, я столкнулась с тем, что когда архив с данными от 1С больше 1,5Г - обмен проходит нестабильно - рвался именно на этапе передачи файла (иногда рвался, а иногда - нет). Возможно, это общая проблема, а возможно – на конкретном сервере, а сервер там солидный. Заказчик же хотел иметь возможность делать полную выгрузку каталога, полная выгрузка представляла собой архив, объемом около 6Г.

Как известно, на третьем шаге стандартного протокола обмена 1С Предприятие по частям посылает Битриксу архив с файлами обмена в виде POST (я рассматриваю наш частный случай – объемный архив).

Я предложила 1С Программисту переписать механизм импорта каталога товаров на его и на моей стороне так, чтобы на 3м шаге обмена 1С Предприятие выкладывало архив на сервер по фтп и просто сообщало сайту об этом. Посовещавшись, решили не заменять способ передачи архива от 1С на сайт, а сделать возможность передавать его как стандартно через http в виде POST, так и посредством ftp. Наш видоизмененный протокол обмена между 1С Предприятием и 1С Битрикс выглядит следующим образом:

Шаг 1 и 2 – такие же, как в стандартном протоколе обмена
Шаг 3:

Вариант 1:
http://<сайт>/bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=<имя файла>&method=http
1С посылает запрос и загружает на сервер файлы обмена в формате CommerceML 2, посылая содержимое файла или его части в виде POST.

Вариант 2:
1C заливает сайт по ftp, а затем посылает сайту запрос:
http://<сайт>/bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=<имя файла>&method=ftp
(тут нужно учесть возможность того, что если 1С не успеет залить архив на сервер за время жизни сессии, то Битрикс уже может разовтаризовать 1С, и тогда перед этим запросом нужно снова авторизоваться, но у нас за время жизни сессии все по ftp залиться успевало, и не стали пока эту возможность учитывать)

В случае успешной записи файла 1С-Битрикс выдает "success".

Шаг 4 – такой же, как в стандартном протоколе.

Таким образом, мы видоизменили только 3й шаг протокола обмена – остальные шаги остались стандартными.

Для того, чтобы реализовать эти изменения на стороне сайта, я сделала в ранее уже кастомизированном компоненте импорта (но конкретно на этом участке его код совпадал со стандартным компонентом) следующее:

В блоке
if(($_GET["mode"] == "file" && $ABS_FILE_NAME) {}
Сразу после коммента //And save it the file

Заменила условие
if($DATA_LEN > 0)
на
if($DATA_LEN > 0 || $_GET["method"]=='ftp')
И все – после этого компонент успешно принимал архив как загруженный кусочками в POST, так и залитый целиком на ftp (при условии, что 1С присылала соответствующий маркер). Возможно, что при этом не все возможные ошибки вылавливаются, но тогда в любом случае возникает ошибка при попытке скрипта распаковать архив, поэтому углубляться не стала.

На тестирование же опять ушло много-много часов. Я уже привыкла, что при кастомизации интеграции основное время нужно закладывать не на написание кода, а на тестирование. Дополнили лог обмена на стороне сайта фиксацией времени прихода запросов от 1С – это помогло следить за синхронностью. Важно, чтобы 1С выжидала, пока весь файл загрузится на ftp, прежде чем посылать сайту очередной запрос.

В итоге проблема заливки выгрузки объемом более 1,5Г была решена.

Как добавить в магазин на Битрикс возможность импорта из нового формата данных

Помогая своим близким друзьям делать интернет магазин, я столкнулась с задачей импорта данных в Битрикс из формата YML (из формата файлов, который обычно применяется для экспорта в Яндекс.Маркет). За деньги, наверное, не согласилась бы писать такой импорт. А по дружбе – святое дело, и я стала копать. И очень интересные вещи накопала, которые, как ни странно, слабо освещены в документации 1С Битрикс.

А вещи элементарные на самом деле. Оказывается, чтобы добавить возможность собственного импорта в магазин на Битрикс, достаточно добавить в директорию

bitrix/php_interface/include/catalog_import

Два файла

имя_нового _импорта_setup.php – с настройками импорта
имя_нового _импорта _run.php – собственно импорт

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

После того, как эти 2 файла добавлены, система САМА добавит новый вид импорта в админку на страницу импорта товаров в магазин (/bitrix/admin/cat_import_setup.php) – пометила на рисунке зеленой стрелочке.

А вот оранжевой стрелочкой я пометила результат своего эксперимента с функцией CCatalogImport::Add Страница с документацией по этой функции пока практически пуста, но, читая код ядра, я поняла, что она применяется для добавления нового профиля для того или иного вида импорта, позволяет добавить его в меню или посадить на крон.
На данный момент мой модуль импорта данных из YML практически готов, и я допиливаю его для публикации в Маркетплейс.