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

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

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

При разработке сайтов на Битрикс, с интеграцией с 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-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Вывести новости из конкретного раздела инфоблока Битрикс Просмотров: 55236 Бывает что требуется вывести конкретные новости или статьи из одного раздела инфоблока в Б... Вывести общее количество товаров в шаблоне корзины 1С-Битрикс Просмотров: 7033 Задача: вывести общее количество товаров в корзине (именно количество единиц товара, а не ... Спойлер в списке новостей Битрикс Просмотров: 12178 Иногда нужно сделать спойлеры в копонентах Битрикс, в основном конечно, имеет смысл при оч... Хостинг панель BrainyCp: оптимизация под 1С-битрикс Просмотров: 8131 В этой видео-заметке расскажу как установить и оптимизировать панель управления сервером B... Отфильтровать новости в Битрикс за заданный период Просмотров: 16690 Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компо... Заполнить картинки разделов каталога из картинок товаров Просмотров: 944 Задача: в каталоге, разделы и подразделы выводятся в виде плитки над товарами, с картинкам... Простые калькуляторы в карточке товара каталога на Битрикс Просмотров: 16174 На одном из создаваемых сайтов было необходимо сделать небольшой калькулятор и предварител... Ускорение работы сайта на 1С-Битрикс Просмотров: 17734 Данная статья написана специально под видеоролик (приложен в конце статьи), опубликованный... Очистить брошенные корзины с помощью API 1С-Битрикс Просмотров: 1121 Задача: в интернет-магазине накапливается большое количество брошенных корзин, нужно их оч... Заполнить свойство инфоблока ценой из торгового каталога Просмотров: 5090 Если вам по какой-то причине нужно скопировать цену товара в свойство этого же инфоблока. ... Определить местоположение пользователя и показать магазины поблизости... Просмотров: 1831 Задача: в мобильном приложении, которое открывает сайт на 1С-Битрикс внутри себя, нужно оп... Запретить изменения описаний товаров при выгрузке из 1С УТ на сайт Просмотров: 18106 При разработке сайтов на Битрикс, с интеграцией с 1С Управление Тороговлей, нужно запретит... Вывод элементов с помощью API битрикс Просмотров: 23961 Иногда, выводить элементы инфоблока с помощью компонентов, может оказаться избыточным. Нап... Вывести компонент новостей на страницу в Битрикс Просмотров: 65106 Посмотрел Яндекс метрику на свой сайт, и решил что буду частенько писать сюда именно то, ч... Установка вебсервера на Apple M1 (нативный ARM стек), оптимизированны... Просмотров: 7405 Появилась задачка, установить стек MAMP (macOS, Apache, MYSQL, PHP) на рабочий ноутбук с п... Цвета торговых предложений из Highload инфоблоков в списке товаров Просмотров: 14905 Подвернулся на доработку очень старый сайт, работал еще на 11-ой версии Битрикс. Выполнили... Самодельная форма добавления элемента на API Битрикс Просмотров: 45276 Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изр... Вывести артикул в печатную форму бланка заказа Просмотров: 1073 Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе. ... Вывести разделы инфоблока в которых находится элемент Битрикс Просмотров: 17017 Если нужно в карточке товара или новости, вывести структуру разделов в котором находится э... Сгенерировать скидочные купоны, при заказе и отправить на почту Просмотров: 1693 Задача: после того как пользователь сделал заказ, нужно сгенерировать одноразовые купоны д...