Телеграм: @camouf_ru Почта: mihail@bazarow.ru

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

Просмотров: 16836

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

Например: Из 1С мы выгружаем структуру каталога, цены, торговые предложения и свойства товаров, а описания и картинки добавляем на сайте уже после выгрузки. Во первых, так проще с точки зрения интерфейса, во вторых- это не дает раздуваться базе 1С

Но при обмене, данные добавленные на сайте затираются- так как 1С "видет", что у товара нет описания (в ее базе), а на сайте есть- и подчищает товар

Что бы этого не происходило, можно воспользоваться событиями OnBeforeIBlockElementUpdate и OnBeforeIBlockElementAdd. Просто добавляем в файл /bitrix/php_intarface/init.php (если файла нет-то создаем его)


<?
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
	 function DoNotUpdate(&$arFields)
	 {
		 if ($_REQUEST['mode']=='import')
		 {
			 unset($arFields['PREVIEW_PICTURE']);
			 unset($arFields['DETAIL_PICTURE']);
			 unset($arFields['PREVIEW_TEXT']);
			 unset($arFields['DETAIL_TEXT']);
		 }
	 }
AddEventHandler("iblock", "OnBeforeIBlockElementAdd","DoNotAdd");
	 function DoNotAdd(&$arFields)
	 {
		 if ($_REQUEST['mode']=='import')
		 {
			 unset($arFields['PREVIEW_PICTURE']);
			 unset($arFields['DETAIL_PICTURE']);
			 unset($arFields['PREVIEW_TEXT']);
			 unset($arFields['DETAIL_TEXT']);
		 }
	 }
?>

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

Например: unset($arFields['NAME']); - не даст изменяться названию товара

Михаил Базаров 21.01.2022
Цитата
toorr2p написал:
Здравствуйте! А как запретить обновление веса товара?

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

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

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

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

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

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


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

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

пробовал варианты:
Код
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())
Alex 04.11.2022
Подскажите пожалуйста. Делаю выгрузку на сайт, описание падает в анонс. Написал обработку в init.php но он не срабатывает

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

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

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

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

class MyClass
{
    // создаем обработчик события "OnAfterIBlockElementUpdate"
    function OnAfterIBlockElementUpdateHandler(&$arFields)
    {
           if ($_REQUEST['mode']=='import') {
               $arFields["PREVIEW_TEXT"]=$arFields["DETAIL_TEXT"];
          }
    }
}

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Установка веб-сервера LAMP на ubuntu 20.04 LTS, оптимизированный под ... Просмотров: 11378 В последнее время, плотно пересел c macOS на ubuntu, и решил настроить себе полноценное ра... Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 61196 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Отключить поиск по описаниям товаров в Битрикс Просмотров: 10581 Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разр... Вывести множественное свойство типа файл с названием и весом файла в ... Просмотров: 20138 В этой заметке расскажу как красиво вывести множественное свойство типа файл в инфоблоке 1... Если пользователь авторизован то... API Битрикс Просмотров: 22204 Достаточно часто, при создании сайта на битрикс нужно вывести в шаблон или компонент, неку... Memcached на сайте под управлением битрикс, при использовании Веб Окр... Просмотров: 6908 Если вам важна скорость отдачи сайта, а у вашего сервера медленный диск для использования ... Ускорение работы сайта на 1С-Битрикс Просмотров: 15838 Данная статья написана специально под видеоролик (приложен в конце статьи), опубликованный... Сгенерировать скидочные купоны, при заказе и отправить на почту Просмотров: 744 Задача: после того как пользователь сделал заказ, нужно сгенерировать одноразовые купоны д... Добавление своих полей в почтовые шаблоны Битрикс Просмотров: 43562 Иногда нужно внести свои поля в почтовые шаблоны битрикс. Например: добавить имя и номе... Добавить все свойства инфоблока в умный фильтр одним разом Просмотров: 9888 Если у вас достаточно много свойств, в инфоблоке с товарами, например: больше 1000-чи, пос... Вывести свойство привязка к Яндекс Картам в Битрикс Просмотров: 18143 Часто бывает нужно вывести свойство привязка к Яндекс карте в детальном описании элемента... Фотогалерея на базе компонента новостей, с fancybox. Просмотров: 1512 Это заметка обновление к очень старой, уже имеющейся на сайте. Сделаем что-то типа фотогал... Автоматически помечаем новинки лейблом в каталоге битрикс Просмотров: 5357 Если вы хотите помечать новинки каталога, вашего магазина на Битрикс, лейблом "Новинка". И... Получить множественное пользовательское поле раздела. Значения множес... Просмотров: 341 Задача: У разделов инфоблока есть множественное поле типа список. Зная ID раздела, нужно п... Вывести все разделы в которых находится элемент инфоблока Просмотров: 12970 Если нужно вывести все разделы, со всей доступной информацией о них, внутри элемента инфоб... Сниппеты типографики bootstrap, для Битрикс Просмотров: 7575 Если вы подключили bootstrap к своему сайту, или сверстали весь шаблон, подключив bootstra... Определить местоположение пользователя и показать магазины поблизости... Просмотров: 1142 Задача: в мобильном приложении, которое открывает сайт на 1С-Битрикс внутри себя, нужно оп... Вывести дату окончания скидки в карточке товара Просмотров: 3632 Если нужно вывести информацию о скидке в карточке товара, можно воспользоваться методом Заполнить свойство инфоблока ценой из торгового каталога Просмотров: 4568 Если вам по какой-то причине нужно скопировать цену товара в свойство этого же инфоблока. ... Добавить свойство в административную форму заказа Просмотров: 2770 Задача, кастомизировать административную форму заказа: добавить свойство заказа в шапку фо...