Столкнулся с проблемами обмена после обновления интернет-магазина БУС с 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С на сайт товары без характеристик, получается, в соответствии с настройками ("Загружать торговые предложения (характеристики) в отдельный инфоблок" и "Цены только в инфоблоке торговых предложений"), дублируются в инфоблок торговых предложений как предложение с ценой и доступным количеством, и у них с элементом в инфоблоке "Товаров" прописывается одинаковый "Внешний код". И потом, при обмене заказами, битрикс при проверке доступного количества берет по "внешнему коду" не "торговое предложение", а "товар" и выдает ошибку. Я долго пытался понять где именно он это делает и даже написал в техподдержку, но от техподдержки за несколько дней переписки удалось добиться лишь подтверждения того, что я нашел, но не помощи в решении проблемы - цитирую:
[QUOTE]Также проверьте, возможно что у вас на сайте и товар и торговые предложение имеют одинаковый внешний код, если это так, то это не корректно, при обмене 1С и сайт, у торговых предложений товара внешний код должен быть вида через символ # <внешний код товара>#<внешний код предложения> и такой внешний код должен быть у товара в корзине заказа и передаваться из 1С.
...
Это стандартная логика, при отмеченной опции "Цены только в инфоблоке торговых предложений" у торгового предложения для простого товара будет внешний код основного товара. Для того чтобы изменить такое поведение требуется кастомизация обмена.
...
В рамках работы службы техподдержки мы можем проконсультировать вас только по стандартному механизму обмена, вопросы по кастомизации существующего функционала вы можете задать на нашем форуме в специализированной ветке [URL=https://dev.1c-bitrix.ru/support/forum/]https://dev.1c-bitrix.ru/support/forum/[/URL], либо обратиться к одному из наших партнеров специализирующихся в данной области [URL=https://www.1c-bitrix.ru/partners/]https://www.1c-bitrix.ru/partners/[/URL][/QUOTE]
Пока переписывался с поддержкой продолжал копать исходный код. В итоге нашел
Bitrix\Sale\Exchange\Entity\OrderImport::getProduct()
/bitrix/modules/sale/lib/exchange/entity/orderimport.php:398 ([URL=https://bxapi.ru/src/?module_id=sale&name=OrderImport::getProduct]https://bxapi.ru/src/?module_id=sale&name=OrderImport::getProduct[/URL])
Править файлы ядра не хорошо, но в моем случае, боюсь, это единственный вариант - добавил дополнительный фильтр по IBLOCK_ID в array("=XML_ID" => $code, "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y"),