Меню

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

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

Достаточно часто, при разработке сайтов на Битрикс, с интеграцией с 1С Управление Тороговлей, нужно запретить изменения полей при обмен. В частности, детальное описание и картинку товара.
Здравствуйте, Михаил.
Заметка очень помогла.
В данный момент например у нас такая ситуация, создали в 1С новый товар, добавили ему фотографию, выполнили выгрузку в режиме изменений, товар на сайте появился, но без фото. Можно в вашем коде условие поставить, если на сайте товар без фото то при обмене мы ему цепляем картинку из 1С, если таковая приходит при обмене, а то при вашем коде получается сейчас, что картинки из 1С не цепляются к товарам?
Надеюсь понятно объяснил. Спасибо.
Олег Колчугин, эм, закомментить? ;)
Код
///unset($arFields['PREVIEW_PICTURE']);  
//unset($arFields['DETAIL_PICTURE']);
Так это получается, если я правильно понял, можно запретить 1с перемещать весь товар под свою структуру каталога? Просто  пытаюсь реализовать на сайте каталог отличимый от 1с, в модуле обмена настроек нет, по этому решил попробовать выгрузить как есть, раскидать как нужно, но оно всё откатывается при обмене
Тут сложнее. На одном из проектов, сделал так что бы структура каталогов вообще не выгружалась, а товары обновлялись по XML-ID.
Новые товара попадали в деактивированный раздел "Рассортировать"

Но это сложность. Лучше поставте модуль обмена от Битрикс, там можно пересортировывать структуру как угодно, чисто для обмена.
Интересно, а запретить обновлять названия и адреса складов можно таким методом?
Можно совет? Эта доработка прекрасно работает, фото и описания теперь не удаляются. Но есть мелкая проблема -  описания товаров  переключаются в режим текст, а у меня они в визуальном режиме сделаны и получается мусор.
Можно ли как-то запретить в битриксе или в в инит добавить строчку переключение  с визуального режима редактирования? Да, я нуб.  
Спасибо. Нужно было запретить 1с менять признак активности товара. Чтобы была возможность скрыть определенные товары с сайта.

Прописал в function DoNotUpdate(&$arFields) значение  
Код
unset($arFields['ACTIVE']); 
 
и все заработало.
Цитата
Barmi пишет:
Можно совет? Эта доработка прекрасно работает, фото и описания теперь не удаляются. Но есть мелкая проблема - описания товаров переключаются в режим текст, а у меня они в визуальном режиме сделаны и получается мусор. Вот так.
вот такой мусор получается... не красиво
Можно ли как-то запретить в битриксе или в в инит добавить строчку переключение с визуального режима редактирования? Да, я нуб.
Нашел простейшее решение своей проблемы.
В поле текстового описания в 1С вставляется любой форматированный кусок текста, и описания из базы остаются нормально отформатированными :-) Например

<p>
    Самый современный игровой компьютер

этого достаточно чтобы не слетало на текстовый редактор.  
"Добрый день!

Не могу запретить удаление дополнительных картинок. Видимо потому, что это множественное поле. Всё отрабатывает, кроме доп. картинок.

<?
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
function DoNotUpdate(&$arFields)
{
   if ($_REQUEST['mode']=='import')
   {
       unset($arFields['PREVIEW_PICTURE']); // фото анонс
       unset($arFields['DETAIL_PICTURE']); // фото подробно
       unset($arFields['MORE_PHOTO']); // Картинки (дополнительные фото)
       unset($arFields['PREVIEW_TEXT']); // Описание для анонса
       unset($arFields['PREVIEW_TEXT_TYPE']); // Тип Описание для анонса
       unset($arFields['DETAIL_TEXT']); // Детальное описание
       unset($arFields['DETAIL_TEXT_TYPE']); // Тип Детальное описание
   }
}
Наверное, раз уж вообще ни какие картинки не обновляете, проще отключить обмен картинками на стороне 1С. Просто снимите там галку "Выгружать картинки и файлы"  
Логично  ;)

Спасибо - помогло.
Цитата
Михаил Базаров пишет:
Цитата
logins.zavgsg@gmail.com написал:
Сергей, <br/>, <br/>

Добрый день!

Не могу запретить удаление дополнительных картинок. Видимо потому, что это множественное поле. Всё отрабатывает, кроме доп. картинок.
Наверное, раз уж вообще ни какие картинки не обновляете, проще отключить обмен картинками на стороне 1С. Просто снимите там галку "Выгружать картинки и файлы"
Все настройки облазил, но так и не нашел где этот пункт, с галкой на "выгружать картинки и файлы".  Ткните пальцем неумному :-)
Цитата

Все настройки облазил, но так и не нашел где этот пункт, с галкой на "выгружать картинки и файлы". Ткните пальцем неумному
Нашел. Видимо в старой УТ не нашел, после обновления галка есть :-)  
Цитата
Михаил Базаров пишет:
Цитата
denis86 написал:
Михаил добрый день,
Подскажите, а как сделать, чтобы не слетали свойства товара при выгрузке из 1с? У нас есть свойство с типом список, постоянно слетает при обмене.
unset($arFields['PROPERTY_КОД_СВОЙСТВА']  ;)  ;
или
unset($arFields['PROPERTY_КОД_СВОЙСТВА_VALUE']  ;)  ;

Попробуйте и так и сяк и вместе.
Cкорее всего вместе, что бы не слетали на само свойство ни его значения

Чирканите сюда, как сработало.
Если еще актуально, в $arFields передается массив PROPERTY_VALUES, и по ИД свойства его можно отвязать, например у меня св-во MORE_PHOTO имеет ИД 93, таким образом на выходы получаем: unset($arFields['PROPERTY_VALUES'][93] ;) ;
Спасибо огромное! Все работает, но возникла проблема с запретом на обновление поля "остатки", необходимо что бы обмен с 1С не обновлял его(т.е. все товары условно в 0, торгуем со склада партнера).
Попробовала сделать по аналогии         unset($arFields['QUANTITY'] ) ;  - все равно меняется.
Цитата
Настёна Лукашевич написал:
Спасибо огромное! Все работает, но возникла проблема с запретом на обновление поля "остатки", необходимо что бы обмен с 1С не обновлял его(т.е. все товары условно в 0, торгуем со склада партнера).
Попробовала сделать по аналогии         unset($arFields['QUANTITY'] ) ;  - все равно меняется.
По моему, поле называется CATALOG_ QUANTITY - сейчас не где посмотреть. Но там точно QUANTITY и что-то еще
Или вообще, на стороне 1С, отключите обмен остатками, а на стороне сайта отключите Количественный учет и включите разрешение "Продавать при отсутствии товара (включая разрешение на отрицательные остатки)"
Цитата
Михаил Базаров пишет:
Цитата
Настёна Лукашевич написал:
Спасибо огромное! Все работает, но возникла проблема с запретом на обновление поля "остатки", необходимо что бы обмен с 1С не обновлял его(т.е. все товары условно в 0, торгуем со склада партнера).
Попробовала сделать по аналогии unset($arFields['QUANTITY'] ) ; - все равно меняется.
По моему, поле называется CATALOG_ QUANTITY - сейчас не где посмотреть. Но там точно QUANTITY и что-то еще
Или вообще, на стороне 1С, отключите обмен остатками, а на стороне сайта отключите Количественный учет и включите разрешение "Продавать при отсутствии товара (включая разрешение на отрицательные остатки)"
Работает!!! Супер! К слову тех поддержка готового решения не смогла подсказать этот вариант.
Друзья, стоит задача УТ 11.
Битрикс последний.
Скрытый текст

Потому что не DETAIL_PICTURE_SRC и PROPERTY_DETAIL_PICTURE, а просто DETAIL_PICTURE
Подскажите, кто пользуется этим кодом. У всех работает? то ли обновления новые что-то изменили, то ли что-то еще пошло не так. Файл init работает(если сделать ошибку сайт уходит в белый экран и возвращается после корректировки) при этому даже изменение названия обработчика AddEventHandler тоже "видит" как ошибку. При этом упорно игнорирует все что прошено. Т.е. поля при обмене перезатираются, хотя он работал.  
Цитата
Настёна Лукашевич написал:
AddEventHandler
Да, надо поиграться с D7

Аналоги функции в новом ядре D7:
Bitrix\Main\EventManager::addEventHandler (новый формат)
Bitrix\Main\EventManager::addEventHandlerCompatible

У меня пока нет времени и негде попробовать. Если кто сделат раньше, будет замечательно если напишите сюда  :)  
Все оказалось немного интересней, из всего кода не работает именно CATALOG_QUANTITY, имея и тексты блокируются для изменения, картинки не пробовала. Теперь вообще загадка  :o
Вопрос решился с другой стороны, нужно было проверить узел обмена 1С. Случайно обнаружили что по одним видам обмена он игнорирует и затирает поле доступное количество, по другим не трогает его. По итогу оказалось что корректно работающий узел обмена настроен на ГРУППЫ НОМЕНКЛАТУРЫ, а не корректно работающий на ВИДЫ НОМЕНКЛАТУРЫ. Попытка подменить в корректно работающем узле папку на нужную  прошла удачно, т.е. не от папки самой зависит, а именно от настроек узла обмена. Задала вопрос 1С специалисту, который формировал узлы откуда взялась разница в настройках и почему они могут так игнорить, предполагаю что внятного ответа не будет, просто поменяем все на работающий вариант  и успокоимся. У нас если что КА8,3, узел обмена встроенный.
Добрый день Михаил!  Есть такой вопрос, а точнее проблема. Данный способ помог мне решить проблему с описанием, но хотелось бы решить проблему с выгрузкой веса из 1с УТ в битрикс. Дело в том что на стороне битрикса контент редактор, при заполнении описания, характеристик и фотографий, заполняет параметры веса, длины, ширины и высоты (вкладка "торговый каталог") в карточке товара. После обмена с 1с УТ10.3,параметр веса затирается и ставится значение "0" Возможно ли запретить изменения веса после обмена с 1с УТ таким способом?
Цитата
Павел Ерофеев написал:
Добрый день Михаил!  Есть такой вопрос, а точнее проблема. Данный способ помог мне решить проблему с описанием, но хотелось бы решить проблему с выгрузкой веса из 1с УТ в битрикс. Дело в том что на стороне битрикса контент редактор, при заполнении описания, характеристик и фотографий, заполняет параметры веса, длины, ширины и высоты (вкладка "торговый каталог") в карточке товара. После обмена с 1с УТ10.3,параметр веса затирается и ставится значение "0" Возможно ли запретить изменения веса после обмена с 1с УТ таким способом?
По идее должно сработать

Код
unset($arFields['WEIGHT']); 
unset($arFields['WIDTH']); 
unset($arFields['HEIGH']); 
unset($arFields['LENGTH']); 
Либо
Код
unset($arFields['CATALOG_WEIGHT']);  
unset($arFields['CATALOG_WIDTH']);  
unset($arFields['CATALOG_HEIGH']);   
unset($arFields['CATALOG_LENGTH']); 
Попробуйте и так и так. Только сохранитесь сначала, на всякий
Цитата
Михаил Базаров пишет:
Цитата
Павел Ерофеев написал:
Добрый день Михаил! Есть такой вопрос, а точнее проблема. Данный способ помог мне решить проблему с описанием, но хотелось бы решить проблему с выгрузкой веса из 1с УТ в битрикс. Дело в том что на стороне битрикса контент редактор, при заполнении описания, характеристик и фотографий, заполняет параметры веса, длины, ширины и высоты (вкладка "торговый каталог"  ;)  в карточке товара. После обмена с 1с УТ10.3,параметр веса затирается и ставится значение "0" Возможно ли запретить изменения веса после обмена с 1с УТ таким способом?
По идее должно сработать

Код
 unset($arFields['WEIGHT']); 
unset($arFields['WIDTH']); 
unset($arFields['HEIGH']); 
unset($arFields['LENGTH']); 
 
Либо
Код
 unset($arFields['CATALOG_WEIGHT']);  
unset($arFields['CATALOG_WIDTH']);  
unset($arFields['CATALOG_HEIGH']);   
unset($arFields['CATALOG_LENGTH']);  
Попробуйте и так и так. Только сохранитесь сначала, на всякий
добавлял и тот и другой вариант к коду, делал обмен но все равно затирает значение веса.
Код у меня получался такой. Но ничего не работает.
Код
<? 
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']);
    unset($arFields['CATALOG_WEIGHT']);
    unset($arFields['CATALOG_WIDTH']);
    unset($arFields['CATALOG_HEIGH']);
    unset($arFields['CATALOG_LENGTH']);
 }
} 
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['CATALOG_WEIGHT']);
    unset($arFields['CATALOG_WIDTH']);
    unset($arFields['CATALOG_HEIGH']);
    unset($arFields['CATALOG_LENGTH']);
 }
} 
?> 
Цитата
Павел Ерофеев пишет:  добавлял и тот и другой вариант к коду, делал обмен но все равно затирает значение веса.
А попробуйте еще модуль каталога подключить в событие
Цитата
CModule::IncludeModule('catalog');
Цитата
Михаил Базаров пишет:
Цитата
Павел Ерофеев пишет: добавлял и тот и другой вариант к коду, делал обмен но все равно затирает значение веса.
А попробуйте еще модуль каталога подключить в событие
Цитата
CModule::IncludeModule('catalog');
Прошу прощения, наверное вопрос глупый) как мне это событие подключить? Тоже прописать его в init.php? каким образом?
Михаил, здравствуйте.

У нас один товар присутствует в нескольких разделах. При этом в товаре выбран основной раздел:




При выгрузке из 1c этот параметр меняется.

Пробовал следующее
Код
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate"); 
function DoNotUpdate(&$arFields) 
{ 
    if ($_REQUEST['mode']=='import') 
    {  
        unset($arFields['IBLOCK_ELEMENT_SECTION_ID']);        
       
    } 
} 
 

Пробовал
Код
unset($arFields['IBLOCK_SECTION']);

Также в сети находил инструкцию https://habr.com/ru/sandbox/88796/
и пробовал такую функцию:

Код
function SaveInOldSection(&$arFields)
{
    if (@$_REQUEST['mode']=='import') {
        $db_old_groups = CIBlockElement::GetElementGroups($arFields['ID'], true);
        while($ar_group = $db_old_groups->Fetch()) {
         if(!in_array($ar_group['ID'],$arFields['IBLOCK_SECTION'])) {
                $arFields['IBLOCK_SECTION'][]=$ar_group['ID'];
         }
        }
    }
}
Все равно при выгрузке из 1с меняется основной раздел товара.

Можете подсказать куда копать?  
Цитата
Денис Палицын пишет:
Все равно при выгрузке из 1с меняется основной раздел товара.
ХМММ вопрос решил, помогло
Код
unset($arFields['IBLOCK_ELEMENT_SECTION_ID']); 
unset($arFields['IBLOCK_SECTION']); 
Хотя до этого не работало....
Такой вопрос: если в какой-то момент понадобится сделать выгрузку из 1С, разово, - как быть в таком случае? Сохранить имеющиеся описания/наименования и склеить их с 1С-ными.
Цитата
Top Gun написал:
Такой вопрос: если в какой-то момент понадобится сделать выгрузку из 1С, разово, - как быть в таком случае? Сохранить имеющиеся описания/наименования и склеить их с 1С-ными.
Если товары те же самые, можно сначала экспортировать в xml. Обменяться с 1С и по верх импортировать старый каталог.
Но, само собой, предварительно сохраниться
Здравствуйте, Михаил! Есть следующая проблема - при выгрузке из 1С создается свойство MORE_PHOTO в инфоблоке каталога. Выше. что выше это обсуждалось. Не нашли решение?

У меня в init.php следующий код:

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['CML2_ARTICLE']);
      unset($arFields['MORE_PHOTO']);
       unset($arFields['CML2_PICTURES']);
      unset($arFields['ELEMENT_CODE']);
  }
}

Но это не помогает. Пробовал вместо $arFields['MORE_PHOTO']) ставить $arFields['PROPERTY_MORE_PHOTO']). Безрезультатно.
Все равно создается и дублирует уже созданное такое же свойство. Из-за этого дополнительные картинки на сайте перестают отобрадаться.

Галочка в модуле обмена "Выгружать картинки и файлы" не стоит, ни в товарах, ни в торговых предложениях. Но это поле все время создается. Есть какие-нибудь решения? Сможете что-то подсказать?
Еще забыл указать, что версия  Битрикс самая новая, но при этом включена поддержка старых событий
Цитата
selakonst@ya.ru написал:
Еще забыл указать, что версия  Битрикс самая новая, но при этом включена поддержка старых событий
Так с ходу не подскажу, и проверить сейчас негде.
Но как варианты, можно вообще без этой нагрузки обойтись:

1) Простой. Создать под доп. картинки отдельное свойство, которого вообще нет в реквизитах 1С. Например: MORE_PHOTO_2
А штатное, пусть себе болтается пустое (можно спрятать из редактирования элемента- чтоб не раздражало)

2) Сложный: Вынести обработчик импорта в свое пространство имен и доработать- выкинуть обработку картинок (там внимательно, есть еще обработка фалов - не картинок)

PS: Последнее время, стараюсь вообще не "перебарщивать" с init.php - если можно обойтись без его раздувания, прикладываю максимум усилий )
Подозреваю что так..

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

..тоже должно работать
Отправил код с ошибкой в названии функции..

Код
// файл /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. без понятий где редактировать модерируемое сообщение.  :(  
Наверно AddEventHandler('iblock', 'OnBeforeIBlockSectionAdd', 'OnBeforeImportIBlockSectionHandler'); будет излишним если хотите запретить именно имя секции :)
Михаил добрый день,
Не подскажите, а как сделать, чтобы НДС при обмене не выгружался из 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 - буду не против если напишите тут)
Добрый день, подскажите пожалуйста как с помощью 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
Здравствуйте, подскажите пожалуйста, мне нужно применить данный запрет только для торговый предложений , а для товаров нужно оставить возможность для перезаписи, как это сделать? заранее спасибо)
Цитата
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))
А не подскажете, как отменить добавление товара? То есть, фактически требуется только обновлять товары, имеющиеся на сайте, не добавляя новых.

пробовал варианты:
Код
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[&#39;mode&#39;]==&#39;import&#39;)//импорт из 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"];
          }
    }
}
Добрый день, Михаил!
Есть задача - не передавать названия складов из 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;]);
    }
}
?>


но здесь идет отмена, а как заменить? сможете подсказать  
заменить название склада  
Думаю вот так должно получиться

Код
$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'];
    }
}
Здравствуйте, Михаил. Подскажите, как запретить изменение названия торгового предложения при выгрузке из 1с. При передачи стандартным модулем торговое предложение подставляется в скобках (), что очень неудобно для просмотра. Или как-то удалить эти скобки из наименования в файле /bitrix/php_interface/init.php?
Должно помочь  unset($arFields['NAME']) только еще проверять в каком инфоблоке
Код
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
function DoNotUpdate(&$arFields)
{
    if ($_REQUEST['mode'] == 'import') and 
       ($arFields['IBLOCK_CODE'] == 'offers' // вот тут поковыряйтесь, может там не CODE а XML-ID
    {
        unset($arFields['PREVIEW_PICTURE']);
        unset($arFields['DETAIL_PICTURE']);
        unset($arFields['PREVIEW_TEXT']);
        unset($arFields['DETAIL_TEXT']);
    }
}
Михаил, здравствуйте!

При интеграции необходимо запретить изменения заголовка в существующих товарах, а новые товары загружались как и в 1С, но уже после загрузки на сайт заголовок не мог поменяться при следующей интеграции с 1С.
Запрет при обновлении элемента
Код
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
function DoNotUpdate(&$arFields)
{
    if ($_REQUEST['mode'] == 'import') {
        unset($arFields['NAME']);
    }
}
Добрый день!  При импорте товаров из 1с появляется новый раздел ТОВАРЫ и мои разделы которые создал вручную остаются а вся номенклатура из моих созданных разделов перемещаются именно туда, возможно проставить всем разделам внешние коды (если логически). СПАСБО!
Попробуйте в настройках обмен апоставить галку "Не выгружать верхний уровень разделов если он единственный"
Название написал по памяти, но примерно так звучит
Здравствуйте, Михаил!

Проблема заключается в том, что при очередной интерграции с 1С описание html опять слетает на текст, необходимо чтобы оно оставалось в html,
Цитата
Гость написал:
Здравствуйте, Михаил!
Проблема заключается в том, что при очередной интерграции с 1С описание html опять слетает на текст, необходимо чтобы оно оставалось в html,
И как в быстро их опять перевести в html
Видеоуроки по
1С-Битрикс
на моем Boosty канале Видео
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 

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

Memcached на сайте под управлением битрикс, при использовании Веб Окружения Битрикс

Если вам важна скорость отдачи сайта, а у вашего сервера медленный диск для использования кеша на файлах. Можно кеширова...

Получение токена доступа API Firebase (HTTP v1) с помощью PHP для отправки push-уведомлений.

До июня 2024 года API Firebase использовал постоянный токен доступа, который можно было получить один раз в консоли. Одн...

Дать пользователю возможность быстро отредактировать материал

На одном из разрабатываемых сайтов, пользователи формируют его контент. После регистрации, становится доступен персональ...

Запретить оплату с внутреннего счета, если в корзине есть определенный товар

Задача: пользователи могут оплачивать заказы с бонусного счета (штатный внутренний счет), но если в корзине&nbsp...

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

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

Моментальная фильтрация на AJAX в умном фильтре 1С-Битрикс

При штатной установке, интернет-магазина на 1С Битрикс, умный фильтр по товарам, показывает колличество найденных товаро...

Cordova, ввод в input под диктовку. Голосовой поиск в мобильном приложении.

Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам нужно захватить речь с микроф...

Добавление своих полей в почтовые шаблоны Битрикс

Иногда нужно внести свои поля в почтовые шаблоны битрикс. Например: добавить имя и номер телефона заказчика в почтовый ш...

Малая корзина Битрикс, упрощенный шаблон

Шаблон малой корзины битрикс, который можно вывести в боковом разделе шаблона или в шапке интернет-магазина. Код окульту...