Меню

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

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

Достаточно часто, при разработке сайтов на Битрикс, с интеграцией с 1С Управление Тороговлей, нужно запретить изменения полей при обмен. В частности, детальное описание и картинку товара.
Ответить
Ответы
 
Цитата
Данил написал:
Чтоб работало  новых версиях нужно заменить:Код$_REQUEST['mode']=='import' наКод$_REQUEST['Import']=='Y'
Там, можно вообще на D7 все переделать, что бы не использовать устаревшие методы.
Чуть позже дополню заметку. Если у кого-то уже. есть готовый пример на D7 - буду не против если напишите тут)
Изменено: Михаил Базаров - 25.06.2021 21:20:33
 
Добрый день, подскажите пожалуйста как с помощью 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
Изменено: Михаил Базаров - 27.07.2023 15:15:47
 
Здравствуйте, подскажите пожалуйста, мне нужно применить данный запрет только для торговый предложений , а для товаров нужно оставить возможность для перезаписи, как это сделать? заранее спасибо)
 
Цитата
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))
Изменено: Михаил Базаров - 01.06.2022 10:05:09
 
А не подскажете, как отменить добавление товара? То есть, фактически требуется только обновлять товары, имеющиеся на сайте, не добавляя новых.

пробовал варианты:
Код
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"];
         }
      }
   }

Подскажите как исправить
Изменено: Михаил Базаров - 04.11.2022 16:08:36
 
Это событие устарело, не сработает если отключена поддержка устаревших событий в модуле каталога.

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

class MyClass
{
    // создаем обработчик события "OnAfterIBlockElementUpdate"
    function OnAfterIBlockElementUpdateHandler(&$arFields)
    {
           if ($_REQUEST['mode']=='import') {
               $arFields["PREVIEW_TEXT"]=$arFields["DETAIL_TEXT"];
          }
    }
}
Изменено: Михаил Базаров - 04.11.2022 16:14:45
 
Добрый день, Михаил!
Есть задача - не передавать названия складов из 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;]);
    }
}
?>


но здесь идет отмена, а как заменить? сможете подсказать  
Изменено: Михаил Базаров - 22.03.2023 09:50:08
 
заменить название склада  
 
Думаю вот так должно получиться

Код
$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']);
    }
}
Ответить
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst

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

Как выводить пользовательские поля и названия разделов инфоблока в Битриксе

Если вам необходимо вывести дополнительное пользовательское поле типа "Привязка к разделам инфоблока", эта записка может...

Заполнить коэффициент единицы измерения (MEASURE_RATIO) из свойства элемента

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

Увеличение диска на готовой виртуальной машине Битрикс

Как всем известно, на официальном сайте 1С-битрикс можно скачать готовую виртуальную машину максимально сконфигурированн...

Как получить свойства заказа в 1С-Битрикс: старые методы и современный API D7

Задача: Получить все доступные свойства заказа для всех активных типов плательщика из модуля магазина.

Рассылка новинок каталога в автоматическом режиме

Что бы реализовать рассылку новинок каталога на email-ы пользователей, можно воспользоваться событием OnBeforeIBlockElem...

Сортировать товары по названию, цене и свойствам в каталоге 1С-Битрикс

Задача: реализовать возможность сортировки товаров в разделах каталога. Сортировка должна работать с использованием AJAX...

Ajax форма обратной связи, реализация в битрикс

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

Переключатель валюты в каталоге 1С-Битрикс

Задача: Дать пользователю возможность самостоятельно выбирать валюту, в которой он хочет видеть цены, в разделе каталога...

Создание скидки на общую сумму покупки в Битрикс корзине

Функционал интернет-магазина, работающего под управлением 1С Битрикс, позволяет задавать множество условий скидок в корз...