Добрый день.
Есть стандартный обмен с 1С. Появилась необходимость не импортировать ненужные товарные предложения, дабы не забивать ими базу и не нагружать сайт, т.к. их порядка 70 000 штук. На стороне 1с их отобрать никак нельзя. Если их удалить, то при импорте они естественно заново создаются, перепривязываются к товару, даже если как вариант их отвязать.
Сделал highload-блок с внешними ID данных лишних предложений.
В init.php прописал код, в котором при событии OnBeforeIBlockElementAdd работает функция, которая проверяет условие $_REQUEST['mode']=='import' и делает сверку XML_ID на наличие такового в highload-блоке. Если оба условия срабатывает, то функция возвращает false и элемент инфоблока (предложение) не добавляется. Код приведу ниже.
Если выгружать пару-тройку товаров, то проблем нет. Функция работает, ненужное не добавляется.
Если выгружать много, то тоже работает, не добавляется, но в журнале ошибок 1с вижу ошибку:
"Фоновый обмен
06.06.2017 8:48:43 Запуск выгрузки пакета предложений
06.06.2017 9:02:28 Выгрузка на сайт завершилась с ошибками.
offers0_1.xml: Произошла ошибка на стороне сервера.
Ответ сервера:
failure
Unknown error.
06.06.2017 9:03:57 Выгрузка на сайт завершилась с ошибками.
offers0_2.xml: Произошла ошибка на стороне сервера.
Ответ сервера:
failure
......
Unknown error.
06.06.2017 9:29:19 Выгрузка на сайт завершилась с ошибками.
offers0_6.xml: Произошла ошибка на стороне сервера.
Ответ сервера:
failure
Unknown error.
06.06.2017 9:29:19 Завершена выгрузка пакета предложений"
И так постоянно. Хотя сам обмен идет, товары обновляются, ненужно не добавляется. Все бы ничего и можно было бы закрыть на это глаза, но проблема в том, что в журнале регистрации изменений 1с "Показать зарегистрированные изменения" обновления не происходит. Для 1с это неудачная выгрузка и программа будет вновь и вновь выгружать одно и то же. На стороне 1с сделать ничего не могу, закрыта от изменений.
Вопрос в том почему с этим кодом ответ сервера:
failure
Unknown error.
А без этого кода все ок... Может потому что OnBeforeIBlockElementAdd возвращает false?
Сам код из init.php:
AddEventHandler("iblock", "OnBeforeIBlockElementAdd","DoNotAdd"); // вызывает функцию при добавлении товара или предложения
CModule::IncludeModule('highloadblock'); //модуль highload инфоблоков
use Bitrix\Highloadblock as HL; // подготовка highload инфоблоков
use Bitrix\Main\Entity; // подготовка highload инфоблоков
function DoNotAdd(&$arFields)
{
$hlblock_requests=Bitrix\Highloadblock\HighloadBlockTable::getById(71)->fetch();//requests
$entity_requests=Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock_requests);
$entity_requests_data_class = $entity_requests->getDataClass();
// делаем выборку из highload блока UF_XMLID
$main_query_requests = new Entity\Query($entity_requests_data_class);
$main_query_requests->setSelect(array('ID','UF_XMLID'));
$main_query_requests->setFilter(
array(
'UF_XMLID'=>$arFields["XML_ID"],
)
);
$result_requests = $main_query_requests->exec();
$result_requests = new CDBResult($result_requests);
while ($row_requests=$result_requests->Fetch()) {
$requests[] = $row_requests; //массив выбранных элементов
}
if($arFields["XML_ID"] == $requests[0][UF_XMLID] && $_REQUEST['mode']=='import')
{
// global $APPLICATION;;
// $APPLICATION->throwException("Мы не добавляем это предложение!");
return false;
}
}
Есть стандартный обмен с 1С. Появилась необходимость не импортировать ненужные товарные предложения, дабы не забивать ими базу и не нагружать сайт, т.к. их порядка 70 000 штук. На стороне 1с их отобрать никак нельзя. Если их удалить, то при импорте они естественно заново создаются, перепривязываются к товару, даже если как вариант их отвязать.
Сделал highload-блок с внешними ID данных лишних предложений.
В init.php прописал код, в котором при событии OnBeforeIBlockElementAdd работает функция, которая проверяет условие $_REQUEST['mode']=='import' и делает сверку XML_ID на наличие такового в highload-блоке. Если оба условия срабатывает, то функция возвращает false и элемент инфоблока (предложение) не добавляется. Код приведу ниже.
Если выгружать пару-тройку товаров, то проблем нет. Функция работает, ненужное не добавляется.
Если выгружать много, то тоже работает, не добавляется, но в журнале ошибок 1с вижу ошибку:
"Фоновый обмен
06.06.2017 8:48:43 Запуск выгрузки пакета предложений
06.06.2017 9:02:28 Выгрузка на сайт завершилась с ошибками.
offers0_1.xml: Произошла ошибка на стороне сервера.
Ответ сервера:
failure
Unknown error.
06.06.2017 9:03:57 Выгрузка на сайт завершилась с ошибками.
offers0_2.xml: Произошла ошибка на стороне сервера.
Ответ сервера:
failure
......
Unknown error.
06.06.2017 9:29:19 Выгрузка на сайт завершилась с ошибками.
offers0_6.xml: Произошла ошибка на стороне сервера.
Ответ сервера:
failure
Unknown error.
06.06.2017 9:29:19 Завершена выгрузка пакета предложений"
И так постоянно. Хотя сам обмен идет, товары обновляются, ненужно не добавляется. Все бы ничего и можно было бы закрыть на это глаза, но проблема в том, что в журнале регистрации изменений 1с "Показать зарегистрированные изменения" обновления не происходит. Для 1с это неудачная выгрузка и программа будет вновь и вновь выгружать одно и то же. На стороне 1с сделать ничего не могу, закрыта от изменений.
Вопрос в том почему с этим кодом ответ сервера:
failure
Unknown error.
А без этого кода все ок... Может потому что OnBeforeIBlockElementAdd возвращает false?
Сам код из init.php:
AddEventHandler("iblock", "OnBeforeIBlockElementAdd","DoNotAdd"); // вызывает функцию при добавлении товара или предложения
CModule::IncludeModule('highloadblock'); //модуль highload инфоблоков
use Bitrix\Highloadblock as HL; // подготовка highload инфоблоков
use Bitrix\Main\Entity; // подготовка highload инфоблоков
function DoNotAdd(&$arFields)
{
$hlblock_requests=Bitrix\Highloadblock\HighloadBlockTable::getById(71)->fetch();//requests
$entity_requests=Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock_requests);
$entity_requests_data_class = $entity_requests->getDataClass();
// делаем выборку из highload блока UF_XMLID
$main_query_requests = new Entity\Query($entity_requests_data_class);
$main_query_requests->setSelect(array('ID','UF_XMLID'));
$main_query_requests->setFilter(
array(
'UF_XMLID'=>$arFields["XML_ID"],
)
);
$result_requests = $main_query_requests->exec();
$result_requests = new CDBResult($result_requests);
while ($row_requests=$result_requests->Fetch()) {
$requests[] = $row_requests; //массив выбранных элементов
}
if($arFields["XML_ID"] == $requests[0][UF_XMLID] && $_REQUEST['mode']=='import')
{
// global $APPLICATION;;
// $APPLICATION->throwException("Мы не добавляем это предложение!");
return false;
}
}