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

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

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

При разработке сайтов на Битрикс, с интеграцией с 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']); - не даст изменяться названию товара

Максим 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())
Михаил Базаров 01.06.2022
Цитата
Гость Артур написал:
Добрый день, прошу помощи в решении такой проблемы, нужно запретить 1с при обмене, изменять Названия свойств каталога и предложений.

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


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

Код
$tmpPropName = $arFields['PROPERTY']['NAME'];
/* здесь случилась перезапись */
$arFields = Array(
    "NAME" => $tmpPropName
);
$ibp = new CIBlockProperty;
if(!$ibp->Update($ID, $arFields))
Гость Артур 31.05.2022
Добрый день, прошу помощи в решении такой проблемы, нужно запретить 1с при обмене, изменять Названия свойств каталога и предложений. У нас несколько номенклатур, и у каждого индивидуальный набор характеристик. Проблема в том что в 1с - характеристики имеют названия Цвет(Платья),Размер(Платья) и тд, соответственно в таком виде и выгружаются на сайт. Я редактирую Цвет(Платья) - в Цвет и тд, но после обмена все возвращается к исходному виду как в 1с. Можно с помощью init.php запретить это делать? Не могу разобраться какие параметры отвечают за эти свойства, чтобы прописать в инит
Михаил Базаров 14.03.2022
Цитата
Владимир написал:
Добрый день!

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

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

такой вывод
Код
echo $arResult['~DETAIL_TEXT']
Владимир 13.03.2022
Добрый день!

Возможно ли таким же способом запретить смену типа у свойства при обмене с 1с. Из 1с приходит - строка, а нужно html/text
Михаил Базаров 02.02.2022
Цитата
Guest написал:
Здравствуйте, подскажите пожалуйста, мне нужно применить данный запрет только для торговый предложений , а для товаров нужно оставить возможность для перезаписи, как это сделать? заранее спасибо)
Добрый. Все ровно тоже самое, просто используйте ID инфоблока с предложениями.
Guest 02.02.2022
Здравствуйте, подскажите пожалуйста, мне нужно применить данный запрет только для торговый предложений , а для товаров нужно оставить возможность для перезаписи, как это сделать? заранее спасибо)
Михаил Базаров 21.01.2022
Цитата
toorr2p написал:
Здравствуйте! А как запретить обновление веса товара?

Где, в этой теме уже был ответ, по моему надо использовать CATALOG_WEIGHT
toorr2p 17.01.2022
Здравствуйте! А как запретить обновление веса товара?

Вот так не получается
Код
\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;
}
Руслан 10.11.2021
Добрый день, подскажите пожалуйста как с помощью init.php
деактивировать товары без детальной картинки и без цены при выгрузки из 1с ?
Михаил Базаров 25.06.2021
Цитата
Данил написал:
Чтоб работало  новых версиях нужно заменить:Код$_REQUEST['mode']=='import' наКод$_REQUEST['Import']=='Y'
Там, можно вообще на D7 все переделать, что бы не использовать устаревшие методы.
Чуть позже дополню заметку. Если у кого-то уже. есть готовый пример на D7 - буду не против если напишите тут)
Данил 25.06.2021
Чтоб работало  новых версиях нужно заменить:
Код
$_REQUEST['mode']=='import' 

на

Код
$_REQUEST['Import']=='Y'
MERANIK MERANIK 28.04.2021
на отрез отказывается работать( уже все перетыкал(
в инит добавил, пробовал и из Д7 вариант подставлять - все равно трет и трет
Андрей Волков 07.04.2021
Относительно НДС и других параметров каталога:
Код
\Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog','\Bitrix\Catalog\Product::OnBeforeUpdate','onBeforeProductUpdate');
function onBeforeProductUpdate(\Bitrix\Main\Entity\Event $event){
   $result     =   new \Bitrix\Main\Entity\EventResult();

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

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

   // модифицируем поля
   if ($_REQUEST['mode']=='import'){
      $arFields['VAT_ID']=   1; // ID нужного НДС
      $arFields['VAT_INCLUDED']=   'Y'; // НДС включен в цену
      $result->modifyFields($arFields);
   }

   return  $result;
}
Анна Тищенко 26.11.2020
Добрый день. Подскажите, пожалуйста, как решить проблему?
При смене названия категории оставляю URL без изменения, но после новой загрузки из 1С URL категории и всех товаров меняется согласно новому названию и получаю кучу 404. Можно как то отключить автозамену URL, чтобы он оставался такой, как задан изначально?
Марк Соколов 20.05.2020
Спасибо за заметку, а как работать с каталогом, ну к примеру, при выгрузке добавить обработчик, что мол если товар не доступен, то его деактивировать, или если цена не пришла, его деактивировать, нашел События:OnSuccessCatalogImport1C
Код
AddEventHandler("catalog", "OnSuccessCatalogImport1C", "DeleteElementImport1COs");
function MyOnSuccessImportOs($arEvent)
{
CModule::IncludeModule('iblock');
$c = 0; 
$obE = new CIBlockElement(); 
$arFilterWin = Array("IBLOCK_ID"=>инфоблокID, "QUANTITY" => 0, "ACTIVE" => "Y");
$resWin = CIBlockElement::GetList(Array("sort"=>"asc"), $arFilterWin, false, false, false);
while($obWin = $resWin->Fetch())
{
    $arFields_update = Array(
        "ACTIVE" => "N",
        "IBLOCK_ID" => инфоблокID,
    );
    if ($obE->Update($obWin["ID"], $arFields_update)){
        $c++;
    }
}
}
или к примеру приходит 2 цены, как скопировать значение цены из одной в другую при выгрузке?
Спасибо!
Виктор Кудрявцев 03.02.2020
Добрый день!
Подскажите, пожалуйста, а как заблокировать изменение xml_id значения свойства товара?
Например, есть свойство "цвет" у которого есть значение "белый" для которого xml_id приходит из 1С в виде 9cd8c8f8-41d9-11ea-8106-0050569b108d
Хочется задать мнемонический xml_id - white чтобы красиво в ЧПУ фильтра было. Но это работает до первого полного обмена с 1С который торжественно перезатирает id на 9cd8c8f8-41d9-11ea-8106-0050569b108d
jetdan86 16.01.2020
Цитата
jetdan86 написал:
Цитата
Михаил Базаров написал:
 
Цитата
jetdan86  написал:
Михаил добрый день,
Не подскажите, а как сделать, чтобы НДС при обмене не выгружался из 1С. Обработчики на стороне сайта  не помогают, все равно налог создается автоматом, если его даже удалить. Поддержка толком ничего сказать не может.
 Можно деактивировать НДС после обмена.
1С ка будет его постоянно выгружать или активировать (если деактивирован). Но, можно на это же событие импорта каталога, повесить этот метод:
 https://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogvat/update.php  
Просто переключая, по заверешение импорта, активность ставки в "N"
Михаил, а есть пример использования?
Попробовал, ставка меняется и налог выключается, но все равно создается налог с новым ID каждый раз при повторении обмена. Видимо есть проверка при обмене, которая проверяет ставку, если 0, то создает новую 20% и я не не знаю как это запретить, поддержка тоже ничем помочь не может.
jetdan86 16.01.2020
Цитата
Михаил Базаров написал:
Цитата
jetdan86 написал:
Михаил добрый день,
Не подскажите, а как сделать, чтобы НДС при обмене не выгружался из 1С. Обработчики на стороне сайта  не помогают, все равно налог создается автоматом, если его даже удалить. Поддержка толком ничего сказать не может.
Можно деактивировать НДС после обмена.
1С ка будет его постоянно выгружать или активировать (если деактивирован). Но, можно на это же событие импорта каталога, повесить этот метод:
https://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogvat/update.php
Просто переключая, по заверешение импорта, активность ставки в "N"
Михаил, а есть пример использования?
Михаил Базаров 15.01.2020
Цитата
jetdan86 написал:
Михаил добрый день,
Не подскажите, а как сделать, чтобы НДС при обмене не выгружался из 1С. Обработчики на стороне сайта  не помогают, все равно налог создается автоматом, если его даже удалить. Поддержка толком ничего сказать не может.
Можно деактивировать НДС после обмена.
1С ка будет его постоянно выгружать или активировать (если деактивирован). Но, можно на это же событие импорта каталога, повесить этот метод:
https://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogvat/update.php
Просто переключая, по заверешение импорта, активность ставки в "N"

Работы из портфолио

В портфолио не публикуются работы, доля моего участия в которых менее 80%.
Часто обращаются за доработками уже существующих проектов или реализацией не стандратного функционала на готовых сайтах.