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

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

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

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

Николай Сухих27.11.2019
Отправил код с ошибкой в названии функции..

Код
// файл /bitrix/php_interface/init.php
AddEventHandler('iblock', 'OnBeforeIBlockSectionUpdate', "OnBeforeImportIBlockSectionHandler");
AddEventHandler('iblock', 'OnBeforeIBlockSectionAdd', 'OnBeforeImportIBlockSectionHandler');
function OnBeforeImportIBlockSectionHandler( &$arFields ) {
   if( 'import' === $_REQUEST['mode'] ) {
      unset($arFields['TITLE'], $arFields['NAME']); // Какой то из них точно имя секции.
   }
}


p.s. без понятий где редактировать модерируемое сообщение.  :(
Николай Сухих27.11.2019
Наверно AddEventHandler('iblock', 'OnBeforeIBlockSectionAdd', 'OnBeforeImportIBlockSectionHandler'); будет излишним если хотите запретить именно имя секции :)
jetdan8614.01.2020
Михаил добрый день,
Не подскажите, а как сделать, чтобы НДС при обмене не выгружался из 1С. Обработчики на стороне сайта  не помогают, все равно налог создается автоматом, если его даже удалить. Поддержка толком ничего сказать не может.
Михаил Базаров15.01.2020
Цитата
jetdan86 написал:
Михаил добрый день,
Не подскажите, а как сделать, чтобы НДС при обмене не выгружался из 1С. Обработчики на стороне сайта  не помогают, все равно налог создается автоматом, если его даже удалить. Поддержка толком ничего сказать не может.
Можно деактивировать НДС после обмена.
1С ка будет его постоянно выгружать или активировать (если деактивирован). Но, можно на это же событие импорта каталога, повесить этот метод:
https://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogvat/update.php
Просто переключая, по заверешение импорта, активность ставки в "N"
jetdan8616.01.2020
Цитата
Михаил Базаров написал:
Цитата
jetdan86 написал:
Михаил добрый день,
Не подскажите, а как сделать, чтобы НДС при обмене не выгружался из 1С. Обработчики на стороне сайта  не помогают, все равно налог создается автоматом, если его даже удалить. Поддержка толком ничего сказать не может.
Можно деактивировать НДС после обмена.
1С ка будет его постоянно выгружать или активировать (если деактивирован). Но, можно на это же событие импорта каталога, повесить этот метод:
https://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogvat/update.php
Просто переключая, по заверешение импорта, активность ставки в "N"
Михаил, а есть пример использования?
jetdan8616.01.2020
Цитата
jetdan86 написал:
Цитата
Михаил Базаров написал:
 
Цитата
jetdan86  написал:
Михаил добрый день,
Не подскажите, а как сделать, чтобы НДС при обмене не выгружался из 1С. Обработчики на стороне сайта  не помогают, все равно налог создается автоматом, если его даже удалить. Поддержка толком ничего сказать не может.
 Можно деактивировать НДС после обмена.
1С ка будет его постоянно выгружать или активировать (если деактивирован). Но, можно на это же событие импорта каталога, повесить этот метод:
 https://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogvat/update.php  
Просто переключая, по заверешение импорта, активность ставки в "N"
Михаил, а есть пример использования?
Попробовал, ставка меняется и налог выключается, но все равно создается налог с новым ID каждый раз при повторении обмена. Видимо есть проверка при обмене, которая проверяет ставку, если 0, то создает новую 20% и я не не знаю как это запретить, поддержка тоже ничем помочь не может.
Виктор Кудрявцев03.02.2020
Добрый день!
Подскажите, пожалуйста, а как заблокировать изменение xml_id значения свойства товара?
Например, есть свойство "цвет" у которого есть значение "белый" для которого xml_id приходит из 1С в виде 9cd8c8f8-41d9-11ea-8106-0050569b108d
Хочется задать мнемонический xml_id - white чтобы красиво в ЧПУ фильтра было. Но это работает до первого полного обмена с 1С который торжественно перезатирает id на 9cd8c8f8-41d9-11ea-8106-0050569b108d
Марк Соколов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 цены, как скопировать значение цены из одной в другую при выгрузке?
Спасибо!
Анна Тищенко26.11.2020
Добрый день. Подскажите, пожалуйста, как решить проблему?
При смене названия категории оставляю URL без изменения, но после новой загрузки из 1С URL категории и всех товаров меняется согласно новому названию и получаю кучу 404. Можно как то отключить автозамену URL, чтобы он оставался такой, как задан изначально?
Андрей Волков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;
}
MERANIK MERANIK28.04.2021
на отрез отказывается работать( уже все перетыкал(
в инит добавил, пробовал и из Д7 вариант подставлять - все равно трет и трет
Данил25.06.2021
Чтоб работало  новых версиях нужно заменить:
Код
$_REQUEST['mode']=='import' 

на

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

Где, в этой теме уже был ответ, по моему надо использовать CATALOG_WEIGHT
Guest02.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']

Случайные заметки

Адаптивное гамбургер меню для битрикс

Просмотров: 13303 Комментариев: 6
Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В архиве готовый шаблон для Битрикс, с адапитивным гамбургер ме...

Настройка прав доступа в 1С-Битрикс

Просмотров: 6439 Комментариев: 0
Часто, в интернет-магазине под управлением 1С Битрикс, нужно создать группу пользователей со специфическими правами. Например: Право управления одним ...

Очистка корзины битрикс одним нажатием

Просмотров: 25484 Комментариев: 5
В стандартной корзине Битрикс не хватает кнопки для полной очистки корзины одним нажатием. Требуется это довольно редко, однако изредка все же необход...