Введите поисковый запрос

Выгрузка из 1С на сайт цен с расширенным режимом

Расширенный режим цен, это когда для 1 типа задается разная цена для разного количества. Модуль обмена не умеет выгружать такие цены, но умеет выгружать несколько типов цен.

3 типа цены выгружается из 1С
  • для 1-2шт  (id типа цены на сайте 4)
  • для 3-9шт  (id типа цены на сайте 2)
  • для 10 и более  (id типа цены на сайте 3)
Задача:
для определенных продуктов (Свойство Обработчик заполнено и равно 3)
из нескольких типов цен заполнять цену с расширенным режимом  (id типа цены на сайте 1)

1. на сайте завести 4 цены (3 выгружаются, 1 заполняется и по ней работает каталог на сайте)
2. включить поддержку старых событий в модуле Каталог

3. в init.php обработчики и функции

обработчик перед добавлением и изменением цены

  AddEventHandler("catalog", "OnBeforePriceUpdate", "MyOnBeforePriceUpdate");
  function MyOnBeforePriceUpdate($id, &$arFields){
    if (empty($arFields["QUANTITY_FROM"]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) {        
      $arFields["QUANTITY_FROM"] = 1;
      $arFields["QUANTITY_TO"] = 2;  
    }
  }


  AddEventHandler("catalog", "OnBeforePriceAdd", "MyOnBeforePriceAdd");
  function MyOnBeforePriceAdd(&$arFields){    
    if (empty($arFields["QUANTITY_FROM"]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) {
     $arFields["QUANTITY_FROM"] = 1;
     $arFields["QUANTITY_TO"] = 2;          
   }
 }


  AddEventHandler("catalog", "OnPriceAdd", "MyOnPriceAdd");
  function MyOnPriceAdd($id, $arFields)
  {
    
    if (in_array($arFields["CATALOG_GROUP_ID"],[2,3,4]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) {
      if ($arFields["QUANTITY_FROM"] == 1) {
        RecalculateBasePrice($arFields["PRODUCT_ID"]);
        $dbProductPrice = CPrice::GetListEx(
        array(),
        array("PRODUCT_ID" => $arFields["PRODUCT_ID"], "QUANTITY_FROM" => 3, "QUANTITY_TO" => 9, "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"]),
        false,
        false,
        array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO")            
        );
        if ($arRes = $dbProductPrice->Fetch()) {
          CPrice::Update($arRes["ID"], array(
          "PRICE" => $arFields["PRICE"],
          "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"],
          "CURRENCY" => "RUB",
          "QUANTITY_FROM" => 3,
          "QUANTITY_TO" => 9
          ));
        } 
        else {
          CPrice::Add(array(
          "PRODUCT_ID" => $arFields["PRODUCT_ID"],
          "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"],
          "PRICE" => $arFields["PRICE"],
          "CURRENCY" => "RUB",
          "QUANTITY_FROM" => 3,
          "QUANTITY_TO" => 9
          ), false);
        }

        $dbProductPrice = CPrice::GetListEx(
        array(),
        array("PRODUCT_ID" => $arFields["PRODUCT_ID"], "QUANTITY_FROM" => 10, "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"]),
        false,
        false,
        array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO")            
        );
        if ($arRes = $dbProductPrice->Fetch()) {
          CPrice::Update($arRes["ID"], array(
          "PRICE" => $arFields["PRICE"],
          "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"],
          "CURRENCY" => "RUB",
          "QUANTITY_FROM" => 10,
          "QUANTITY_TO" => false
          ));
        } 
        else {
          CPrice::Add(array(
          "PRODUCT_ID" => $arFields["PRODUCT_ID"],
          "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"],
          "PRICE" => $arFields["PRICE"],
          "CURRENCY" => "RUB",
          "QUANTITY_FROM" => 10,
          "QUANTITY_TO" => false
          ), false);
        }
      }
    }

  }


обработчик после изменения цены
  AddEventHandler("catalog", "OnPriceUpdate", "MyOnPriceUpdate");
  function MyOnPriceUpdate($id, $arFields)
  {
    if (isset($arFields["CATALOG_GROUP_ID"]) && ($arFields["QUANTITY_FROM"] == 1) && in_array($arFields["CATALOG_GROUP_ID"],[2,3,4]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) {
      RecalculateBasePrice($arFields["PRODUCT_ID"]);
    }
  }


обработчик перед удалением цены
  AddEventHandler("catalog", "OnBeforePriceDelete", "MyOnBeforePriceDelete");
  function MyOnBeforePriceDelete($ID){

    $arPrice = CPrice::GetByID($ID);
    if (($arPrice["CATALOG_GROUP_ID"] == 1) && IsNeedRecalculate($arPrice["PRODUCT_ID"]) && (RecalculateBasePrice($arPrice["PRODUCT_ID"]))) {
      return false;
    }
  }

функция - проверка товара на то, надо ли для данного товара заполнять цену с расширенным режимом
  function IsNeedRecalculate($productId){ 
   $result = false;
   if(!empty($productId) && CModule::IncludeModule('iblock')){
    $dbItems = \Bitrix\Iblock\Elements\ElementAbsenceTable::getList([   
    'filter' =>   [           
    "ID" => $productId,
    "OBRABOTCHIK.VALUE"=>3                    
    ],   
    'select' => ['ID'], 
    'cache' => ["ttl" => 360000]
    ]);
    
    if($arItem = $dbItems->fetch()){
     $result = true;
   }   
 }
 return $result;
}

функция - пересчет цен
  function RecalculateBasePrice($productId)
  {
    $return = false;
    if (($productId > 0) && CModule::IncludeModule('catalog')) {
      //получим ВСЕ цены продукта
      $dbProductPrice = CPrice::GetListEx(
      array(),
      array("PRODUCT_ID" => $productId,"CATALOG_GROUP_ID"=>[1,2,3,4]),
      false,
      false,
      array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO")
      //array()
      );
      $arPrices = array();
      $arPrices1 = array();
      $arBasePrices = array();
      $arBasePrices1 = array();
      while ($arRes = $dbProductPrice->Fetch()) {
        if ($arRes["CATALOG_GROUP_ID"] == 1) {
          $arBasePrices[$arRes["ID"]] = $arRes;
          $arBasePrices1[$arRes["QUANTITY_FROM"]] = $arRes["PRICE"];
        } elseif ($arRes["QUANTITY_FROM"] == 1) {
          $arPrices[$arRes["CATALOG_GROUP_ID"]] = $arRes["PRICE"];
          $arPrices1[$arRes["CATALOG_GROUP_ID"]] = $arRes;
        }
      }
      $return = isset($arPrices[4]) || isset($arPrices[2]) || isset($arPrices[3]);

      if (isset($arPrices[4]) && isset($arPrices[2]) && isset($arPrices[3])) { //если раньше делать, то хня творится, да и экономия по ресурсам
      $price = $arPrices[4];  //Обмен с сайтом (1) от 1 до 2 шт
      $b = false;
      foreach ($arBasePrices as $id => $arBasePrice) {
        if ($arBasePrice["QUANTITY_FROM"] == 1) {
          if ($arBasePrice["PRICE"] != $price) {
            CPrice::Update($id, array(
            "PRICE" => $price,
            "CATALOG_GROUP_ID" => 1,
            "CURRENCY" => "RUB",
            "QUANTITY_FROM" => 1,
            "QUANTITY_TO" => 2
            ));
          }
          $b = true;
          break;
        }
      }
      if (!$b) {
        CPrice::Add(array(
        "PRODUCT_ID" => $productId,
        "CATALOG_GROUP_ID" => 1,
        "PRICE" => $price,
        "CURRENCY" => "RUB",
        "QUANTITY_FROM" => 1,
        "QUANTITY_TO" => 2
        ), false);
      }
      $price = $arPrices[2]; //обмен с сайтом (3) от 3 до 9шт
      $b = false;
      foreach ($arBasePrices as $id => $arBasePrice) {
        if ($arBasePrice["QUANTITY_FROM"] == 3) {
          if ($arBasePrice["PRICE"] != $price) {
            CPrice::Update($id, array(
            "PRICE" => $price,
            "CATALOG_GROUP_ID" => 1,
            "CURRENCY" => "RUB",
            "QUANTITY_FROM" => 3,
            "QUANTITY_TO" => 9
            ));
          }
          $b = true;
          break;
        }
      }
      if (!$b) {

        CPrice::Add(array(
        "PRODUCT_ID" => $productId,
        "CATALOG_GROUP_ID" => 1,
        "PRICE" => $price,
        "CURRENCY" => "RUB",
        "QUANTITY_FROM" => 3,
        "QUANTITY_TO" => 9
        ), false);
      }
      $price = $arPrices[3]; //обмен с сайтом (10) от 10 и более
      $b = false;
      foreach ($arBasePrices as $id => $arBasePrice) {
        if ($arBasePrice["QUANTITY_FROM"] == 10) {
          if ($arBasePrice["PRICE"] != $price) {
            CPrice::Update($id, array(
            "PRICE" => $price,
            "CATALOG_GROUP_ID" => 1,
            "CURRENCY" => "RUB",
            "QUANTITY_FROM" => 10,
            "QUANTITY_TO" => null
            ));
          }
          $b = true;
          break;
        }
      }
      if (!$b) {
        CPrice::Add(array(
        "PRODUCT_ID" => $productId,
        "CATALOG_GROUP_ID" => 1,
        "PRICE" => $price,
        "CURRENCY" => "RUB",
        "QUANTITY_FROM" => 10,
        "QUANTITY_TO" => null
        ), false);
      }
    }
  }    
  return $return;

}

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий


Стоимость разработки сайта

Я не оцениваю работу в часах, так как в итоге, Вы все равно захотите узнать общую стоимость и срок выполнения.

При оценке проекта или работ я сразу называю стоимость и срок выполнения. Стоимость моих работ не обсуждается. Я называю реальную стоимость за которую готов взяться за ваш проект. Не торгуюсь и не объясняю "а почему это стоит столько?"
Денис Бунаков

Узнать точную стоимость разработки сайта или приложения: Для этого я могу попросить Вас заполнить какой нибудь бриф, но зачем Вам это надо?:

Оставить заявку

И мы все спокойно обсудим либо по телефону, либо удобным для Вас способом например в месенджере

Часто задаваемые вопросы

  • На какой CMS создаете сайты в Новосибирске?
    Обычно мы используем для работы CMS-систему «1С-Битрикс» т.к это наиболее надежная и удобная CMS. Так же она достаточно гибка для разработки на котором можно от обычных сайтов визиток до полноценный масштабных порталов и даже маркетплейсов
  • Какие гарантии есть на создание сайта в Новосибирске?
    Я предлагаю гарантию на исправление ошибок и техническую поддержку в течение 12 месяцев (1 года) после запуска сайта. Это включает в себя устранение багов и обеспечение корректной работы всех функций. Я также гарантируем соблюдение сроков и качества выполнения работ. Я на столько уверен в качестве своих работ, что готов давать такую большую гарантию
  • Можно ли в дальнейшем менять самостоятельно информацию или только с помощью вас?
    Да, вы сможете самостоятельно изменять информацию на сайте, либо загружать их в электронном виде пакетными методами. Предоставляем подробные инструкции и обучающие материалы как всем пользоваться, чтобы вы могли легко управлять контентом. Однако, если у вас возникнут сложности или потребуется помощь, наша команда всегда готова помочь.
  • Вы оказываете услуги по созданию сайта и технической поддержки по договору ?
    Да, мы работаем только по договору как с юридическими, так и с физическими лицами. Вся необходимая бухгалтерская отчетность предоставляется своевременно.
  • Можно ли перенести уже существующий сайт на платформу 1С-Битрикс?
    Да, перенос сайта на другую платформу возможен, но это сложный процесс, который требует внимательной подготовки. Важно сохранить все данные (контент, изображения, SEO-настройки) и перенести функционал без потерь. Процесс может включать переписывание части кода и настройку новой платформы. Это особенно актуально, если текущая платформа не поддерживает новые функции или технологии. В моем портфолио есть сайт CибНИА имени С. А. Чаплыгина который как раз я полностью перенес на систему 1С битрикс с сохранением всего функционала
  • Чем отличается разработка сайта на шаблоне от индивидуального проекта?
    Сайт на шаблоне создается на основе готового дизайна, что снижает стоимость и ускоряет процесс разработки. Любой шаблон можно кастомизировать под себя НО! Иногда кастомизация может выйти дороже чем индивидуальная разработка. Дополнительно, в шаблонном решение может не быть нужного функционала. Индивидуальный проект создается с нуля по уникальному дизайну и потребностям клиента, что позволяет гибко настраивать функционал, но требует больше времени и ресурсов.
  • Следите ли вы за скоростью загрузки сайта?
    Да на всех этапах скорость загрузки сайта, чистота и оптимизация кода проходят тестирование и правки при ошибках, если хотите, то вы можете принимать активное участие на всех этапах.
  • Какая стоимость разработки сайта в Новосибирске и Москве?
    Стоимость создания и разработки сайта варьируется в зависимости от его сложности и функциональности. Например, базовый вариант может стоить от 100 000 рублей, в то время как более сложные проекты, например сайты интернет-магазинов или корпоративные порталы, могут стоить от 550 000 рублей и выше. Я готов обсудить требования и предложить оптимальное решение, соответствующее вашему бюджету. От региона присутствия сайта стоимость моих работ не меняется. Я не считаю что стоимость сайта в Москве должна превышать стоимость сайта в Новосибирске
  • Как будет работать мой сайт на мобильном телефоне?
    Я разрабатываю сайты с учетом адаптивного дизайна, что обеспечивает их корректное отображение и функциональность на всех устройствах, включая мобильные телефоны и планшеты. Это означает, что сайт будет автоматически подстраиваться под размер экрана, обеспечивая удобство использования и быстрое время загрузки на мобильных устройствах. Мои сайты отличаются доступным и привлекательным юзабилити, которые работают корректно и максимально профессионально увеличивают вашу прибыль.
  • Сколько времени уходит на создание сайта под ключ?
    Сроки разработки интернет-ресурса зависят от сложности проекта, в среднем, создание нового сайта занимает от 4 до 15 недель. Более сложные сайты могут потребовать больше времени. Но бывают проекты которые занимают до 1 года на разработку. Все очень индивидуально и примерные сроки я смогу озвучить после знакомства с Вами