Реверс-инжиниринг (обратная разработка) − исследование готового устройства или программы, а также документации на него с целью понять принцип его работы. Например, чтобы обнаружить недокументированные возможности (в том числе программные закладки), сделать изменение или воспроизвести устройство, программу или иной объект с аналогичными функциями, но без прямого копирования. (Википедия)
ТЗ: “Настроить расчет курьерской доставки собственной службой, исходя из параметров предоставленной оценочной сетки”.
И так у нас есть данные по стоимости некоторых доставок, довольно много. Надо автоматизировать расчет, чтоб по вводным параметрам стоимость сама считалась.
Простым языком это означает, что надо автоматизировать расчет стоимости доставки товара клиенту на сайте.
На данном этапе расчет производится внешней дружественной организацией. При поступлении заказа ТУДА сообщается вес и адрес, а ОТТУДА в ответ говорят стоимость услуги. Результат транслируется покупателю.
Есть набор данных в табличном виде от полученных ранее результатов запросов на расчет стоимости доставки грузов.
Полный алгоритм расчета неизвестен.
Глава первая «Дано, и что с этим делать»
В более развернутом виде это означает: «у нас есть данные по стоимости некоторых доставок, довольно много. Надо автоматизировать расчет, чтоб по вводным данным стоимость сама считалась»
Заказчик пользуется услугами сторонней организации и понятия не имеет, по каким принципам рассчитывается доставка.
Имеем только накопленные данные.
Доставок было 3 разновидности:
- «Локальная» – фиксированный перечень близлежащих населенных пунктов.
- «Ближняя» – дистанция не превышает 100 км.
- «Дальняя» – дистанция более 100 км.
- Еще есть услуги грузчиков.
Часть первая «Локальная доставка»

Глядя на эту таблицу, понимаем, что линейность прослеживается, но линия ломаная.
Начальный вес 0-300 кг стоит 350 р. Следующие 300 кг прибавляют к стоимости 150 р. Пока неплохо. Если использовать термин таксистов «подача машины 200 р» и по 150 р за каждые 300 кг. Но дальше хуже – от полутора тонн шаг сетки увеличивается до 500 кг, а шаг стоимости становится 200 р. за каждые 500 кг. В последнем столбце мы видим прирост еще в 500 кг, но стоимость увеличивается уже на 250 р.
Увы, линейности нет, есть ломаная с двумя изломами. В данном случае проще и более гибко будет всё же использовать табличные данные. Их не так много, а заказчик в дальнейшем сможет поменять значения, если изменится тарификация. Ему не придется предварительно посещать курсы математики и программирования.
Более того, не известно, что будет, если покупатель вдруг купит больше 4500 кг. А он же может.
Часть вторая «Ближняя доставка»
Опять табличка (фрагмент)
Вроде понятно, берем стоимость как «по месту» и прибавляем дистанцию из колонки, умноженную на 25.
Но опять все не настолько линейно.
Серые строки на вид стоили несколько дороже своих соседей. Это становится более заметно, если отсортировать таблицу по дистанции.
Правая колонка вне таблицы уже была добавлена мной для изучения этого вопроса.
В ней мы считаем
_указанную_стоимость_ доставки_ – _стоимость_локальной_доставки_ + 25 * _дистанцию_
Оказывается, есть «биение» в 5 р., наверняка связанное с округлением стоимости до 10 р.
А серые строки дороже на 200 ± 5 р.
На этом этапе можно было бы попробовать прикрутить карту с автоматическим расчетом маршрута (это, кстати, очень дорого для коммерции). Но анализ прописанных в таблице расстояний показал, что дистанция считается не от точки со складом, а от края зоны «локальной доставки».
Т.е. у нас где-то есть склад. От него до пункта назначения 30 км. Но если у нас по пути населенный пункт из «локальной доставки» и от его края до целевого пункта 5 км, то наценка добавляется за 5 км дополнительного пути. Ну, как бы всё логично, стоимость доставки до края «Локального тарифа» + еще проехать 5 км. Пусть так, но автоматизация с картой точно отпадает. Берем на заметку.
Здесь нам пока тоже непонятно, что будет, если клиент закажет больше 4500 кг.
Часть третья «Дальняя доставка»
Снова табличка (фрагмент)

Тут вроде всё просто. Всего 2 градации по весу, только почему-то уже максимальный вес 4 т, ну и ладно.
Серых строк нет, но, если отсортировать по дистанции, опять видим населенные пункты, ощутимо более дорогие, чем их соседи по расстоянию.
Составляем формулу в дополнительном правом столбце, как для таблицы выше.
Задаем вопрос заказчику, он идет спрашивать логистов. Оказывается, это платные участки дорог по пути. Берем на заметку, что и такое бывает.
Часть четвертая «Грузчики»
Табличка? ☺
Выглядит не сразу очевидно. С лифтом дороже. Т.е. еще и лифт поднимать…
Потом приходит понимание.
Вторая колонка – стоимость за этаж. Её надо умножать на количество этажей.
Лифт – это как два этажа. Надо сначала до него дотащить, потом из него вытащить.
С выгрузкой вроде, всё понятно.
Глава вторая «Думаем, что с этим всем делать»
Мы имеем перечень городов. В 1С-Битрикс для этого есть местоположения.
У городов есть «дистанция» − имеющая отношение к реальности, но с большими оговорками.
У городов есть «дополнительная стоимость», если по пути платная дорога или другие виды «дополнительных расходов» ☺
«Дистанцию» и «дополнительную стоимость» мы добавляем к местоположениям.
Сюда их будет вносить менеджер по мере поступления заказов из новых местоположений.
Имеющиеся местоположения мы любезно заполняем за счет заказчика. Качественно, долго (но очень быстро), нудно, дорого. ☺
Напрягаем заказчика сходить к логистам и спросить, что будет, если закажут больший вес, чем в табличке. Получаем ответ, что в табличке указано за одну машину, если купят больше – поедет две машины, три, и т.д.
С грузчиками то же самое – по весу разбиваем на итерации. Суммируем результат.
Давно я не брал в руки шашек… Но придется рисовать блок-схему.
Рисуем так, чтоб еще и заказчику было более-менее понятно, поэтому «переменные» записываем словами через подчеркивание.
Также корректируем таблички. В них разрывы диапазонов веса.
0-300 р. 301-600 р.
Это не нормально, потому как 300,5 кг куда девать-то?
Обговариваем этот пробел, соединяем диапазоны. Получаем 0-300, 300-600
Долго составляем подробное ТЗ для программиста.
Обговариваем нюансы.
Кодим, отлаживаем, работает!
Если покупатель из населенного пункта, где есть данные о дистанции, то доставка считается автоматически.
Если нет, то ему предлагается обсудить доставку с менеджером. После этого менеджер обращается к логистам для расчета, как и было ранее. Получив данные о стоимости для клиента и данные о дистанции и дополнительных расходах, добавляет это в местоположение Битрикс. В следующий раз для этого местоположения расчет осуществится автоматически.
Программист Сергей, WEB-AiM
WEB-AiM − решим любую, даже самую сложную, задачу.
Записывайтесь на консультацию, обсудим ваш проект.