Меню

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

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

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

на

Код
$_REQUEST['Import']=='Y'
 
Цитата
Данил написал:
Чтоб работало  новых версиях нужно заменить:Код$_REQUEST['mode']=='import' наКод$_REQUEST['Import']=='Y'
Там, можно вообще на D7 все переделать, что бы не использовать устаревшие методы.
Чуть позже дополню заметку. Если у кого-то уже. есть готовый пример на D7 - буду не против если напишите тут)
Изменено: Михаил Базаров - 25.06.2021 21:20:33
 
Добрый день, подскажите пожалуйста как с помощью init.php
деактивировать товары без детальной картинки и без цены при выгрузки из 1с ?
 
Здравствуйте! А как запретить обновление веса товара?

Вот так не получается
Код
\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;
}
 
Цитата
toorr2p написал:
Здравствуйте! А как запретить обновление веса товара?

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

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

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

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

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

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


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

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

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

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

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

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

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

class MyClass
{
    // создаем обработчик события "OnAfterIBlockElementUpdate"
    function OnAfterIBlockElementUpdateHandler(&$arFields)
    {
           if ($_REQUEST['mode']=='import') {
               $arFields["PREVIEW_TEXT"]=$arFields["DETAIL_TEXT"];
          }
    }
}
Изменено: Михаил Базаров - 04.11.2022 16:14:45
 
Добрый день, Михаил!
Есть задача - не передавать названия складов из 1С, а лучше даже менять при выгрузке

В общем нашел такой вариант:

Код
<?
AddEventHandler(&#39;catalog&#39;, &#39;OnBeforeCatalogStoreUpdate&#39;, &#39;storeUpdateHandler&#39;);
function storeUpdateHandler($storeId, &$arFields) {
   if (isset($_GET[&#39;type&#39;], $_GET[&#39;mode&#39;]) && $_GET[&#39;type&#39;] === &#39;catalog&#39; && $_GET[&#39;mode&#39;] === &#39;import&#39;) 
       {
    $newStoreTitle = $arFields[&#39;TITLE&#39;];
    $res = CCatalogStore::GetList([],[
        "ID"    =>   $storeId
    ]);
    if($ar_res = $res->GetNext()) {
        $oldStoreTitle = $ar_res[&#39;TITLE&#39;];
        if ($newStoreTitle !== $oldStoreTitle) {
            print_r(&#39;На сайте наименование склада #&#39;.$storeId.&#39; (&#39;.$oldStoreTitle.&#39;) отличается от наименования в выгрузке (&#39;.$newStoreTitle.&#39;). Наименование не меняем&#39;.PHP_EOL);            $arFields[&#39;TITLE&#39;] = htmlspecialcharsback($oldStoreTitle);         
        }
   }
    }
}   
?>


Переделал его как-то под ваш, не знаю правильно или нет

Код
<?
AddEventHandler(&#39;catalog&#39;, &#39;OnBeforeCatalogStoreUpdate&#39;, &#39;storeUpdateHandler&#39;);
function storeUpdateHandler($storeId, &$arFields) 
{
   if ($_REQUEST[&#39;mode&#39;]==&#39;import&#39;) 
    {
    unset($arFields[&#39;TITLE&#39;]);
    }
}
?>


но здесь идет отмена, а как заменить? сможете подсказать  
Изменено: Михаил Базаров - 22.03.2023 09:50:08
 
заменить название склада  
 
Думаю вот так должно получиться

Код
$arFields['TITLE'] = 'NEW NAME';
 
Здравствуйте! а не подскажите как запретить 1с менять расположение разделов. Ну на пример, я убрал с главной страницы пару разделов в под разделы, но 1с после обмена всё выставляет как у него в 1с структурировано. Изменить саму структуру в 1с нельзя по причине "типа менеджерам магазина так сложно искать товары".))))
 
Проверить негде, но чисто логически можно
Код
unset($arFields['SECTION_ID']);
unset($arFields['SECTION_CODE']);

Плюс, вроде бы помню это уже обсуждалось в комментариях. Но не точно  :)
Пролистайте всю ветку
https://bazarow.ru/forum/forum1/125-zapretit-izmeneniya-opisaniy-tovarov-pri-vygruzke-iz-1s-ut-na-sayt
 
Чтобы не запретить обновлять поле торговых предложений CML2_LINK, unset не подойдет.
У меня работает такой код в init.php  (может кому то пригодится):
Код
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
function DoNotUpdate(&$arFields)
{
    if (($_REQUEST['mode']=='import'))
    {
        $arSelect = Array("ID", "IBLOCK_ID", "NAME", "PROPERTY_CML2_LINK");
        $arFilter = Array("IBLOCK_ID"=>"ИД_ИНФОБЛОКА_ТОРГОВЫХ_ПРЕДЛОЖЕНИЙ", "ID"=>$arFields['ID']);
        $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
        while($ob = $res->GetNextElement()){
            $arProps = $ob->GetProperties();
        }
        $arFields['PROPERTY_VALUES'][ИД_СВОЙСТВА_CML2_LINK] = $arProps['CML2_LINK']['VALUE'];
    }
}
Ответить
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst

Блог-note: заметки разработчика

Время на БД и веб сервере отличается на 3600 секунд, тест Битрикс

Достаточно часто, при проверке параметров системы, в Битрикс, можно увидеть одну из ошибок: Время на БД и на сервере- Вр...

Цвета из справочника Highload блоков в списке новостей

На сайте выводятся новости с помощью компонента news.list, при этом у новостей есть свойство "Цвета" типа &quo...

Вывести разделы инфоблока в которых находится элемент Битрикс

Если нужно в карточке товара или новости, вывести структуру разделов в котором находится элемент. С одной стороны, это у...

Многосайтовость битрикс на разных доменах и поддоменах

Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать небольшое видео в котором уст...

Уникальная СЕО информация для каждого торгового предложения в каталоге 1С-Битрикс

Задача: реализовать уникальную мета-информацию для каждого SKU в каталоге. У каждого ТП должны быть свои: заголовок h1, ...

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

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

Если товар в корзине, поменять значение input на "В корзине"

Если Вам нужно поменять текст на кнопке, добавляющей товар в корзину, достаточно воспользоваться методом API "CSaleBaske...

Вывести множественное свойство типа файл с названием и весом файла в Битрикс

В этой заметке расскажу как красиво вывести множественное свойство типа файл в инфоблоке 1С-Битрикс. С показом оригиналь...

Удаление недоступных для заказа товаров из корзины

Задача: пользователи магазина могу наполнять корзины, но не доходить до оформления заказа. Такие корзины считаются броше...