Привет!
Подобная задача возникала у многих клиентов - при выгрузке из 1С удалить или деактивировать товары, если они без цены.[spoiler] Подобная возможность есть в функционале импорта товаров из xml-файла стандарта CommerceML 1.0, но при обмене с 1с 8.1 напрямую деактивации товаров без цен не происходит.
Многим постоянно приходится "извращаться всячески", чтобы решить эту задачу, т.к. существующие события модуля каталога и инфоблоков не совсем подходят.
Собственно, выход можно найти в кастомизации компонента выгрузки из 1С - bitrix:catalog.import.1c. Я решил эту задачу добавлением дополнительного шага в компонент "Деактивация товаров без цен".
Компонент можно скачать
Деактивация выполняется в конце импорта данных из файла предложений.
В компонент добавил параметр "Деактивировать товары без цен":

При выгрузке из 1С будет выполняться шаг деактивации, покажу на скришоте скрипта импорта (в 1с будет аналогично):

Деактивация заключается в переборе активных элементов инфоблока, поиск цен для этих элементов и их деактивация при отсутствии цен. Есть пошаговость(особо не тестировал).
Если интересно, код:
При больших объёмах каталога работоспособность не проверял - может оказаться ресурсоёмким делом оказаться. Надеюсь пошаговость спасёт
Особенности работы:
1. Деактивация работает как при полной выгрузке так и при выгрузке изменений
2. Деактивация элементов без цен происходит только в процессе импорта предложений(файл offers.xml), при импорте каталога (файл import.xml) деактивация производится не будет.
3. Деактивация будет производится только если неактивна опция "Выгружать предложения (характеристики) в отдельный инфоблок".
Пока! =)
Подобная задача возникала у многих клиентов - при выгрузке из 1С удалить или деактивировать товары, если они без цены.[spoiler] Подобная возможность есть в функционале импорта товаров из xml-файла стандарта CommerceML 1.0, но при обмене с 1с 8.1 напрямую деактивации товаров без цен не происходит.
Многим постоянно приходится "извращаться всячески", чтобы решить эту задачу, т.к. существующие события модуля каталога и инфоблоков не совсем подходят.
Собственно, выход можно найти в кастомизации компонента выгрузки из 1С - bitrix:catalog.import.1c. Я решил эту задачу добавлением дополнительного шага в компонент "Деактивация товаров без цен".
Компонент можно скачать
Деактивация выполняется в конце импорта данных из файла предложений.
В компонент добавил параметр "Деактивировать товары без цен":

При выгрузке из 1С будет выполняться шаг деактивации, покажу на скришоте скрипта импорта (в 1с будет аналогично):

Деактивация заключается в переборе активных элементов инфоблока, поиск цен для этих элементов и их деактивация при отсутствии цен. Есть пошаговость(особо не тестировал).
Если интересно, код:
//<----start, by C_arter
elseif($NS["STEP"] ==9)
{
$obCatalog = new CIBlockCMLImport;
$obCatalog->Init($NS);
$deactive=false;
$timeup=false;
$time_start=time();
$di=0;
if ($obCatalog->next_step['bOffer']==1 && $arParams['USE_OFFERS']!='Y' && $arParams['DEACTIVATE_WIHTOUT_PRICE']=='Y')
{
$IBLOCK_ID=$obCatalog->next_step['IBLOCK_ID'];
$arFilter=array("IBLOCK_ID" =>$IBLOCK_ID,
'ACTIVE'=>'Y'
);
if (intval($_SESSION['BX_CML2_IMPORT']['CUSTOM']['D_STEP'])>0)
$arFilter['>ID']=$_SESSION['BX_CML2_IMPORT']['CUSTOM']['D_STEP'];
$el=new CIBlockElement;
$dbProduct=$el->GetList(Array("ID"=>'ASC'),
$arFilter,
false,
false,
Array('ID')
);
while ($arProduct = $dbProduct->GetNext())
{
$deactive=true;
$db_res = CPrice::GetList(
array(),
array(
"PRODUCT_ID" => $arProduct['ID'],
),
false,
false,
Array('ID')
);
if (!$ar_res = $db_res->Fetch())
{
$el->Update($arProduct['ID'], Array('ACTIVE'=>'N'));
$di++;
}
$now=time()-$time_start;
if ($now>=$arParams['INTERVAL'])
{
$timeup=true;
$strMessage=GetMessage('CC_BCI1_DEACTIVATE_WOP_CONTINUE');
$_SESSION['BX_CML2_IMPORT']['CUSTOM']['D_STEP']=$arProduct['ID'];
break;
}
else
$_SESSION['BX_CML2_IMPORT']['CUSTOM']['D_STEP']=$arProduct['ID'];
}
}
if ($deactive==false||($deactive==true && $timeup==false))
{
$strMessage=GetMessage('CC_BCI1_DEACTIVATE_WOP_DONE');
$NS["STEP"] = 10;
}
}//<----end// by C_arter |
При больших объёмах каталога работоспособность не проверял - может оказаться ресурсоёмким делом оказаться. Надеюсь пошаговость спасёт

Особенности работы:
1. Деактивация работает как при полной выгрузке так и при выгрузке изменений
2. Деактивация элементов без цен происходит только в процессе импорта предложений(файл offers.xml), при импорте каталога (файл import.xml) деактивация производится не будет.
3. Деактивация будет производится только если неактивна опция "Выгружать предложения (характеристики) в отдельный инфоблок".
Пока! =)