Столкнулся с той же ситуацией - не удаляются старые товары, которых нет в выгрузке на сайт. У нас выгрузка из 1С по ряду причин делается через самописный обмен. Он еще не доделан до конца и выгрузка выполняется в файлы, которые надо вручную импортировать через админку (импорт XML).
При этом в отдельный файл выгружается справочник. Он загружается нормально, с удалением отсутствующих записей, а товары и цены - нет.
Решил попробовать разобраться. За точку старта взял 24 сообщение в той ветке в котором написано место, где непосредственно происходит косяк. Процитирую кусок сообщения:
Цитата
суть косяка "почему не удаляются отсутствующие товары" в том что на шаге "чистки" инфоблока (7 или 8 ) происходит ранний выход из метода класса, который ответственный за это. деактивация (или удаление) происходит в методе CIBlockCMLImport::DeactivateElement , сам класс лежит в /bitrix/modules/iblock/classes/general/cml2.php ранний выход происходит потому что дойдя до первого же return-условия оно оказывается "true"
Оказалось, что bUpdateOnly всегда установлен в true, т.к. в свойство записано строковое значение, а не булево. А оно всегда true, когда заполнено, даже если там указано "false".
Строковым же оно получается, т.к., как я понял, для выполнения каждого шага импорта страница, его делающая циклически вызывает саму себя, передавая параметры через $_POST. А через него передаются только строки.
Как избавиться от ошибки. Два варианта.
1. Если у вас самописная выгрузка, то можно поправить тег XML
<Каталог СодержитТолькоИзменения="false"> убрав из него "СодержитТолькоИзменения="false"", т.е. оставить только <Каталог> В этом случае свойство bUpdateOnly создаваться не будет и условие станет ложным по первой части.
2. Исправить ошибку в коде.
Редактируем файл папка_сайта/bitrix/modules/iblock/admin/iblock_xml_import.php. Это та самая страница импорта. Находим в начале файла блок кода, в котором как раз преобразовываются типы значений свойств
Не до конца разобрались в новом обмене. "СодержитТолькоИзменения" это теперь legacy-way. Деактивация товаров теперь находится компоненте /bitrix/components/bitrix/catalog.import.1c/component.php в блоке условия "elseif ($_GET["mode"]=="deactivate")". Там идет отдельный запрос со стороны 1с на деактивацию элементов. И в новом обмене галочки деактивации/удаления в админке просто ничего не делают (что удивительно! неужели их нельзя учитывать и при новом спосебе деактивации??)
Так же не могу написать в тему https://dev.1c-bitrix.ru/support/forum/forum26/topic72154/ Правим общий модуль Б_ОбменССайтомСерверВыгрузкаДанных. Все изменения делаете на свой страх и риск. Перед правкой обязательно сделайте резервную копию.
//XDTOКаталог.СодержитТолькоИзменения = XMLСтрока(Истина);
Если (ПараметрыОбмена.ВыгружатьТолькоИзменения) тогда
XDTOКаталог.СодержитТолькоИзменения = XMLСтрока(Истина);
Иначе
XDTOКаталог.СодержитТолькоИзменения = XMLСтрока(Ложь);
КонецЕсли;
//XDTOКлассификатор.СодержитТолькоИзменения = XMLСтрока(Истина)
Если (ПараметрыОбмена.ВыгружатьТолькоИзменения) тогда
XDTOКлассификатор.СодержитТолькоИзменения = XMLСтрока(Истина);
КонецЕсли;
После в файлах XML тег <Классификатор СодержитТолькоИзменения="true"> будет принимать занчение как true, так и false. Теперь товары и каталоги должны удалятся с сайта битрикс, если отсутствуют в выгрузке, и в админке стоит соответствующее правило. Так же в настройках модуля в 1с должна быть активирована опция "Полная выгрузка".