Обновление цен с диапазонами в 1С-битрикс (bugfix)
Мы очень давно работаем с 1С-битрикс и, как и многие другие компании, у нас к этому продукту отечественной разработки весьма противоречивые чувства.
На этот раз наша команда столкнулась с интересным багом (конечно же не первым)!
Задача
Перед нами стояла не сложная, на первый взгляд, задача — выгрузить товары из 1С и расставить цены в зависимости от категории товара и объема.
Например:
- от 0 до 9 метров — розничная цена
- от 10 до 19 метров — оптовая цена 1
- от 20 и выше — оптовая цена 2
Ну и мы по накатанной пошли в файлик init.php добавили обработчик, который срабатывает перед обновлением цены (OnBeforePriceUpdate).
Сам обработчик делал очень простые операции:
- На каждую итерацию обновления цены, он узнает к какой группе относится товар и получает нужные диапазоны объемов
- Определяет какой тип цены пришёл из 1С
- Сопоставляет диапазон с нужным типом цены.
- Добавляет недостающие диапазоны (заморочки связанные со сложной бизнес-логикой заказчика)
В итоге в карточке товара получаем вот такой результат:

Проблема
Вроде всё как нужно встало. Идём на сайт и проверяем.

Меняем количество товара и наблюдаем за изменением цены. Тут тоже работает всё как надо, пока не доходим до оптовой цены 2!
Выбираем количество больше 20 и цена ставится розничная.
Проверили шаблон — там всё ок с логикой, используется стандартный функционал битриксовый.
Написали в тех. поддержку. С поддержкой прошли семь кругов ада (сначала младший спец, потом чуть выше младшего и так до самого старшего разработчика дошли).
Переговоры с поддержкой тоже зашли в тупик.
Решение
Пришлось довольно много поэкспериментировать. В ходе экспериментов обнаружили, что если открыть в админке карточку товара и просто нажать кнопочку «Сохранить» или «Применить», то баг пропадает!
Начали копать дальше — получили все записи из базы данных для этого товара в 2-х состояниях:
- После выгрузки из 1С:
[
...
'QUANTITY_FROM' => 20,
'QUANTITY_TO' => 0,
...
]
- После сохранения из админки:
[
...
'QUANTITY_FROM' => 20,
'QUANTITY_TO' => null,
...
]
Заметили разницу?!
Вот и мы заметили и были весьма удивлены! Ведь мы перечитали в доль и поперек документацию битрикса и там сказано было:

Ну мы и использовали и false и пустое значение, но в этом случае в базу писался 0.
А вот когда присвоили принудительно null, всё встало на свои места!
Самое, что досадное старший разработчик нам усиленно втирал совершенно разные варианты, далекие от нужных, и мы кучу времени на этой мелкой задаче потеряли.
Зато получили массу полезного опыта и в очередной раз убедились, что документация 1С-битрикс это просто какая-то формальность и она зачастую далека от реальности.

Владислав
Не ленись, поделись:
135
1
