Меню

Запретить изменения описаний товаров при выгрузке из 1С УТ на сайт

   RSS
Запретить изменения описаний товаров при выгрузке из 1С УТ на сайт
Запретить изменения описаний товаров при выгрузке из 1С УТ на сайт

Достаточно часто, при разработке сайтов на Битрикс, с интеграцией с 1С Управление Тороговлей, нужно запретить изменения полей при обмен. В частности, детальное описание и картинку товара.
Цитата
Данил написал:
Чтоб работало  новых версиях нужно заменить:Код$_REQUEST['mode']=='import' наКод$_REQUEST['Import']=='Y'
Там, можно вообще на D7 все переделать, что бы не использовать устаревшие методы.
Чуть позже дополню заметку. Если у кого-то уже. есть готовый пример на D7 - буду не против если напишите тут)
Добрый день, подскажите пожалуйста как с помощью init.php
деактивировать товары без детальной картинки и без цены при выгрузки из 1с ?
Здравствуйте! А как запретить обновление веса товара?

Вот так не получается
Код
\Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog', '\Bitrix\Catalog\Product::OnBeforeUpdate', 'onBeforeProductUpdateHandler');function onBeforeProductUpdateHandler(\Bitrix\Main\Entity\Event $event)
{
   $result     =   new \Bitrix\Main\Entity\EventResult();

   // получаем поля товара
   $arFields   =   $event->getParameter('fields');

   // получаем ID товара
   $id         =   $event->getParameter('primary')['ID'];

   \Bitrix\Main\Diag\Debug::writeToFile(['onBeforeProductUpdateHandler' => array($id, $arFields)]);

   // модифицируем поля
   if ($_REQUEST['mode']=='import')
   {
      unset($arFields['WEIGHT']);
      $result->modifyFields($arFields);
   }

   return  $result;
}
Цитата
toorr2p написал:
Здравствуйте! А как запретить обновление веса товара?

Где-то, в этой теме уже был ответ, по моему надо использовать CATALOG_WEIGHT
Здравствуйте, подскажите пожалуйста, мне нужно применить данный запрет только для торговый предложений , а для товаров нужно оставить возможность для перезаписи, как это сделать? заранее спасибо)
Цитата
Guest написал:
Здравствуйте, подскажите пожалуйста, мне нужно применить данный запрет только для торговый предложений , а для товаров нужно оставить возможность для перезаписи, как это сделать? заранее спасибо)
Добрый. Все ровно тоже самое, просто используйте ID инфоблока с предложениями.
Добрый день!

Возможно ли таким же способом запретить смену типа у свойства при обмене с 1с. Из 1с приходит - строка, а нужно html/text
Цитата
Владимир написал:
Добрый день!

Возможно ли таким же способом запретить смену типа у свойства при обмене с 1с. Из 1с приходит - строка, а нужно html/text

Думаю, будет проще сделать это на выводе, в шаблоне. Используйте вместо
Код
echo $arResult['DETAIL_TEXT']

такой вывод
Код
echo $arResult['~DETAIL_TEXT']
Добрый день, прошу помощи в решении такой проблемы, нужно запретить 1с при обмене, изменять Названия свойств каталога и предложений. У нас несколько номенклатур, и у каждого индивидуальный набор характеристик. Проблема в том что в 1с - характеристики имеют названия Цвет(Платья),Размер(Платья) и тд, соответственно в таком виде и выгружаются на сайт. Я редактирую Цвет(Платья) - в Цвет и тд, но после обмена все возвращается к исходному виду как в 1с. Можно с помощью init.php запретить это делать? Не могу разобраться какие параметры отвечают за эти свойства, чтобы прописать в инит
Цитата
Гость Артур написал:
Добрый день, прошу помощи в решении такой проблемы, нужно запретить 1с при обмене, изменять Названия свойств каталога и предложений.

Тут конечно сходу не подсказать правильный ответ, без экспериментов на живую не обойтись.
Первое что можно попробовать это вот так
Код
unset($arFields['PROPERTY_*']['NAME'])


Если не сработает- то вариант жестче:
Получаем название каждого свойства из инфоблока, сохраняем во временную переменную и снова устанавливаем после перезаписи.
Код на вскидку, надо пробовать и дорабатывать, привожу просто в качестве ориентира- куда копать.

Код
$tmpPropName = $arFields['PROPERTY']['NAME'];
/* здесь случилась перезапись */
$arFields = Array(
    "NAME" => $tmpPropName
);
$ibp = new CIBlockProperty;
if(!$ibp->Update($ID, $arFields))
А не подскажете, как отменить добавление товара? То есть, фактически требуется только обновлять товары, имеющиеся на сайте, не добавляя новых.

пробовал варианты:
Код
if (!empty($_GET['mode']) && $_GET['mode'] == 'import') {
    unset($arFields);
}
Код
if (!empty($_GET['mode']) && $_GET['mode'] == 'import') {
    global $APPLICATION;
    $APPLICATION->throwException("Пропускаем этот товар " . $arFields['XML_ID']. ' ' .  $arFields['NAME']);
    return false;
}

в первом случае товары добавляются с одним названием
во втором случае товары не добавляются и через некоторое время выгрузка прекращается с ошибкой, указанной в исключении.

при этом, выгрузка прекращается не на первом пропущенном товаре (логировал с помощью AddMessage2Log())
Подскажите пожалуйста. Делаю выгрузку на сайт, описание падает в анонс. Написал обработку в init.php но он не срабатывает

AddEventHandler("catalog", "OnBeforeProductUpdate", Array("My_Class", "OnBeforeProductUpdate"));

Код
class My_Class
   {
      function OnBeforeProductUpdate(&$arFields)
         {
            if (@$_REQUEST['mode']=='import')//импорт из 1с?
         {
         $arFields["PREVIEW_TEXT"]=$arFields["DETAIL_TEXT"];
         }
      }
   }

Подскажите как исправить
Это событие устарело, не сработает если отключена поддержка устаревших событий в модуле каталога.

Попробуйте использовать OnAfterIBlockElementUpdate
Как-то так, не проверял.
Код
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("MyClass", "OnAfterIBlockElementUpdateHandler"));

class MyClass
{
    // создаем обработчик события "OnAfterIBlockElementUpdate"
    function OnAfterIBlockElementUpdateHandler(&$arFields)
    {
           if ($_REQUEST['mode']=='import') {
               $arFields["PREVIEW_TEXT"]=$arFields["DETAIL_TEXT"];
          }
    }
}
Добрый день, Михаил!
Есть задача - не передавать названия складов из 1С, а лучше даже менять при выгрузке

В общем нашел такой вариант:

Код
<?
AddEventHandler(&#39;catalog&#39;, &#39;OnBeforeCatalogStoreUpdate&#39;, &#39;storeUpdateHandler&#39;);
function storeUpdateHandler($storeId, &$arFields) {
   if (isset($_GET[&#39;type&#39;], $_GET[&#39;mode&#39;]) && $_GET[&#39;type&#39;] === &#39;catalog&#39; && $_GET[&#39;mode&#39;] === &#39;import&#39;) 
       {
    $newStoreTitle = $arFields[&#39;TITLE&#39;];
    $res = CCatalogStore::GetList([],[
        "ID"    =>   $storeId
    ]);
    if($ar_res = $res->GetNext()) {
        $oldStoreTitle = $ar_res[&#39;TITLE&#39;];
        if ($newStoreTitle !== $oldStoreTitle) {
            print_r(&#39;На сайте наименование склада #&#39;.$storeId.&#39; (&#39;.$oldStoreTitle.&#39;) отличается от наименования в выгрузке (&#39;.$newStoreTitle.&#39;). Наименование не меняем&#39;.PHP_EOL);            $arFields[&#39;TITLE&#39;] = htmlspecialcharsback($oldStoreTitle);         
        }
   }
    }
}   
?>


Переделал его как-то под ваш, не знаю правильно или нет

Код
<?
AddEventHandler(&#39;catalog&#39;, &#39;OnBeforeCatalogStoreUpdate&#39;, &#39;storeUpdateHandler&#39;);
function storeUpdateHandler($storeId, &$arFields) 
{
   if ($_REQUEST[&#39;mode&#39;]==&#39;import&#39;) 
    {
    unset($arFields[&#39;TITLE&#39;]);
    }
}
?>


но здесь идет отмена, а как заменить? сможете подсказать  
заменить название склада  
Думаю вот так должно получиться

Код
$arFields['TITLE'] = 'NEW NAME';
Здравствуйте! а не подскажите как запретить 1с менять расположение разделов. Ну на пример, я убрал с главной страницы пару разделов в под разделы, но 1с после обмена всё выставляет как у него в 1с структурировано. Изменить саму структуру в 1с нельзя по причине "типа менеджерам магазина так сложно искать товары".))))
Проверить негде, но чисто логически можно
Код
unset($arFields['SECTION_ID']);
unset($arFields['SECTION_CODE']);

Плюс, вроде бы помню это уже обсуждалось в комментариях. Но не точно  :)
Пролистайте всю ветку
https://bazarow.ru/forum/forum1/125-zapretit-izmeneniya-opisaniy-tovarov-pri-vygruzke-iz-1s-ut-na-sayt
Чтобы не запретить обновлять поле торговых предложений CML2_LINK, unset не подойдет.
У меня работает такой код в init.php  (может кому то пригодится):
Код
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
function DoNotUpdate(&$arFields)
{
    if (($_REQUEST['mode']=='import'))
    {
        $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PROPERTY_CML2_LINK");
        $arFilter = Array("IBLOCK_ID"=>"ИД_ИНФОБЛОКА_ТОРГОВЫХ_ПРЕДЛОЖЕНИЙ", "ID"=>$arFields['ID']);
        $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
        while($ob = $res->GetNextElement()){
            $arProps = $ob->GetProperties();
        }
        $arFields['PROPERTY_VALUES'][ИД_СВОЙСТВА_CML2_LINK] = $arProps['CML2_LINK']['VALUE'];
    }
}
Здравствуйте, Михаил. Подскажите, как запретить изменение названия торгового предложения при выгрузке из 1с. При передачи стандартным модулем торговое предложение подставляется в скобках (), что очень неудобно для просмотра. Или как-то удалить эти скобки из наименования в файле /bitrix/php_interface/init.php?
Должно помочь  unset($arFields['NAME']) только еще проверять в каком инфоблоке
Код
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
function DoNotUpdate(&$arFields)
{
    if ($_REQUEST['mode'] == 'import') and 
       ($arFields['IBLOCK_CODE'] == 'offers' // вот тут поковыряйтесь, может там не CODE а XML-ID
    {
        unset($arFields['PREVIEW_PICTURE']);
        unset($arFields['DETAIL_PICTURE']);
        unset($arFields['PREVIEW_TEXT']);
        unset($arFields['DETAIL_TEXT']);
    }
}
Михаил, здравствуйте!

При интеграции необходимо запретить изменения заголовка в существующих товарах, а новые товары загружались как и в 1С, но уже после загрузки на сайт заголовок не мог поменяться при следующей интеграции с 1С.
Запрет при обновлении элемента
Код
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
function DoNotUpdate(&$arFields)
{
    if ($_REQUEST['mode'] == 'import') {
        unset($arFields['NAME']);
    }
}
Добрый день!  При импорте товаров из 1с появляется новый раздел ТОВАРЫ и мои разделы которые создал вручную остаются а вся номенклатура из моих созданных разделов перемещаются именно туда, возможно проставить всем разделам внешние коды (если логически). СПАСБО!
Попробуйте в настройках обмен апоставить галку "Не выгружать верхний уровень разделов если он единственный"
Название написал по памяти, но примерно так звучит
Здравствуйте, Михаил!

Проблема заключается в том, что при очередной интерграции с 1С описание html опять слетает на текст, необходимо чтобы оно оставалось в html,
Цитата
Гость написал:
Здравствуйте, Михаил!
Проблема заключается в том, что при очередной интерграции с 1С описание html опять слетает на текст, необходимо чтобы оно оставалось в html,
И как в быстро их опять перевести в html
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 

Блог-note: заметки разработчика

Не дать купить товара больше, чем находится на определенных складах

Задача: в магазине 20 складов, на всех есть остатки но нужно ограничить покупку товара только остатками на двух складах,...

Ускорение работы сайта на 1С-Битрикс

Данная статья написана специально под видеоролик (приложен в конце статьи), опубликованный на моем ВКVideo канал...

Показать доступный остаток каждого товара в корзине 1С-Битрикс

Задача: показать остаток каждого товара в корзине 1С-Битрикс, что бы покупатель сразу знал предельное колличество товара...

Отфильтровать новости в Битрикс за заданный период

Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компонента "список новостей". Для э...

Добавить СЕО-метатеги в результаты поиска по каталогу

Задача: на странице с результатами поиска по каталогу нужно установить уникальные метатеги: keywords, description, canon...

Автоматический повтор заказа на D7 со списанием с внутреннего счета

На сайте товары и услуги доступны по подписке, пользователи пополняют внутренний счёт, после чего происходит автоматичес...

Хостинг панель BrainyCp: оптимизация под 1С-битрикс

В этой видео-заметке расскажу как установить и оптимизировать панель управления сервером BrainyCp для использования в св...

Fancybox в стандартном шаблоне детальной карточки товара, 1С-Битрикс, вместо всплывающего окна и лупы.

Задача: заменить работу с изображениями в стандартном или кастомном шаблоне детальной карточки (catalog.element)...

Подключение мобильной версии шаблона Битрикс сайта, с автопереключением

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