Автор: Владислав, дата: 28.06.2022

Обновление цен с диапазонами в 1С-битрикс (bugfix)

Мы очень давно работаем с 1С-битрикс и, как и многие другие компании, у нас к этому продукту отечественной разработки весьма противоречивые чувства.

На этот раз наша команда столкнулась с интересным багом (конечно же не первым)!

Задача

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

Например:

  • от 0 до 9 метров — розничная цена
  • от 10 до 19 метров — оптовая цена 1
  • от 20 и выше — оптовая цена 2

Ну и мы по накатанной пошли в файлик init.php добавили обработчик, который срабатывает перед обновлением цены (OnBeforePriceUpdate).

Сам обработчик делал очень простые операции:

  1. На каждую итерацию обновления цены, он узнает к какой группе относится товар и получает нужные диапазоны объемов
  2. Определяет какой тип цены пришёл из 1С
  3. Сопоставляет диапазон с нужным типом цены.
  4. Добавляет недостающие диапазоны (заморочки связанные со сложной бизнес-логикой заказчика)

В итоге в карточке товара получаем вот такой результат:

Проблема

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

Меняем количество товара и наблюдаем за изменением цены. Тут тоже работает всё как надо, пока не доходим до оптовой цены 2!

Выбираем количество больше 20 и цена ставится розничная.

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

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

Переговоры с поддержкой тоже зашли в тупик.

Решение

Пришлось довольно много поэкспериментировать. В ходе экспериментов обнаружили, что если открыть в админке карточку товара и просто нажать кнопочку «Сохранить» или «Применить», то баг пропадает!

Начали копать дальше — получили все записи из базы данных для этого товара в 2-х состояниях:

  1. После выгрузки из 1С:
[
...
'QUANTITY_FROM' => 20,
'QUANTITY_TO' => 0,
...
]
  1. После сохранения из админки:
[
...
'QUANTITY_FROM' => 20,
'QUANTITY_TO' => null,
...
]

Заметили разницу?!

Вот и мы заметили и были весьма удивлены! Ведь мы перечитали в доль и поперек документацию битрикса и там сказано было:

Ну мы и использовали и false и пустое значение, но в этом случае в базу писался 0.

А вот когда присвоили принудительно null, всё встало на свои места!

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

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