При разработке сайтов на Битрикс, с интеграцией с 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']); - не даст изменяться названию товара
Поддержать выпуски видео уроков, поблагодарить за полезную инструкцию или заметку можно через:
Юманей
Цитата |
---|
toorr2p написал: Здравствуйте! А как запретить обновление веса товара? |
Где, в этой теме уже был ответ, по моему надо использовать CATALOG_WEIGHT

Цитата |
---|
Guest написал: Здравствуйте, подскажите пожалуйста, мне нужно применить данный запрет только для торговый предложений , а для товаров нужно оставить возможность для перезаписи, как это сделать? заранее спасибо) |
Возможно ли таким же способом запретить смену типа у свойства при обмене с 1с. Из 1с приходит - строка, а нужно html/text

Цитата |
---|
Владимир написал: Добрый день! Возможно ли таким же способом запретить смену типа у свойства при обмене с 1с. Из 1с приходит - строка, а нужно html/text |
Думаю, будет проще сделать это на выводе, в шаблоне. Используйте вместо
Код |
---|
echo $arResult['DETAIL_TEXT'] |
такой вывод
Код |
---|
echo $arResult['~DETAIL_TEXT'] |

Цитата |
---|
Гость Артур написал: Добрый день, прошу помощи в решении такой проблемы, нужно запретить 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())
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"]; } } } |