Битрикс обмен 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 в модуле менеджера объекта плана обмена "Б_ОбменССайтом" есть процедура "НастроитьПостроительТоваров ". В ней я и подправила пакет запросов, связанный с выборкой товаров для того, чтобы решить свою задачу.

9) Картинки торговых предложений

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

Помимо настройки стандартного обмена 1С <=> Битрикс, мы периодически сталкиваемся и успешно решаем задачи по нестандартной настройке.

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

Ниже описан отдельный случай, если вы столкнулись с чем-то подобным - обращайтесь к нам.

Пример нестандартной настройки

Дело в том, что стандартная схема предполагает, что все товары изначально вводятся в 1С, и только потом выгружаются на сайт.

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

Чтобы исключить двоную работу они и поставили задачу: выгружать из 1С только цены и остатки, а свойства и наименования товаров не корректировать.

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

Поэтому пришлось значительно изменить модуль обмена с сайтом.

Синхронизация баз

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

Был написан php-скрипт, который обновляет поле “Внешний код” для каждого товара (артикул) и торгового предложения (артикул + код единицы).

Доработка выгрузки из 1С в Битрикс

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

Результат скорректированной выгрузки значительно отличается от стандартного:

Результат

Работы были выполнены в течение одной недели. Все изменения сначала производились на копии базы, развёрнутой в нашем офисе. Когда решение было отлажено - изменения перенеслись на рабочий сайт.

Режим работы сайта нарушен не был.

И 1С: Предприятие Управление торговлей, редакция 11.1 (11.1.2.31).
Точка актуальности статьи - май 2015.
Обращайте на это внимание.
Очень многие вещи, освоив однажды, мы делаем практически машинально.
Однако, не каждый из умеющих водить автомобиль, может стать инструктором вождения.
Одно дело - сделать самому, совсем другое - рассказать другому, как делать. Многим знаком этот старинный анекдот.
- Дорогая, где чай? Я никак не могу найти.... - Ах, какой ты беспомощный! Чай в аптечке, в банке из-под какао, на которой наклейка "СОЛЬ".
Именно поэтому большинство инструкций по интеграции 1С и Битрикс не заостряют внимание на моментах, на которые начинающий может потратить от нескольких часов, до нескольких дней своего времени.
Попробую максимально закрыть этот вопрос именно в плане быстрого старта
(не ошибусь, если скажу - у многих есть желание посмотреть, как работает 1С Управление торговлей в связке с интернет магазином).
Огромное спасибо разработчикам Битрикс за виртуальную машину. С ней установка системы для тестирования стала занимать минуты.
Дальше - обращайтесь к форумам, гуру, куру и т.п.

Приступаем.

Что нужно скачать:

Виртуальную машину запускаем в плейере.

Дополнения устанавливаем в каталог шаблонов 1С.

Из шаблонов же создаем базу Управление торговлей Демо, редакция 11.1 (11.1.2.31). Включаем в конфигураторе возможность изменения
, и интегрируем модуль дополнения от Битрикс.
Этот процесс полностью описан в файле документации, идущем в комплекте с модулем. Цитирую дословно:




  1. Включить в объединение (установить флажок) подсистему «Битрикс»: "Конфигурация" - "Общие" - "Подсистемы" - "Администрирование" - "Битрикс".

10. Выполнить сравнение и объединение конфигураций (кнопка «Выполнить»).

Обратить внимание.
Рекомендуется запустить 1С с параметром «ЗапуститьОбновлениеИнформационнойБазы », для того, чтобы 1С заполнил все служебные данные в 1С. Запуск с параметром можно запустить как через командную строку, так и из конфигуратора.

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

"<Адрес к 1 cv 8. exe >" ENTERPRISE (/ F или / S в зависимости от типа базы) ""<Адрес к базе> " / N "<Логин>" / P "<Пароль>" /C ЗапуститьОбновлениеИнформационнойБазы

Для того, чтобы запустить из конфигуратора нужно зайти: Сервис -> Параметры. На вкладке «Запуск 1С: Предприятия» нужно указать параметр запуска.

Заодно лучше установить режим запуска «Толстый клиент управляемое приложение»

Пока мы занимались с 1С, подоспела виртуальная машина.

Загружаем дистрибутив «Управление сайтом» Бизнес Демо


Выбираем и настраиваем магазин.

Все настройки оставляем по умолчанию. Если есть желание навести марафет - введите сразу свои данные и снимите неиспользуемые флажки (виды оплаты и доставки)

В 1С настраиваем связь с сайтом. Проверяем, что сайт доступен.

Обратить внимание.
Делаем архивы.
1С - средствами 1С, а сайт - средствами виртуальной машины (если сделать архив через админку сайта, он пропадет при первом обмене с 1С).
Не забудьте убрать параметр запуска «ЗапуститьОбновлениеИнформационнойБазы» он уже не нужен.

Справедливое желание - загрузить номенклатуру с сайта.

Посмотреть, как устроены описания, свойства и т.п. Создаем под это вид и группу номенклатуры «Одежда»

Первая незадача - загрузка не проходит.
Получаем ошибку: «Не удалось загрузить данные с сервера. Ответ сервера: failure Ошибка инициализации экспорта».

Потому что по умолчанию ни у одной группы пользователей нет на это прав.

Обратить внимание.
Нужно в административной части сайта зайти в раздел Магазин - Интеграция с 1С - Экспорт каталога. Выделить как минимум группу Администраторы и сохранить изменения.

После этого загрузка товаров с сайта пройдет.

Помимо номенклатуры со всеми свойствами и характеристиками, загрузится цена BASE (запомните это наименование - оно нам пригодится) и документ установки цен

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

Переходим к выгрузке номенклатуры на сайт Битрикс из 1С.

Для начала - стандартным обменом 1С.

Переходим на вкладку Выгрузка товаров.

Обратить внимание.

Если произвести обмен сейчас - на сайте вообще не произойдет изменений. Вся номенклатура выгрузится в новый инфоблок, которого в пользовательской части сайта не видно.
Чтобы правильно попасть в уже настроенный инфоблок торгового каталога (он у нас называется Одежда) нужно правильно заполнить идентификатор каталога. Как его узнать?
В административной части сайта - переходим в Настройках к инфоблокам

И устанавливаем флажок «Показывать код загрузки из внешних источников »

После этого для Информационного блока Одежда увидим внешний код «clothes_s1»

Его можно поправить здесь или внести в 1С.

Далее переходим к настройке отбора в 1С

Обязательно создать и выбрать Соглашение

Как видно условия два: Доступно внешним пользователям и Сегмент партнеров - пустой

Обратить внимание.

На самом деле - есть еще и три: Оно должно называться BASE.Если пропустить этот момент, номенклатура на сайте будет заменена, но все товары будут недоступны для заказа. У них не будет ни количества, ни цен.

Остальные настройки в соглашении - могут быть «по вкусу». В том числе цена (многие волнуются по этому поводу).

Как и настройки отбора.

Обратить внимание.

После всех настроек - переводим режим обмена в состояние - выгружать в каталог на диске.

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

После этого переключаемся в режим обмена с сайтом напрямую.

Обмениваемся с сайтом магазина.

Обмен прошел - номенклатура, цены, количество, картинки - все на месте.

Переходим к модулю обмена от Битрикс.

Тут гораздо больше настроек. Но основные нужно заполнить также как и в предыдущем случае.

Обмениваемся и видим - товаров нет в наличии.
Если копнуть глубже - не загрузились цены.

Обратить внимание.

Для настройки обмена модулем Битрикс нужно правильно ввести внутренний код цены сайта.
Помните, мы договаривались, что первый обмен пойдет не напрямую на сайт, а в каталог на диске.
Ищем там файл prices_..
Открываем его в любом текстовом редакторе и ищем, тег ИдТипаЦены - это и есть внешний код цены сайта.

На сайте в разделе Магазин - Типы цен - редактируем базовую цену. Записываем правильный внешний код.

После этого сайт магазина приобретает правильный вид

Обратить внимание.

Если захотим вернуться к стандартному обмену - он не пройдет. Нужно на сайте в разделе Настройки - Командная PHP-строка - выполнить две строки кода

COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y") ;

COption::SetOptionString("sale", "secure_1c_exchange", "N") ;

После этого можно обмениваться с сайтом как модулем обмена Битрикс, так и стандартным обменом конфигурации.

А так же переходить к обмену заказами и многим другим интересным вещам в связке 1С:Предприятие - 1С Битрикс.

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

Инициатором любого обмена является 1С, сайт не загружает ничего в 1С, сайт только принимает запросы и отдаёт результат. По умолчанию, 1С обращается к скрипту /bitrix/admin/1c_exchange.php. Этот путь указывается в настройках обмена в самой 1С. Из коробки в этом файле включается файл /bitrix/modules/sale/admin/1c_exchange.php. Если открыть файл, то видим там подключение нескольких компонентов в зависимости от $_GET["type"]. В общем случае интересуют два из них:

bitrix:sale.export.1c - экспорт заказов.

bitrix:catalog.import.1c -импорт каталога.

Экспорт заказов в 1С

После получения ID сессии идёт инициализация обмена, URL: /bitrix/admin/1c_exchange.php?type=sale&mode=init&sessid=ID_Сессии. На этом этапе сайт отдаёт настройки обмена со стороны сайта.

Для получения списка заказов запрашивается URL /bitrix/admin/1c_exchange.php?type=sale&mode=query&sessid=ID_Сессии. Выгружаются заказы с полями EXTERNAL_ORDER = "N", UPDATED_1C = "N" и обновившиеся после последней успешной выгрузки в 1С (это проверяется по времени из свойства "last_export_time_committed_/bitrix/admin/1c_excha" модуля sale).

Флаг EXTERNAL_ORDER указывает, что заказ создан в 1С и его выгрузка в 1С не требуется.

Флаг UPDATED_1C после успешного импорта из 1С на сайте устанавливается в "Y" и такие заказы не участвуют в дальнейших экспортах до их обновления на сайте. Во время обновлений заказов на сайте UPDATED_1C устанавливается в "N".

После обработки заказов 1С для завершения обмена запрашивает URL /bitrix/admin/1c_exchange.php?type=sale&mode=success&sessid=ID_Сессии. При этом в свойство "last_export_time_committed_/bitrix/admin/1c_excha" модуля sale записывается время запроса списка заказов (НЕ текущее время, т.к. с момента запроса заказов до их обработки могли добавиться заказы и они попадут в следующую выгрузку с сайта).

Модификация

В экспорте заказов участвуют файл /bitrix/admin/1c_exchange.php , компонент bitrix:sale.export.1c и класс CSaleExport . Какие-либо события здесь отсутствуют, поэтому для модификации этого процесса нужно заменить компонент на свой, создать класс-наследник CSaleExport и заменить вызовы в компоненте на него. В последних версиях Битрикс этот класс стал относительно читабельным, в старых там была просто простыня из php и "xml".

С версии 15.5 добавлена дополнительная проверка и если вызвать просто /bitrix/admin/1c_exchange.php?type=sale&mode=query , то получим ошибку "failure Ошибка проверки источника запроса. Обновите модуль обмена". Если нет желания возиться с sessid, то можно отключить проверку источника запроса, для этого нужно выполнить:

// old school: COption::SetOptionString("sale", "secure_1c_exchange", "N"); // d7 style: \Bitrix\Main\Config\Option::set("sale", "secure_1c_exchange", "N");

Импорт товаров из 1С

Далее идёт инициализация обмена , URL /bitrix/admin/1c_exchange.php?type=catalog&mode=init&sessid=ID_Сессии. На этом этапе в сессии инициализируется массив данных обмена $_SESSION["BX_CML2_IMPORT"] и сайт отдаёт параметры обмена: возможность использования zip, лимит размера файла и т.д. Также на этом этапе очищается папка для файлов выгрузки. Скорее всего, это будет папка /upload/1c_catalog/. Для отладки можно включить сохранение старых файлов обмена, тогда при новом обмене старые данные будут перемещаться в отдельные папки: 1c_catalog0, 1c_catalog1 и т.д.. Для сохранения данных нужно объявить константу в dbconn.php:

// Не забудьте убрать эту строку после отладки во избежание переполнения сервера define("BX_CATALOG_IMPORT_1C_PRESERVE", true);

После этого 1С начинает подготовку данных и далее посылает их POST-запросом на сайт частями, URL: /bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=ИМЯ_ФАЙЛА.zip&sessid=ID_Сессии. Запрос продолжается, пока файлы не будут переданы полностью.

1С передает на сайт xml-файлы с данными товаров и предложений, а также картинки. В случае если сайт разрешил использовать zip, то 1С передает все файлы одним архивом. Тогда следующий шаг начинается с его распаковки.

В выгрузке могут участвовать xml-файлы :

  • import.xml - товары, разделы, типы цен, склады, свойства товаров и единицы измерения;
  • offers.xml - торговые предложения товаров и их свойства;
  • prices.xml - цены торговых предложений(в новых версиях);
  • rests.xml - остатки торговых предложений(в новых версиях);
  • references.xml - пользовательские справочники (highload-инфоблоки, в новых версиях).

Картинки загружаются в папку import_files.

Далее начинаются шаги импорта , URL: /bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=ИМЯ_ФАЙЛА_ВЫГРУЗКИ.xml , где ИМЯ_ФАЙЛА_ВЫГРУЗКИ - import.xml, offers.xml и т.д. Обработка файла завершается, когда сайт отдаёт слово "success". За обработку файла выгрузки отвечают классы CIBlockXMLFile (/bitrix/modules/iblock/classes/mysql/cml2.php) и CIBlockCMLImport (/bitrix/modules/iblock/classes/general/cml2.php).

Обработка файла состоит из нескольких шагов (информация будет дополняться) :

    Очистка временной таблицы (таблица b_xml_tree);

    Метод CIBlockXMLFile::DropTemporaryTables(). Обычный drop таблицы b_xml_tree.

    Создание временной таблицы;

    Метод CIBlockXMLFile::CreateTemporaryTables(). Здесь создается таблица b_xml_tree. Можно, кстати, задать storage engine этой таблицы, равно как и всех создаваемые битриксом, с помощью определения константы MYSQL_TABLE_TYPE.

    Чтение файла во временную таблицу;

    Метод CIBlockXMLFile::ReadXMLToDatabase().

  1. Индексация временной таблицы;
  2. Импорт метаданных;
  3. Импорт разделов;
  4. Деактивация разделов и пересчёт левой и правой границ для разделов;
  5. Импорт элементов;
  6. Деактивация элементов;
  7. success.

Некоторые шаги могут выполняться за несколько запросов, порциями по несколько секунд (это время настраивается параметров "Интервал одного шага в секундах" в настройках интеграции с 1С в админке Битрикса).

Модификация

На шаге 10, т.е. по окончании обработки файла выгрузки (NB: одного файла, например, товаров или предложений) вызывается событие OnSuccessCatalogImport1C модуля catalog. Аргументы обработчика - параметры компонента обмена и путь к файлу выгрузки.

Также для изменения процесса обмена можно использовать обычные события, например, OnBeforeIBlockElementUpdate или OnBeforeProductAdd. В обработчике, чтобы определить, что событие вызвано именно во время обмена с 1С, я использую такое костыльное условие:

If (isset($_GET["type"], $_GET["mode"]) && $_GET["type"] === "catalog" && $_GET["mode"] === "import") { // ... }

Ну и, если ничего нельзя решить событиями, всегда можно полностью изменить процесс обмена, скопировав и изменив файл /bitrix/admin/1c_exchange.php , компонент bitrix:catalog.import.1c и класс CIBlockCMLImport .

Отключение проверки источника запроса

Как и в случае с выгрузкой товаров, при импорте товаров есть проверка источника запроса. Можно отключить её следующим кодом:

// old school: COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y"); // d7 style: \Bitrix\Main\Config\Option::set("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y");

Статья будет дополняться по мере появления новой информации и вдохновения.

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

В.С. Черномырдин.

Я уже говорил об обмене данными между программными продуктами семейства 1С и Битрикс-сайтами в статье Но тогда я рассказал исключительно об общих принципах работы. В другой я написал о проблемах 1С и Битрикса.

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

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

Именно с такой проблемой ко мне обратился не так давно клиент, представитель веб-студии. Вот так выглядело его предложение о сотрудничестве:

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

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

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

Итак, исходные данные следующие:

  1. Имеется 1С Управления торговли. По словам клиента – последняя версия
  2. Перестала работать интеграция. Сразу после обновлений.
  3. Клиент утверждал, что обновился полностью.
  4. Битрикс последней версии
  5. Что делать?! Все пропало

Шаг первый. Версия конфигурации

Первое, что я делаю всегда, это проверяю информацию, которую мне предоставляет клиент. А в случае с 1С – обязательно самостоятельно проверяю текущую версию.

В данном случае релиз действующей конфигурации оказался 11.1.9.5. Это означало, что конфигурация не обновилась, версия не является последней .

Естественно, что я сообщил об этой ошибке клиенту, после чего самостоятельно установил обновления. Конфигурация обновилась. Интеграция так и не заработала.

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

Шаг второй. Проверка платформы

Тогда я проверил релиз платформы. В принципе, его стоит проверять сразу. Лично я советую обязательно всегда самостоятельно проверять релизы и платформы, и конфигурации. Это настолько важно, что я не боюсь написать об этом повторно.

Проверяйте актуальность всех релизов самостоятельно!

В моем случае с платформой было все в порядке, релиз оказался последним, номер 8.3.5.1248, который вышел 31.10.14. (кстати пока я писал эту статью вышло еще одно обновление платформы).

Итак, версии платформы и конфигурации в порядке, но обмен не работает.

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

Шаг третий. Проверяем целостность базы данных

Так, первым делом я отправился на сайт Битрикс. Я перешел на следующую страницу:

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

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

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

Шаг четвертый. Специальный модуль: поможет ли альтернативное решение?

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

Нашел я только один вариант релиза этого модуля, предназначенный для версии 4.0.5.1. Я подумал, решил все же попробовать и скачал этот модуль интеграции. При скачивании я заметил, что версия этого файла у меня на сайте далеко не первая.

Мой файл после скачивания назывался так:

4.0.5.1_ UT_11.1.2(3).zip

Таким образом, оказывается, я как минимум четвертый человек, который пытался решить эту проблему и скачивал этот модуль.

Далее я все же установил этот модуль. В архиве к нему идет небольшая брошюра, что оказалось очень кстати. Но самая версия файла мне не давала покоя. И я решил спросить у клиента, какой я по счету? В ответ услышал, что я уже 5 или 6 специалист, который пытается решить эту проблему.

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

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

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

Кроме того, все эти действия не принесли никакой пользы.

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

После попыток установить дополнительный модуль, я обратил внимание на такую надпись вверху экрана:

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

Кроме того, очень внимательно нужно следить за выбором модуля. Лично я поначалу запутался в этих модулях для России:

В общем, что я получил в итоге всех действий и проверок:

  • Есть обмен стандартный, который выходит в 1С. Он не работает.
  • Есть модуль обмена данных «Для России». Он также не заработал.
  • Внизу есть еще один модуль обмена. Но и он не работает.

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

Что меня еще сбило с толку. Если вы нажмете кнопку «Требования 1С», то увидите такую таблицу:

Информацию об ошибке я благополучно нашел на 65 странице темы.

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

Разработчик об этом писал следующее:

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

|ТОГДА """"

На
|КОГДА ВариантыКомплектацииНоменклатурыТовары.Характеристика ЕСТЬ NULL
|ТОГДА НЕОПРЕДЕЛЕНО
В следующей версии модуля будут внесены соответствующие изменения.

Что это значит?

Администратор сайта 1С Битрикс практически признал, что ошибка находится в платформе 1С.

После того, как я нашел эту информацию, ошибка была исправлена и обмен, в общем, заработал. Но конкретно все - нет.

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

Также странная недоработка, я считаю. Почему-то об этом нюансе в документации не написано ни слова. И в свое время я решение этой проблемы искал аналогичным методом, т.е. на ощупь.

Что получилось в итоге?

Задача была решена успешно. Мы с клиентом все настроили, обмен данными начал работать так, как и должен. Мы отработали со стороны 1С, специалист по Битрикс настроил работу с данными со своей стороны. В результате потребовалось 3 часа напряженной работы.

На что было потрачено это время?

Каждое действие требует определенных временных затрат. Обновления занимают от 10 до 15 минут, индексация и исправление базы данных – 40 минут, каждая попытка обмена – от 15 до 18 минут (если запускать полный обмен).
В результате мы потратили очень много времени для того, чтобы заново настроить то, что прекрасно работало перед обновлением конфигурации и платформы 1С.

Выводы

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

И еще немного интересного из моего личного опыта

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

Что получается в итоге:

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

Если вы решились применять типовой обмен

Первое, что вам нужно понимать, что обмен, который вам предлагают, универсален, а потому сам модуль очень сложен. Кроме того, даже на этой странице v8.1c.ru/edi/edi_stnd/90/92.htm вы увидите, что имеется несколько версий этого обмена, причем, они регулярно меняются. А для полноценной настройки работы подобного обмена и, тем более, для доработки его под ваши потребности, вам придется очень четко понимать, как он работает.

Для примера:

Формат выгружаемых данных из УТ 11.1.9.56

Формат выгружаемых данных из УТ 11.1.9.56 с помощью модуля от Битрикс:

То есть имеем несогласованность форматов выгрузки от 1С и Битрикса для одной и той же версии платформы и конфигурации.

Взаимодействие продуктов 1С и 1С-Битрикс реализуется на базе процедур двунаправленного обмена данными. Обмен данными выполняется с использованием основанного на XML открытого Стандарта обмена коммерческой информацией – CommerceML 2.0.

Если вы почитаете, что представляет собой CommerceML 2.0, вы так же, как и я, поразитесь тому, насколько этот стандарт сложен по сравнению с другими. Даже просто описание, т.е. сам файл схемы описаний в формате txt занимает 107 килобайт!

И любая ваша ошибка, скорей всего, окончится тем, что обмен вообще перестанет работать.

При использовании типового обмена вы вынуждены «подсаживать» и себя и клиента на постоянный мониторинг изменений, которые происходят как на стороне 1С, так и на стороне Битрикс. При каждом обновлении вы рискуете потерять все изменения, которые вносили в обмен. В итоге, вы получите сложный, очень «глючный» и работающий практически независимо от вас механизм. А если к этому добавить еще и постоянные обновления 1С и Битрикс, то вместо работающего обмена вас ожидает постоянная «головная боль».

Как делать интеграцию?

Я уже давал этот совет и дам еще раз: обмен нужно писать самому. Кроме интеграционных механизмов, у вас может возникнуть и другая проблема: сам модуль опирается на определенным образом заполненные данные. И эти правила также могут меняться и регулярно меняются.

Итак, в процессе «борьбы с обновлениями» вы справились с платформой, с модулем, а потом натыкаетесь еще и на ошибку, которая идет от неверного формата данных. Оказывается, заполнять их также надо определенным, причем, неявным образом. Вспомните, как я в своем примере указывал необходимость поставить «галочку» на стороне 1С Битрикс, о которой я, к счастью, знал. А иначе бы время работы над настройкой обмена еще больше затянулось бы. И нигде в документации об этой самой «галочке» не сказано ни слова!

В принципе, если вы используете типовой обмен, то стоит прислушаться к тому, что говорит сам 1С Битрикс словами администратора:
– не обновляйтесь (в то время как 1с говорит – обновляйтесь)

Если вы хотите все-таки использовать типовой модуль, последовательность ваших действий должна быть такой:

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

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

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