Столкнулся с проблемами обмена после обновления интернет-магазина БУС с 17 версии на 19-ю и 1С с УТ 10 на УТ 11. Там в общем комбо всех проблем на сайте - компонент импорта каталога был кастомизирован, навешаны обработчики на On(Before|After)(IBlockElement|IBlockSection|Price)(Update|Add), шаблоны и компоненты каталога кастомизированы (еще в 14-15 версии БУС), компонент оформления заказа тоже кастомизирован. В общем никому не пожелаю такого ада - по-возможности избегайте такой работы. Я еще не до конца все проблемы разгреб, но те, что разгреб и еще пока живы в памяти - опишу - может, кому поможет, кто столкнется с чем-то похожим.
1. Не знаю как это работало раньше в прежней версии БУС / УТ 10, но после обновления пришлось поставить галочку в настройках обмена с 1С на сайте "Цены только в инфоблоке торговых предложений" - потому что кастомизированные компоненты и шаблоны каталога не способны были работать с товарами без торговых предложений. В этом случае 1С передает товар без характеристик как товар, а Битрикс делает сам ему торговое предложение.
2. Бизнес-процесс торговли был устроен так: - на сайте клиент делает заказ - заказ выгружается в 1С - в 1С к заказу добавляется доставка с ценой - заказ выгружается назад на сайт и там в том числе (если выбрана оплата картами) клиент может его оплатить. И вот выгрузка доставки сломалась - в 1С доставку добавляют - на сайте она не появляется, да еще и существующая удаляется. Несколько дней копания в коде классов обмена с 1С в БУС и я кое-как понял, что оказывается код услуги доставки в 1С должен быть ORDER_DELIVERY. И в xml доставка должна обязательно передаваться следующим образом: <Ид>ORDER_DELIVERY</Ид> - только так - стандартный обмен битрикс завязан прям на этот код ORDER_DELIVERY - он по нему дополняет документ заказа фиктивной "отгрузкой" и тогда отгрузки из заказа на сайте не удаляются. И вот это важно: <ЗначениеРеквизита> <Наименование>ТипНоменклатуры</Наименование> <Значение>Услуга</Значение> </ЗначениеРеквизита> если тип номенклатуры = услуга, то цену этого "товара" из документа битрикс добавляет в поле "стоимость доставки" заказа на сайте. Потом гуглом по ключевому слову ORDER_DELIVERY битрикс я нашел уже, что я не первый, кто с этим столкнулся, но пока я это сам не раскопал гугл мне никак не помог. А в техподдержку я обычно не обращаюсь, так как ни разу она мне еще ничем не помогла в таких вопросах.
3. Вроде бы обмен заказами наладился, но я рано обрадовался - оказалось, что не все заказы обновляются из 1С на сайте. А в логах вижу сообщения Ответ сервера: success Ошибка проверки доступного количества товара "Товар 1" Ошибка проверки доступного количества товара "Товар 2" Причем не по каждому заказу. Прошло некоторое время, пока я наконец понял закономерность - ошибки появляются у тех товаров, у которых только одно торговое предложение. Несколько дней раскопок в коде обмена и я смог лучше локализовать ошибку: При выгрузке товаров из 1С на сайт товары без характеристик, получается, в соответствии с настройками ("Загружать торговые предложения (характеристики) в отдельный инфоблок" и "Цены только в инфоблоке торговых предложений"), дублируются в инфоблок торговых предложений как предложение с ценой и доступным количеством, и у них с элементом в инфоблоке "Товаров" прописывается одинаковый "Внешний код". И потом, при обмене заказами, битрикс при проверке доступного количества берет по "внешнему коду" не "торговое предложение", а "товар" и выдает ошибку. Я долго пытался понять где именно он это делает и даже написал в техподдержку, но от техподдержки за несколько дней переписки удалось добиться лишь подтверждения того, что я нашел, но не помощи в решении проблемы - цитирую:
Цитата
Также проверьте, возможно что у вас на сайте и товар и торговые предложение имеют одинаковый внешний код, если это так, то это не корректно, при обмене 1С и сайт, у торговых предложений товара внешний код должен быть вида через символ # <внешний код товара>#<внешний код предложения> и такой внешний код должен быть у товара в корзине заказа и передаваться из 1С. ... Это стандартная логика, при отмеченной опции "Цены только в инфоблоке торговых предложений" у торгового предложения для простого товара будет внешний код основного товара. Для того чтобы изменить такое поведение требуется кастомизация обмена. ... В рамках работы службы техподдержки мы можем проконсультировать вас только по стандартному механизму обмена, вопросы по кастомизации существующего функционала вы можете задать на нашем форуме в специализированной ветке https://dev.1c-bitrix.ru/support/forum/, либо обратиться к одному из наших партнеров специализирующихся в данной области https://www.1c-bitrix.ru/partners/
Пока переписывался с поддержкой продолжал копать исходный код. В итоге нашел Bitrix\Sale\Exchange\Entity\OrderImport::getProduct() /bitrix/modules/sale/lib/exchange/entity/orderimport.php:398 (https://bxapi.ru/src/?module_id=sale&name=OrderImport::getProduct) Править файлы ядра не хорошо, но в моем случае, боюсь, это единственный вариант - добавил дополнительный фильтр по IBLOCK_ID в array("=XML_ID" => $code, "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y"),
Попробовал пример выше, вроде бы работает нормально. Пока в проде 3 дня - ошибка исчезла эта.
Но у нас на сайт из одной 1С-ки выгружается 2 каталога товаров: опт и розница. Внешние коды товаров в них одинаковые. В виду этого использование идентификаторов инфоблока очень неудобно: с каждым последующим каталогом придется добавлять по-новой эти самые айдишники.
Как вариант я придумал использовать CATALOG_TYPE, след. образом: