Задача:
Тяжелый каталог из 1С довольно долго выгружается на склад. При добавления одного товара к складу, приходиться перезаливать весь Каталог. Рациональней настроить несколько синхронизаций в 1С, каждая из которых заливала бы только одну категорию товара. Например только брюки, не перезаливая Рубашки и Галстуки
ОДЕЖДА
- Рубашки
- Майки
- Брюки
У Брюки и Рубашек есть общая характеристика - Размер. Если перезалить только Брюки, то с ней перезаливается и Характеристика - Размер, у которой теряется связь с Майки, Рубашки. Если зайти в раздел Характеристики на сайте, то у Размер отмечена только одна категория - Брюки, о две другие слетели. Причем в карточке товара на сайте эта характеристика указана, только находясь в категории - Одежда к выбору по характеристикам видны только размеры от категории - Брюки. Нужно открывать карточку товара - из категории - Рубашки и пересохранить, тогда размеры рубашек тоже попадут в характеристику - Размер.
После каждого частичного перезалива со всех категорий слетают все характеристики, кроме обновляемых. Можно еще каждую характеристику раскрыть и присвоить в ней значение "Категори"= Все. Но каждый раз это неудобно , например у меня более 50 характеристик по каталогу.
Нашел участок кода, который по моему мнению может влиять на переписывания категорий у характеристик при синхронизации.
Файл shop.1c.php
Код:
/**
* Импорт дополнительных характеристик
*
* @return void
*/
private function import_params($xml)
{
$property = array();
if(isset($xml->Свойства->СвойствоНоменклатуры))
{
$property = $xml->Свойства->СвойствоНоменклатуры;
}
if(isset($xml->Свойства->Свойство))
{
$property = $xml->Свойства->Свойство;
}
foreach ($property as $xml_feature)
{
switch($xml_feature->ТипЗначений)
{
case 'Число':
$type = 'numtext';
break;
case 'Справочник':
$type = 'select';
break;
default:
$type = 'text';
break;
}
$row = DB::query_fetch_array("SELECT id, type FROM {shop_param} WHERE [name]='%h' LIMIT 1", $xml_feature->Наименование);
$values = array();
if(! $row)
{
$row["id"] = DB::query("INSERT INTO {shop_param} ([name], type) VALUES ('%h', '%s')", $xml_feature->Наименование, $type);
$row["type"] = $type;
if($type == 'select' && ! empty($xml_feature->ВариантыЗначений->Справочник))
{
$i = 1;
foreach ($xml_feature->ВариантыЗначений->Справочник as $xml_s)
{
$values[strval($xml_feature->Ид)] = DB::query("INSERT INTO {shop_param_select} ([name], param_id, sort) VALUES ('%h', %d, %d)", $xml_s->Значение, $row["id"], $i++);
}
}
}
else
{
if($row["type"] == "multiple" && $type == 'select')
{
$type = 'multiple';
}
if($row["type"] != $type)
{
DB::query("UPDATE {shop_param} SET type='%s' WHERE id=%d", $type, $row["id"]);
}
if(($type == 'select' || $type == 'multiple') && ! empty($xml_feature->ВариантыЗначений->Справочник))
{
$i = 1;
foreach ($xml_feature->ВариантыЗначений->Справочник as $xml_s)
{
if(! $sel_id = DB::query_result("SELECT id FROM {shop_param_select} WHERE [name]='%h' AND param_id=%d", $xml_s->Значение, $row["id"]))
{
$sel_id = DB::query("INSERT INTO {shop_param_select} ([name], param_id, sort) VALUES ('%h', %d, %d)", $xml_s->Значение, $row["id"], $i++);
}
$values[strval($xml_s->ИдЗначения)] = $sel_id;
}
}
DB::query("DELETE FROM {shop_param_category_rel} WHERE element_id=%d", $row["id"]);
}
$row["values"] = $values;
$this->cache["params"][strval($xml_feature->Ид)] = $row;
}
}
/**
* Импорт товаров