• Архив

    «   Апрель 2019   »
    Пн Вт Ср Чт Пт Сб Вс
    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          

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

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

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

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

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

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

Интеграция 1С-Битрикс и 1С Предприятия УТ – о фильтрации импорта по сегментам номенклатуры

Недавно столкнулась с интересным и необычным вариантом организации номенклатурного учета в 1С Предприятии УТ. Необычным, но допустимым в системе и абсолютно корректным.

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



Импортировать же товар в интернет-магазин было решено именно в разрезе коллекций. На стороне 1С Предприятия коллекции были реализованы, как сегменты номенклатуры. Сегмент номенклатуры в 1С УТ – это по сути результат работы отбора по номенклатуре, который возможен, как по реквизитам номенклатуры, так и по реквизитам характеристик. На рисунке ниже - пример содержимого сегмента, сформированного с отбором по реквизиту характеристики.



Модуль же обмена УТ, как стандартный, так и из битриксовского дополнения оказался не приспособленным к импорту в интернет-магазин товара, учтенного таким способом.



Фильтрация выгрузки по сегментам – предусмотрена в модуле импорта, но не учитывает того, что у сегмента бывает отбор по реквизиту характеристики. В оригинальном варианте модуля импорта (Управление торговлей, редакция 11.1 (11.1.9.70), версия модуля 4.0.5.2) при фильтрации по такому сегменту выбиралась та номенклатура, которая нужна, но выгружались все ее характеристики, а не только те, реквизиты которых соответствовали настройкам отбора сегмента.

Поэтому я решила кастомизировать битриксовский модуль обмена на стороне 1С.

Очевидным и самым простым вариантом решения данной задачи было бы исправление запроса на выборку номенклатуры с характеристиками в функции СформироватьВременныеТаблицыПоИнформацииОТоварахПакет. Но я посмотрела-посмотрела на этот километровый запрос, и поняла, что вклиниваться в него боюсь, тем более, что данный запрос битриксоиды видоизменяют с выходом новых обновлений версий УТ и модуля обмена, и поддерживать каждый раз его модификацию было бы для меня слишком трудоемко. (А вот если бы сами битриксоиды допилили его – было бы круто).

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

ИспользуетсяОтборПоСегментуНоменклатуры = Ложь;
Отбор = КомпоновщикНастроек.Настройки.Отбор;
ПолеСегмент = Новый ПолеКомпоновкиДанных("СегментНоменклатуры" );

Для Каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ЭлементОтбора.ЛевоеЗначение = ПолеСегмент Тогда
Если ЭлементОтбора.Использование Тогда
СсылкаСегмент=ЭлементОтбора.ПравоеЗначение.Ссылка;
КодСегмента=ЭлементОтбора.ПравоеЗначение.Код;
НаименованиеСегмента=ЭлементОтбора.ПравоеЗначение.Наименование;
ИспользуетсяОтборПоСегментуНоменклатуры = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Затем я выбрала номенклатуру и характеристики сегмента во вспомогательную таблицу значений, воспользовавшись функцией из ядра УТ.

ТнзСегмента=СегментыСервер.ТаблицаЗначений(СсылкаСегмент);

После этого я нашла пересечение этих двух таблиц, воспользовавшись функцией от сюда>>

Спасибо 1С-нику Кириллову Роману (его можно найти на 1clancer.ru, и он там, кстати, №1) за консультацию по этому вопросу.

ТнзСегмента=СегментыСервер.ТаблицаЗначений(СсылкаСегмент);
КолонкиДляСравнения= Новый ТаблицаЗначений;
КолонкиДляСравнения.Колонки.Добавить("Колонки1" );
КолонкиДляСравнения.Колонки.Добавить("Колонки2" );
Стр=КолонкиДляСравнения.Добавить();
Стр.Колонки1="Номенклатура";
Стр.Колонки2="Номенклатура";
Стр=КолонкиДляСравнения.Добавить();
Стр.Колонки1="Характеристика";
Стр.Колонки2="Характеристика";
ТзнПредложений=СравнитьДанные(ТзнПредложений,ТнзСегмента,КолонкиДляСравнения,Ложь);
И импорт заработал так, как нужно было на данном проекте, кстати, он в такой модификации – абсолютно универсален для фильтрации по какому угодно сегменту.


Как сделать, чтобы импорт каталога из 1С Предприятия в Битрикс шел «туда» (в нужный инфоблок)

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



1) Идем в настройки – Настройки модулей – Информационные блоки и включаем галочку
«Показывать код загрузки из внешних источников»



2) Далее идем в Магазин – Интеграция с 1С
На самой первой вкладке если тип инфоблока не выбран, выбираем тип инфоблока catalog



3) Удаляем новый инфоблок и новый тип инфоблока и запускаем импорт из 1С по-новой.



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



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



Осталось разобраться с ценой. Если это малый бизнес, то открываем файл обмена сохраненный в логах, ищем там внешний код цены и вписываем его во внешний код единственной цены в битриксе.

6) Снова удаляем новый инфоблок, запускаем импорт заново – наслаждаемся попаданием импорта «туда»



7) После этого в настройках каталога в публичной части сайта нужно вывести нужные свойства, перевыбрать тип цены, настроить, какие свойства должны отображаться в умном фильтре а какие – на детальной странице.

P/S: в редких случаях, если не применяются типовые решения из маркетплейс или если публичка сайта еще не разработана и инфоблок товаров - по сути пустой и вам все равно, какое свойство, куда попадает, можно направить выгрузку сразу в нужный инфоблок (и если из 1С импортируется только 1 каталог в 1 инфоблок) (для реальных и серьезных проектов я это делать не рекомендую, но все же):

В поле внешнего кода нужного инфоблока пишем FUTURE-1C-CATALOG и при первой же выгрузке из 1С все товары попадут в него.
В ИБ товарных предложений в поле внешнего кода пишем FUTURE-1C-OFFERS и товарные предложения - пойдут в него.

Еще раз про импорт каталога из 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С? Радоваться рано. Можно сэмулировать прикольный баг, когда обратный импорт на сайт потрет картинки на сайте. Для этого нужно создать узел полного обмена товарами и сделать полную выгрузку сначала в тестовый инфоблок на сайте, обрадоваться, что все хорошо пришло, скопировать его внешний код во внешний код рабочего инфоблока, снести тестовый и снова выполнить полный обмен. Вуаля - картинок нет. Примерно такая последовательность. А чтобы такого не случилось, при первом импорте в рабочий инфоблок нужно делать принудительную полную выгрузку.

Интеграция 1С Предприятия и 1С-Битрикс на новой версии модуля обмена – из опыта

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

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

Когда Битриксоиды выпустили новый модуль, некоторое время я присматривалась к нему, но не хотела внедрять – опасалась.

А потом летом случилось страшное - в какой-то момент мои шустрые сотрудники закончили все проекты и 3 дня сидели без дела. Дело то я им, конечно, нашла – обновили наши модули в маркете, но страх повторения этого апокалипсиса – остался. В тот момент я придумала акцию «интеграция в подарок» за покупку у меня лицензии на Битрикс Бизнес или за заключение со мной договора техподдержки на год. Акцию публиковала в разделе партнерских акций на сайте Битрикса, и она выстрелила – до сих пор слышу эхо.

Прикол был в том, что в период действия акции ею воспользовались всего 2 клиента, но потом еще долгое время клиенты приходили ко мне и говорили, что видели акцию и, хотя не успели ею воспользоваться, – решили все равно обратиться ко мне. В итоге в июле и августе на наши плечи свалилось порядка 10 интеграций. Большинство кейсов были типовыми и скучными, однако попались и интересные сложные задачи.

Передо мной встал сложный выбор – интегрировать новых сложных клиентов своим старым способом или внедрять им новый модуль обмена. К слову, новый модуль обмена на 80% покрывает те задачки, к-е раньше мы допиливали клиентам, как нестандартные. Посмотрела я на него и на наши обработки и подумала, что развивать свой модуль на стороне 1с, пытаясь угнаться за Битриксоидами – будет не выгодно. К тому же я вступила во взаимовыгодное партнерство с фирмой, к-я предоставляет 1С Предприятие в качестве «аренды приложения» и я хотела максимально упростить наше взаимодействие и конфигурирование 1с-ки клиентов.
Этот же фактор заставил меня глубже разобраться в коде конфигурации 1С УТ, и я, как обычно, переосмыслила все на новом уровне. (Кстати, у меня в команде теперь есть совершенно отдельный человечек, который занимается исключительно начальными настройками 1С УТ под разные особенности учета и документооборота).

Итак я начала внедрять новый модуль обмена, устанавливая клиентам 1С Предприятие 8.3.5, 1С УТ 11.1.6, накатывала на 1С УТ свежую версию Битриксовского дополнения, и брали свежий на момент начала работ Битрикс. Кстати, версия Битрикс была один из камушков. С него и начну.

1) Соответствие версий обмена на стороне 1С Битрикс и на стороне 1С Предприятия

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

Настройки -> Инструменты - > Команда PHP строка
COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y" ;
COption::SetOptionString("sale", "secure_1c_exchange", "N" ;

И включится поддержка старой версии протокола.

2) Экспорт в 1С большого объема товаров
На одном из проектов мне нужно было выгрузить с сайта в 1С порядка 40 000 номенклатурынх позиций с картинками. Обработка «Помощник импорта» выполняла эту операцию ужасно долго – больше суток, что было непреемлемо для меня, и я переписала в ней некоторые места – вынесла запросы к базе из цикла. Об этом я писала отдельный пост. Битриксоиды обещали оптимизировать обработку в обновлениях.

3) Обратный импорт и дерево групп
На проекте того же самого клиента, когда мы стали делать интеграцию в обратную сторону у нас сложилась очень специфичная ситуация.

Изначально структура каталога была создана на сайте – не на битриксовском сайте, а на другом старом сайте заказчика на OpenCart. Залили каталог в Битрикс. (используя, кстати, наш модуль импорта из yml и модуль экспорта в yml из опенкарт, к-й я написла на базе одного из бесплатных и дарю теперь тем, кто покупает мой модуль импорта из yml в Битрикс и хочет забрать товары из магазина на OpenCart)

Залили каталог в 1С – все получилось просто отлично – группам товаров был присвоен код, к-й соответствовал внешнему коду разделов XML_ID на стороне Битрикс. Договорились с заказчиком, что далее наполняем каталог и редактируем его структуру на стороне 1С. Выполнили обратный импорт каталога, чтобы убедиться, что все ок, настроили обмен ценами и остатками, протестировали. Затем заказчик сказал, что структура каталога на сайте и в 1С – будет разной. В новом модуле обмена – можно настраивать дерево групп – и такая задача теперь вообще не проблема. Однако выяснился интересный факт – это скорее фича, а не баг, но она меня сильно смутила по-началу. Когда я на стороне 1С настроила дерево групп, я думала, что после обмена они – группы, к-е уже были импортированны на сайт до настройки дерева – возьмут и сами в соответствии с этим деревом перестроятся. Однако начали создаваться новые группы с новыми XML_ID. И это пришлось учесть.

4) Мелкие неприятности на стороне 1С
Трем клиентам внедряли 1С УТ с нуля (+ интегрировали с Битрикс конечно же). Кейсы были идентичными, и делали фактически параллельно. Я сделала одному клиенту, протестила и посадила помощницу все сделать точно так же на 2х других проектах. Начинаю тестировать – на 2х других проектах не работают стандартные отчеты. Вылетает ошибка

Индексируемые поля должны присутствовать в списке выборки
<>Сегменты.Номенклатура

Начинаю внутренне закипать и перебирать в уме все известные мне бранные выражения. Вслух молчу – проверяю. Вроде все одинаково. Разница оказалась в версиях платформы. Там, где все работало ок, версия стояла 8.3.5.1068, а там, где вылетала ошибка – стояла версия платформы 8.3.5.1119, конфигурация стояла одна и та же 1С УТ 11.1.6.26 Проблему решило включение режима совместимости с версией 8.3.4 А при установке дополнения я его обычно совсем выключала - а надо было, видимо, ставить 8.3.4 Хотя на более низких версиях платформы - в частности на 8.3.5.1068 все было ок с отключенным режимом совместимости, а я уже думала, что съем кого-нибудь.

5) Соответствия служб доставок и контрагентов – грузоперевозчиков
Эта задача у нас была неплохо и удобно решена на старом модуле, но к новому модулю старое решение не подходило совсем. На новом модуле я решила задачу с минимальной модификацией модуля обмена заказами, а именно процедуры "СоздатьОбновитьЗаказ".

Дописала там, где шло заполнение свойств заказа, возможно, не очень оптимально.
СпособДоставки = ПолучитьЗначениеРеквизитаДокумента(ДокументXML.ЗначенияРеквизитов, "Способ доставки";);
АдресДоставик= ПолучитьЗначениеРеквизитаДокумента(ДокументXML.ЗначенияРеквизитов, "Адрес доставки";);

//Получаем соответсвия доставок из наших доп настроек:
КлючОбъекта = "Бедросова";
КлючНастроек = "ОбменССайтомБедросова";
//ИмяПользователя = ИмяПользователя();
ИмяПользователя = "SHARE";
СтруктураНастроек = Новый Структура();
Попытка
СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта,КлючНастроек,,ИмяПользователя);
Исключение
Сообщить("Нет прав на чтение доп настроек обмена.";);
КонецПопытки;
Если СтруктураНастроек = Неопределено Тогда
Сообщить("Не вышло прочитать доп настройки обмена!";);
Иначе
НайденнаяСтрока = СтруктураНастроек.СоответствиеСпособовДоставки.Найти(СпособДоставки, "НаСайте";);
Если НЕ НайденнаяСтрока = Неопределено Тогда
Заказ.СпособДоставки = НайденнаяСтрока.НаСервере;
Заказ.ПеревозчикПартнер = НайденнаяСтрока.Контрагент;
КонецЕсли;
КонецЕсли
А дополнительные настройки - оставила во внешней обработке - так же, как описывала раньше.




6) Корректная передача валюты в заказах
Делая одному из клиентов обмен заказами, столкнулась с такой проблемой: Обмен сам-по себе - проходит нормально, но затем заказу, пришедшему с сайта не удается изменить статус - выдавало ошибку

"Значение поля Валюта не может быть пустым"

В типовых соглашениях о продажах, используемом при обмене - валюта была указана RUB.
На сайте, вроде как, была указана такая же валюта в настройках валют.


Но в заказах, пришедших с сайта валюта была не заполнена.
Оказалось, нужно было указать валюту еще и в настройках интеграции на стороне сайта:

к сожалению, не было возможности протестировать это на мультивалютных магазинах.

7) Отбор номенклатуры по свойству товара

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


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

Но в 1С УТ 10.3 в модуле менеджера объекта плана обмена "Б_ОбменССайтом" есть процедура "НастроитьПостроительТоваров". В ней я и подправила пакет запросов, связанный с выборкой товаров для того, чтобы решить свою задачу.

Картинки торговых предложений
Очень интересный случай - оставлю на закуску - напишу в следующий раз, как я по-новому реализовала на новом модуле свой старый кейс для магазинов одежды, где учет ведется по характеристикам – цвету и размеру.

Импорт товаров из 1С-Битрикс в 1С Предприятие УТ 11 - опыт использования стандартного функционала

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

Итак передо мной встала задача импортировать 36 000 с хвостом товаров из 1С-Битрикс в 1С УТ 11.1.6. Битрикс обновлен до самой свежей версии, на 1С УТ установлено битриксоидовское дополнение.

Начав настраивать импорт каталога с сайта заказчика в 1С УТ я, как обычно, сделала множество открытий:

1) Уникальность рабочих наименований.
Когда у нас на сайте 36 000 товаров в 300х разделах, их наименования, естественно, не уникальны. В 1С УТ же по-умолчанию включен контроль их уникальности, в следствии чего импорт товаров через помощник импорта товаров с сайта завершается с ошибкой.
Открываем конфигурацию 1С УТ в режиме предприятия, идем в Администрирование — Настройка параметров системы — Номенклатура Снимаем галочку «Контроль уникальности...»


2) Список свойств, которые могут быть импортированы — не описан пока в документации, поэтому пришлось выявить его, почитав код обработки «Помощник импорта товаров». Это:
CML2_ARTICLE — артикул
CML2_BASE_UNIT — базовая единица
Помимо этого в тексте обработки перебираются и записываются в дополнительные сведения о номенклатуре все остальные свойства с префиксом CML2_

Для того, чтобы сайт корректно отдал эти свойства 1С-ке, в настройке свойств инфоблоков свойствам нужно задать соответствующие внешние коды:

3) Меня так же интересовал момент, предусматривает ли обработка апдейт элемента номенклатуры — или только вставку и по какому полю контролируется наличие элемента в справочнике.
Апдейта нет — только вставка.
В качестве уникального идентификатора номенклатуры используется
Номенклатура.Б_Идентификатор = СтрокаТовара.Ид;

В это ИД товара Битрикс вписывает XML_ID товара, если оно задано и обычное ID товара, если XML_ID не задано. У меня XML_ID были заданы, так я изначально наполняла сайт заказчика через свой модуль импорта из YML файлов, предоставленных поставщиком.
Если у вас на сайте не заданы XML_ID — рекомендую их сгенерировать — к примеру, можно сделать их равными ID. Какой смысл? Это решит в дальнейшем проблему обмена в другую сторону и проблему с обменом заказами.

4) Механизм нужно протестировать перед финальной загрузкой, которая даже на очень мощном сервере будет длиться очень долго.

На стороне сайта я тестирую выгрузку так:
- авторизуюсь на сайте
- вбиваю в строку браузера запрос:
http://адрес_сайта/bitrix/admin/1c_exchange.php?type=get_catalog&mode=init
получаю
zip=yes
- вбиваю следующий запрос:
http://адрес_сайта/bitrix/admin/1c_exchange.php?type=get_catalog&mode=query
Сайт отдает кусочек xml-файла. Он не выглядит как xml-файл — это нормально — он не целый и не завершенный. 1С-ка когда прихоит на сайт за каталогом посылает этот запрос до тех пор, пока не заберет весь файл по кусочкам.

Однако, то, как выгружаются товары — мы видим, проверяем, выгружается ли все так, как нужно.

Далее мне необходимо как-то сначала протестировать импорт на стороне 1С Предприятия на маленьком кусочке. Потому что, если все 36 000 товаров загрузятся неправильно, потом можно успеть состариться, пока дождешься их удаления — мы ведь проапдейтить их в следующий проход импорта не сможем. Я хочу протестировать обмен сначала на 100-200х товаров — думаю, этого будет достаточно. Для этого я копирую компонент экспорта каталога catalog.export.1c в свое пространство имен.

В своем кастомном компоненте я нахожу место

elseif($_GET["mode"] == "query" )
{
И дописываю:

if ($_SESSION["BX_CML2_EXPORT"]["current"]>100) $_SESSION["BX_CML2_EXPORT"]["step"]=4;
Делаю свой скрипт обмена 1c_exchange2.php, в котором подключаю свой компонент вместо стандартного.

elseif($type=="get_catalog" )
{
$APPLICATION->IncludeComponent("bedrosova:catalog.export.1c", "", Array(
"IBLOCK_ID" => COption::GetOptionString("catalog", "1CE_IBLOCK_ID", "" ),
"INTERVAL" => COption::GetOptionString("catalog", "1CE_INTERVAL", "-" ),
"ELEMENTS_PER_STEP" => COption::GetOptionString("catalog", "1CE_ELEMENTS_PER_STEP", 100),
"GROUP_PERMISSIONS" => explode(",", COption::GetOptionString("catalog", "1CE_GROUP_PERMISSIONS", "1" )),
"USE_ZIP" => COption::GetOptionString("catalog", "1CE_USE_ZIP", "Y" ),
)
);
}
Мой скрипт 1c_exchange2.php будет отдавать 1С-ке только 100+N товаров. N – количество товаров, выгружаемых за 1 шаг. Вписываю в помощнике импорта адрес своего скрипта и запускаю импорт.

После того, как товары загружены — начинается загрузка картинок. На этом этапе может вывалиться ошибка «Реквизит для группы не найден» - она может возникнуть, если есть группа с таким же уникальным айдишником, как товар (на стороне сайта придется дополнительно перепроверять сквозную уникальность XML_ID групп и товаров).

Радуемся - товары успешно загрузились в 1С Предприятие УТ. У них есть наименование, артикул, привзяка к группе, картинка, а так же дополнительные свойства - в дополнительных сведениях. Когда потом с сайта придут заказы - 1С однозначно идентифицирует товары заказа по XML_ID, а складовщик посмотрит на картинку - и не ошибется при отгрузке.

Помощник импорта товаров в 1с с сайта на Битрикс — в целом пригоден для одноразовой загрузки номенклатуры без дополнительной кастомизации. Единственное, плохо, что обработка выполняется очень медленно. Я расстрою тех, кто собирался развернуть 1С УТ на своем ноутбуке.

Но для москвичей это не проблема. Ведь в вашем городе живет и работает мой надежный партнер Вячеслав Мишаков (тел. 8 499 70 77 118) - руководитель компании КМ Системс. Специалисты КМ Системс соберут для вас сервер под 1С Предприятие УТ, идеально подходящий для последующей синхронизации с 1С Битрикс. Ребята сами привезут к вам сервер, настроят его, установят 1С Предприятие, подключат его к локальной сети, разграничат доступ для ваших сотрудников, будут оказывать регулярную техподдержку сервера. Для тех, кто еще не созрел для покупки собственного сервера, КМ Системс предлагает разместить 1С Предприятие в их датацентре. Захожу на их сервера, чтобы интегрировать 1С Предприятие клиентов с 1С-Битрикс и радуюсь - не работа, а удовольствие.

О том, как отдать заказы с сайта на 1С Битрикс двум ИБ 1С Предприятие

Читатели моего блога (bedrosova.blogspot.ru) попросили меня рассказать о том, как лучше организовать обмен заказами между 1С Битикс и 1С Предприятием в условиях, когда справочник номенклатуры в одной и в другой ИБ синхронизирован по внешнему коду.

Это можно сделать 2мя различными способами в зависимости от того, какой программист - 1с-ник или битриксоид имеется в трудовом резерве:

1) На стороне 1С. Можно сделать, чтобы первая информационная база, забрав заказы, не посылала сайту сообщение

http://<сайт>/bitrix/admin/1c_exchange.php?type=sale&mode=success

см. описание протокола обмена: http://dev.1c-bitrix.ru/api_help/sale...otocol.php
тогда вторая ИБ, зайдя после, сможет забрать те же самые заказы.

2) Или на стороне сайта: создаются 2 разных файла

http://<сайт>/bitrix/admin/1c_exchange.php и
http://<сайт>/bitrix/admin/1c_exchange2.php

одинакового содержания. И одна информационная база должна ходить за заказами по первому адресу, а вторая - по второму. (Дело в том, что опция успешного завершения обмена заказами записывается отдельно для каждого url - поэтому по 2му адресу - заказы для 2й конфигурации будут выгружены даже после того, как первая уже обменялась по первому адресу и прислала success)

Способ 2 мне кажется предпочтительным.

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

Интеграция 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Г была решена.

Дикие ягоды и подводные камни... (опыт интеграции 1С Битрикс и 1С Предприятия)

"Хочу все, как на дикой ягоде (как на wildberries.ru)" - над таким незамысловатым заданием заказчика нам недавно довелось поработать (нам - это в данном случае мне и моей помощнице Юлии Ханусяк). Уточнив, что именно заказчик хочет "как на дикой ягоде", я поняла, что он хочет такую же организацию каталога и карточки товаров, как там и чтобы каталог наполнялся на стороне 1С и уже не требовал дозаполнения на стороне сайта. Несколько разработчиков до меня благоразумно отказались от этой задачи, я же изначально не увидела в ней всех подводных камней. Мы определились, какие задачи заказчик хочет видеть решенными до запуска магазина, а какие мы оставим на будущее, и я приступила к реализации.
Тут следует упомянуть об особенностях организации каталога на wildberries.ru.
Каждый товар (предмет одежды) имеет торговые предложения, обладающие характеристиками цвета и размера. И к каждому цвету привязано свое фото, и если пользователь в карточке товара кликает по определенному цвету, то картинка этого цвета становится на место большой картинки.

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

На стороне 1С (у клиента стандартная 1С УТ 11.0) - тоже, казалось бы, нет проблемы - включаем учет по характеристикам. Создаем характеристики "цвет" и "размер" для нужных номенклатурных групп, правильно заводим документы прихода на склад и документы установки цен, создаем профиль обмена с фильтром по наличию на складе и делаем выгрузку.

И вот тут и всплыл большой и жирный подводный камень: на стороне 1С Предприятия в стандартной конфигурации УТ нет никакой возможности указать, к какому цвету относится та или другая прикрепленная к номенклатурной позиции картинка.

1С программиста у заказчика не было, и заказчик искренне полагал, что, взявшись делать интеграцию, я должна делать ее с обеих сторон. "Что же, Юля, в следующий раз ты будешь тщательнее продумывать текст договора" - сказала я себе и вспомнила о замечательном 1С Франчайзи, интеграторе и внедренце, с которым я имею честь быть знакомой, а именно об Анатолии Полякове (Skype: tolpolyakov). К нему я и обратилась за консультацией по указанной проблеме. Анатолий проконсультировал меня и, кстати, отказался от денег, попросив взамен дружбу и аналогичные дружеские консультации по Битриксу, если они понадобятся. Анатолий, я не забываю добро и помню о своих обещаниях. Но я отвлеклась от темы.

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

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

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

Мы решили использовать в 1С стандартное поле "Описание файла" для хранения нужных нам признаков картинки - цвета и того, является ли она "мордочкой" или "спинкой".

Договорились, что в описании файла заказчик будет писать, к примеру, "красный№1" если это главная картинка красного цвета, "красный" - если это картинка красного цвета, но не главная, "красный№0" - если это картинка красного цвета, к-я должна быть использована как картинка по-умолчанию, если для какого-то цвета нет картинки.

При импорте в файле обмена описания файлов картинок выгружаются 1С в составе реквизитов товара.

О том, как их можно обработать на стороне сайта - я тоже умолчу в данном посте - я уже опубликовала несколько постов с описанием того, как я кастомизирую импорт. А то, что у нас получилось - можно увидеть на сайте luckyfamily.ru

Конечно, пройдет еще не мало итераций разработки, пока этот проект приблизится к своему идеалу - "диким ягодам". Но каталог успешно наполняется на стороне 1С, регулярно импортируется на сайт и мы знаем, какая фотка - какого цвета, на какой - мордочка, а на какой - спинка.

Импорт скидок номенклатуры из 1С Предприятия в 1С Битрикс

Начну с цитаты

...если документом "Установка скидок номенклатуры" определены скидки на товары в зависимости от их количества в заказе, то данная информация поступит на сайт и скидка будет применяться и при продаже в Интернет-магазине.
Кроме этого, модуль на стороне 1С выгружает в CommerceML и другие типы скидок, но их автоматический импорт в 1С-Битрикс предлагается реализовать разработчикам интернет-магазина, поскольку их применение очень сильно зависит от особенностей ценообразования для каждого конкретного случая.
Цитата от сюда: https://1c.1c-bitrix.ru/ecommerce/v2.php

Вот об опыте импорта тех самых "других" типов скидок я и хочу рассказать в данной статье. В частности, об импорте скидок, которые применяются к определенному товару вне зависимости от каких-либо условий. (В сезон распродажи или на залежалый товар/размер).

Данную задачу мы (я и мой помощник Вадим Соловьев) решали для того же самого проекта, для которого я незадолго до этого подогнала импорт под готовую структуру инфоблоков (см. статью Как подогнать стандартный импорт из 1С под готовое решение из маркетплейс Битрикс). В этом проекте у нас уже был унаследован класс CIBlockCMLImport, был кастомизирован компонентcatalog.import.1c для работы именно с этим классом.

class CIBlockCMLCustomImport extends CIBlockCMLImport{}

и была перегружена функция ImportElement

Этот же перегруженный метод ImportElement мы и дополнили функционалом для импорта из 1С безусловных скидок на товар.

Информация о скидках приходила к нам из 1С Предприятия в следующем виде:

<СкидкиНаценки>
<СкидкаНаценка>
<Условие>Количество одного товара в документе превысило</Условие>
<Процент>20</Процент>
<Валюта>руб</Валюта>
<Получатель>8a21ac94-2ac6-11e0-8e8a-00265abc1d64</Получатель>
</СкидкаНаценка>
...
</СкидкиНаценки>
И торговые предложения, у которых в секции СкидкиНаценки присутствовала скидка указанного вида нам нужно было интерпретировать как торговые предложения, на которые действует безусловная процентная скидка.

Думая о том, как организовать хранение этих скидок в Битрикс, я хотела дописывать торговые предложения, на которые действует скидка в условия для существующих в системе процентных скидок (желтая стрелочка на рисунке). Вадим предложил заводить отдельную скидку для каждого торгового предложения (зеленая стрелочка на рисунке). И я отдала предпочтение решению Вадима, так как оно предполагает меньшее количество запросов к БД при импорте ссылок (особенно в случаях когда в 1С удалена скидка на товар, к-я ранее была импортирована на сайт и которую нужно удалить и на сайте в процессе импорта), хотя результат и не так красиво смотрится в админке.


Итак, в нашем перегруженном методе ImportElement мы дописали следующее:

В самом начале метода мы смотрим, есть ли для указанного элемента безусловная процентная скидка. Если есть, пишем ее в переменную $discount_perc. Если нет - эта переменная остается равной 0.

$discount_perc = 0.0;
if(isset($arXMLElement[GetMessage("IBLOCK_XML2_DISCOUNTS";)]))
{
foreach($arXMLElement[GetMessage("IBLOCK_XML2_DISCOUNTS";)] as $key=>$discount)
{
if(
isset($discount[GetMessage("IBLOCK_XML2_DISCOUNT_CONDITION";)])
&& $discount[GetMessage("IBLOCK_XML2_DISCOUNT_CONDITION";)]===GetMessage("IBLOCK_XML2_DISCOUNT_COND_VOLUME";)
)
{
$discount_perc = $this->ToFloat($discount[GetMessage("IBLOCK_XML2_DISCOUNT_COND_PERCENT";)]);
}
}
}
Далее, ниже секции, в которой в стандартном методе ImportElement определяются скидки на товары в зависимости от их количества в заказе, мы вставили код, создающи/обновляющий/удаляющий наши безусловные процентные скидки. В этом коде мы пошли на небольшую хитрость и ставим каждой новой скидке ID равный ID элемента, для которого данная скидка была создана.


$discount_id = intval($arElement["ID"]);
$arDiscount = array();
$arDiscount = CCatalogDiscount::GetByID($discount_id);
if ($discount_perc == 0.0)
{
if($arDiscount) CCatalogDiscount::Delete($discount_id);
}
else
{
if($arDiscount)
{
if($arDiscount["VALUE"] != $discount_perc)
{
$arDiscount["VALUE"] = $discount_perc;
CCatalogDiscount::Update($discount_id, $arDiscount);
}
}
else
{

if ($discount_perc>0){
$arLogic = array (
"CLASS_ID" => "CondGroup",
"DATA" => array (
"All" => "OR",
"True" => "True",
),
"CHILDREN" => array (
"0" => array (
"CLASS_ID" => "CondIBElement",
"DATA" => array (
"logic" => "Equal",
"value" => $discount_id,
),
),
),
);

$arDiscount = array (
"ID" => $discount_id,
"SITE_ID" => "s1",
"ACTIVE" => "Y",
"NAME" => strval($discount_id),
"MAX_USES" => 0,
"COUNT_USES" => 0,
"COUPON" => "",
"SORT" => 100,
"MAX_DISCOUNT" => 0.0000,
"VALUE_TYPE" => "P",
"VALUE" => $discount_perc,
"CURRENCY" => "RUB",
"MIN_ORDER_SUM" => 0.0000,
"NOTES" => "",
"RENEWAL" => "N",
"ACTIVE_FROM" => "",
"ACTIVE_TO" => "",
"PRIORITY" => 1,
"LAST_DISCOUNT" => "Y",
"CONDITIONS" => serialize($arLogic),
);

CCatalogDiscount::Add($arDiscount);

}
}
}
И безусловные скидки на товары были успешно импортированы из 1С Предприятия в Битрикс.
Решение не претендует на идеальность, но оно имеет место быть, успешно внедрено и не перегружает достаточно стандартную виртуальную хостинговую площадку.

Данная статья - перепост из моего blogspot блога http://bedrosova.blogspot.ru/ Люблю blogspot. Жаль, что кросспостить в блоги веб-разработчиков Битрикс оттуда приходится вручную. А вот на своем сайте bedrosova.ru я организовала автоматический кросспостинг анонсов из своего блога посредством своего же бесплатного компонента из Маркетплейс Битрикс http://marketplace.1c-bitrix.ru/solut....atomshow/.

Как подогнать стандартный импорт из 1С под готовое решение из маркетплейс Битрикс

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

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

Сказать по правде, думала я над этой задачей долго – разные варианты в голове перебирала. Была мысль дать импорту отработать, как есть, а потом последним шагом все перераспределить. Но хотелось, конечно, чтобы данные сразу в процессе импорта попадали на свое место.

Пришла к выводу, что в данном случае стоит прибегнуть к наследованию и полиморфизму.

Что я сделала. Сначала, как обычно, скопировала компонент импорта в свое пространство имен, завела другой файл импорта, чтобы он обращался уже к моему компоненту, а не к стандартному. После этого объявила класс наследник для класса CIBlockCMLImport
Вот так:

class CIBlockCMLCustomImport extends CIBlockCMLImport
{

}

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

ImportProperties

В php 5 перегрузку делать очень просто – нужно в теле наследника написать перегружаемую функцию с тем же самым именем, что и в классе-предке. И тогда для объектов класса-наследника будет выполняться именно она. А для объектов предка – его старая функция. Это и есть полиморфизм.


Метод ImportProperties непосредственно формирует структуру и состав свойств инфоблока для импорта.

Я нашла там место, где формируется

$arProperty

и вместо вот этой строки

if($arP["VALUE"] == GetMessage("IBLOCK_XML2_TYPE_LIST";))
$arProperty["PROPERTY_TYPE"] = "L";

написала свой код, проверяющий создан ли инфоблок для хранения значений этого свойства, и если не создан – я его создаю. (проверяю по XML_ID). А так же сделала полю тип E вместо L.

Кстати, чтобы создалось свойство типа «привязка к элементу инфоблока», нужно еще указать для создаваемого свойства LINK_IBLOCK_ID – ID инфоблока, к которому привязывать.

$arProperty["PROPERTY_TYPE"] = "E";
$arProperty["LINK_IBLOCK_ID"] = $найденный_выше_код_инфоблока;

А потом ниже по коду, там где в стандартном методе заполнялся список списочного поля, я вместо этого заполняю инфоблоки.

Но это еще не все – потом я еще начала искать то место, где непосредственно записывалось для данного элемента значение данного поля и поняла, что нужно делать перегрузку и для метода ImportElement. Я перегрузила этот метод и в теле уже своего перегруженного метода после обработки свойств типа L дописала свою обработку для свойства типа E.

После того, как я перегрузила эти функции, я прошла по файлу components.php своего кастамизированного компонента и заменила там все конструкторы системного класса CIBlockCMLImport на конструкторы своего - CIBlockCMLCustomImport.

Потом уже после того, как скрипт импорта сформировал мне в новом инфоблоке нужную структуру, я открыла старый инфоблок и новый – и перенесла в старый инфоблок все параметры свойств, их внешние коды, внешний код самого каталога.

Потом я сделала то же самое со старыми инфоблоками брендов, материалов, подошв и т.д., к-е были ранее в решении. Новые инфоблоки поудаляла. И все – импорт пошел куда надо.
Кстати, на форуме частенько появляются вопросы из разряда «Почему 1С не хочет грузить в существующий инфоблок, а создает рядом такой же другой?» Потому что он не такой же. Забывают люди, что в настройках инфоблока на закладке свойств есть еще и кнопочка такая, кликнув по которой можно редактировать дополнительные параметры свойства, и большинство таких вопросов – от банальной невнимательности.

На словах – все просто, а отлаживать этот кастомизированный импорт было тяжковато.

Работу обмена эмулировала скрипом bx_1c_import.php Прописала в нем путь к своему файлу импорта и свой компонент импорта. В коде своих функций выводила отладочную информацию в лог-файл.

Нет ничего невозможного.

Интеграция Битрикс с несколькими информационными базами 1С Предприятие - некоторые аспекты

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

Как вариант: создают несколько копий файлов
http://<сайт>/bitrix/admin/1c_import.php и
http://<сайт>/bitrix/admin/1c_exchange.php
, а затем в настройках со стороны 1с прописывают для каждой базы свой путь.

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

И тогда я подумала: "Не может быть, чтобы для Битикс было невозможно это сделать. Разработчики должны были предусмотреть возможность для этого". Я скопировала компонент
catalog.import.1c в свою область видимости и занялась его кастомизацией.

Первое, что бросилось мне в глаза в исходном коде компонента – это вот это строка №374

$rs = $DB->Query("sel ect count(*) C fr om b_xml_tree where PARENT_ID = ".intval($NS["XML_ELEMENTS_PARENT"]));
Здесь явно прописано имя временной таблицы, куда в процессе импорта загружается xml файл, пришедший от 1с. Естественно, если несколько баз одновременно начнут писать свои данные в одну и ту же таблицу – импорт не пройдет корректно. Поэтому я добавила к своему кастомизированному компоненту новый параметр IB_ID – уникальный идентификатор, чтобы иметь возможность разнести процесс импорта из разных баз по разным временным таблицам, и переписала эту строку следующим образом:

$rs = $DB->Query("select count(*) C fr om b_xml_tree”. $arParams["IB_ID"].” wh ere PARENT_ID = ".intval($NS["XML_ELEMENTS_PARENT"]));
Но это еще не все: имя таблицы b_xml_tree прописано в качестве параметра по-умолчанию в конструкторах вот этих двух классов: CIBlockCMLImport и CIBlockXMLFile

Но при создании объектов этих классов в компоненте можно передать им другое имя таблицы.
В стандартном компоненте написано так: (не в одном месте)

$obCatalog = new CIBlockCMLImport;
$obCatalog->InitEx($NS, array(
"files_dir" => $WORK_DIR_NAME,
"use_crc" => $arParams["USE_CRC"],
"preview" => $preview,
"detail" => $detail,
"use_offers" => $arParams["USE_OFFERS"],
"use_iblock_type_id" => $arParams["USE_IBLOCK_TYPE_ID"],
"translit_on_add" => $arParams["TRANSLIT_ON_ADD"],
"translit_on_update" => $arParams["TRANSLIT_ON_UPDATE"],
"translit_params" => $arTranslitParams,
"skip_root_section" => $arParams["SKIP_ROOT_SECTION"],
);
Я переписала вот так:

$obCatalog = new CIBlockCMLImport;
$obCatalog->InitEx($NS, array(
"files_dir" => $WORK_DIR_NAME,
"use_crc" => $arParams["USE_CRC"],
"preview" => $preview,
"detail" => $detail,
"use_offers" => $arParams["USE_OFFERS"],
"use_iblock_type_id" => $arParams["USE_IBLOCK_TYPE_ID"],
"translit_on_add" => $arParams["TRANSLIT_ON_ADD"],
"translit_on_update" => $arParams["TRANSLIT_ON_UPDATE"],
"translit_params" => $arTranslitParams,
"skip_root_section" => $arParams["SKIP_ROOT_SECTION"],
"table_name" => "b_xml_tree".$arParams["IB_ID"],
);
В одном месте в компоненте был использован конструктор по-умолчанию:

$obCatalog = new CIBlockCMLImport;
$obCatalog->Init($NS);
Я не сразу заметила его, и потом долго искала, почему ничего не получается. Заметив, заменила на конструктор с параметрами, как было показано выше.

Методы класса CIBlockXMLFile в стандартном компоненте импорта товаров из 1С в Битрикс были вызваны как статичные методы:

CIBlockXMLFile::DropTemporaryTables();
...
CIBlockXMLFile::CreateTemporaryTables();
...
Но я создала в начале компонента объект этого класса, передав ему имя таблицы "b_xml_tree".$arParams["IB_ID"],


$obXMLF = new CIBlockXMLFile("b_xml_tree".$arParams["IB_ID"]);
И все места, где методы этого класса были вызваны, как статичные методы, поправила так, чтобы вызывать эти методы именно для моего объекта.

$obXMLF ->DropTemporaryTables();
...
$obXMLF ->CreateTemporaryTables();
...
Так же я поправила вот этот кусочек

$obXMLFile = new CIBlockXMLFile;
if($obXMLFile->ReadXMLToDat abase($fp, $NS, $arParams["INTERVAL"]))
заменив его таким:

if($obXMLF ->ReadXMLToDat abase($fp, $NS, $arParams["INTERVAL"]))
и вот эту строку компонента

$DIR_NAME = "/".COption::GetOptionString("main", "upload_dir", "upload";)."/1c_catalog";
Я тоже параметризировала, чтобы файлы, пришедший от разных баз раскладывались по разным папкам.

$DIR_NAME = "/".COption::GetOptionString("main", "upload_dir", "upload";)."/1c_catalog".$arParams["IB_ID"];
После этого я подключила свой кастомизированный компонент в скрипте импорта вместо стандартного. 1С программист из IT отдела клиента придумал, как сделать мой метод красивее: вместо того чтобы создавать несколько файлов импорта, я создала один, а параметр IB_ID 1C Программист передал в GET – запросе, кастомизировав 1С обработку на своей стороне.

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

Данное решение было внедрено мной в ЗАО «ИСТОК» http://www.istoksochi.ru/
Для этого же интернет-магазина, мною был кастомизирован и компонент экспорта заказов из Битрикса в 1С для того, чтобы каждая база могла забирать с сайта свои заказы. Возможно, я напишу об этом подробнее в одном из будущих постов.