817 function ImportMetaData($xml_root_id, $IBLOCK_TYPE, $IBLOCK_LID, $bUpdateIBlock =
true)
821 $rs = $this->_xml_file->GetList(
822 array(
"ID" =>
"asc"),
823 array(
"ID" => $xml_root_id),
824 array(
"ID",
"NAME",
"ATTRIBUTES")
830 foreach(
array(LANGUAGE_ID,
"en",
"ru") as
$lang)
833 if(
$ar[
"NAME"] ===
$mess[
"IBLOCK_XML2_COMMERCE_INFO"])
836 $this->next_step[
"lang"] =
$lang;
839 $xml_root_id =
$ar[
"ID"];
842 if(
$ar && (
$ar[
"ATTRIBUTES"] <>
''))
844 $info = unserialize(
$ar[
"ATTRIBUTES"], [
'allowed_classes' =>
false]);
845 if(is_array(
$info) && array_key_exists($this->mess[
"IBLOCK_XML2_SUM_FORMAT"],
$info))
847 if(preg_match(
"#".$this->mess[
"IBLOCK_XML2_SUM_FORMAT_DELIM"].
"=(.);{0,1}#",
$info[$this->mess[
"IBLOCK_XML2_SUM_FORMAT"]], $match))
849 $this->next_step[
"sdp"] = $match[1];
854 $meta_data_xml_id =
false;
855 $XML_ELEMENTS_PARENT =
false;
856 $XML_SECTIONS_PARENT =
false;
857 $XML_PROPERTIES_PARENT =
false;
858 $XML_SECTIONS_PROPERTIES_PARENT =
false;
859 $XML_PRICES_PARENT =
false;
860 $XML_STORES_PARENT =
false;
861 $XML_BASE_UNITS_PARENT =
false;
862 $XML_SECTION_PROPERTIES =
false;
865 $this->next_step[
"bOffer"] =
false;
866 $rs = $this->_xml_file->GetList(
868 array(
"PARENT_ID" => $xml_root_id,
"NAME" => $this->mess[
"IBLOCK_XML2_CATALOG"]),
869 array(
"ID",
"ATTRIBUTES")
874 $rs = $this->_xml_file->GetList(
876 array(
"PARENT_ID" => $xml_root_id,
"NAME" => $this->mess[
"IBLOCK_XML2_OFFER_LIST"]),
877 array(
"ID",
"ATTRIBUTES")
880 $this->next_step[
"bOffer"] =
true;
884 $rs = $this->_xml_file->GetList(
886 array(
"PARENT_ID" => $xml_root_id,
"NAME" => $this->mess[
"IBLOCK_XML2_OFFERS_CHANGE"]),
887 array(
"ID",
"ATTRIBUTES")
890 $this->next_step[
"bOffer"] =
true;
891 $this->next_step[
"bUpdateOnly"] =
true;
892 $bUpdateIBlock =
false;
895 if ($this->next_step[
"bOffer"] && !$this->bCatalog)
896 return GetMessage(
'IBLOCK_XML2_MODULE_CATALOG_IS_ABSENT');
900 if(
$ar[
"ATTRIBUTES"] <>
'')
902 $attrs = unserialize(
$ar[
"ATTRIBUTES"], [
'allowed_classes' =>
false]);
903 if (is_array($attrs))
905 if (isset($attrs[$this->mess[
"IBLOCK_XML2_UPDATE_ONLY"]]))
907 $this->next_step[
"bUpdateOnly"] = $attrs[$this->mess[
"IBLOCK_XML2_UPDATE_ONLY"]] ===
"true"
908 || (int)$attrs[$this->mess[
"IBLOCK_XML2_UPDATE_ONLY"]] > 0
914 $rs = $this->_xml_file->GetList(
915 array(
"ID" =>
"asc"),
920 if(isset(
$ar[
"VALUE_CLOB"]))
921 $ar[
"VALUE"] =
$ar[
"VALUE_CLOB"];
923 $trueValue =
$ar[
'VALUE'] ===
'true' || (int)
$ar[
'VALUE'] > 0;
925 if(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_ID"])
926 $arIBlock[
"XML_ID"] = ($this->use_iblock_type_id? $IBLOCK_TYPE.
"-":
"").
$ar[
"VALUE"];
927 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_CATALOG_ID"])
928 $arIBlock[
"CATALOG_XML_ID"] = ($this->use_iblock_type_id? $IBLOCK_TYPE.
"-":
"").
$ar[
"VALUE"];
929 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_NAME"])
931 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_DESCRIPTION"])
936 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_POSITIONS"] ||
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_OFFERS"])
937 $XML_ELEMENTS_PARENT =
$ar[
"ID"];
938 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_PRICE_TYPES"])
939 $XML_PRICES_PARENT =
$ar[
"ID"];
940 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_STORES"])
941 $XML_STORES_PARENT =
$ar[
"ID"];
942 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BASE_UNITS"])
943 $XML_BASE_UNITS_PARENT =
$ar[
"ID"];
944 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_METADATA_ID"])
945 $meta_data_xml_id =
$ar[
"VALUE"];
946 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_UPDATE_ONLY"])
947 $this->next_step[
"bUpdateOnly"] = $trueValue;
948 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_CODE"])
950 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_API_CODE"])
952 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_SORT"])
954 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_LIST_URL"])
956 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_DETAIL_URL"])
958 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_SECTION_URL"])
960 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_CANONICAL_URL"])
962 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_INDEX_ELEMENTS"])
963 $arIBlock[
"INDEX_ELEMENT"] = $trueValue ?
"Y":
"N";
964 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_INDEX_SECTIONS"])
965 $arIBlock[
"INDEX_SECTION"] = $trueValue ?
"Y":
"N";
966 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_SECTIONS_NAME"])
968 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_SECTION_NAME"])
970 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_ELEMENTS_NAME"])
972 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_ELEMENT_NAME"])
974 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_PICTURE"])
976 if(
$ar[
"VALUE"] <>
'')
981 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_BX_WORKFLOW"])
982 $arIBlock[
"WORKFLOW"] = (
$ar[
"VALUE"]==
"true") || intval(
$ar[
"VALUE"])?
"Y":
"N";
983 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_INHERITED_TEMPLATES"])
986 $arTemplates = $this->_xml_file->GetAllChildrenArray(
$ar[
"ID"]);
987 foreach($arTemplates as $TEMPLATE)
989 $id = $TEMPLATE[$this->mess[
"IBLOCK_XML2_ID"]];
990 $template = $TEMPLATE[$this->mess[
"IBLOCK_XML2_VALUE"]];
995 elseif(
$ar[
"NAME"] == $this->mess[
"IBLOCK_XML2_LABELS"])
997 $arLabels = $this->_xml_file->GetAllChildrenArray(
$ar[
"ID"]);
998 foreach($arLabels as $arLabel)
1000 $id = $arLabel[$this->mess[
"IBLOCK_XML2_ID"]];
1001 $label = $arLabel[$this->mess[
"IBLOCK_XML2_VALUE"]];
1002 if($id <>
'' && $label <>
'')
1007 if($this->next_step[
"bOffer"] && !$this->use_offers)
1012 $this->next_step[
"bUpdateOnly"] =
true;
1023 if($this->next_step[
"bOffer"] && $this->use_offers)
1031 if($bUpdateIBlock && (!$this->next_step[
"bOffer"] || $this->use_offers))
1036 return $obIBlock->LAST_ERROR;
1047 return GetMessage(
"IBLOCK_XML2_TYPE_ADD_ERROR");
1053 $this->translit_on_add
1059 "TRANSLITERATION" =>
"Y",
1060 "TRANS_LEN" => $this->translit_on_add[
"max_len"],
1061 "TRANS_CASE" => $this->translit_on_add[
"change_case"],
1062 "TRANS_SPACE" => $this->translit_on_add[
"replace_space"],
1063 "TRANS_OTHER" => $this->translit_on_add[
"replace_other"],
1064 "TRANS_EAT" => $this->translit_on_add[
"delete_repeat_replace"]?
"Y":
"N",
1066 "SECTION_CODE" =>
array(
"DEFAULT_VALUE" =>
array(
1067 "TRANSLITERATION" =>
"Y",
1068 "TRANS_LEN" => $this->translit_on_add[
"max_len"],
1069 "TRANS_CASE" => $this->translit_on_add[
"change_case"],
1070 "TRANS_SPACE" => $this->translit_on_add[
"replace_space"],
1071 "TRANS_OTHER" => $this->translit_on_add[
"replace_other"],
1072 "TRANS_EAT" => $this->translit_on_add[
"delete_repeat_replace"]?
"Y":
"N",
1078 return $obIBlock->LAST_ERROR;
1082 if($this->bCatalog && $this->next_step[
"bOffer"])
1086 if (0 < intval($intParentID) && $this->use_offers)
1088 $mxSKUProp = $obCatalog->LinkSKUIBlock($intParentID,
$arIBlock[
"ID"]);
1100 if($arOffer =
$rs->Fetch())
1102 $boolFlag = $obCatalog->Update(
$arIBlock[
"ID"],
array(
'PRODUCT_IBLOCK_ID' => $intParentID,
'SKU_PROPERTY_ID' => $mxSKUProp));
1106 $boolFlag = $obCatalog->Add(
array(
"IBLOCK_ID"=>
$arIBlock[
"ID"],
"YANDEX_EXPORT"=>
"N",
"SUBSCRIPTION"=>
"N",
'PRODUCT_IBLOCK_ID' => $intParentID,
'SKU_PROPERTY_ID' => $mxSKUProp));
1138 if(!array_key_exists(
"CODE",
$arIBlock))
1144 'NAME' =>
GetMessage(
'IBLOCK_XML2_ATTRIBUTES'),
1146 'WITH_DESCRIPTION' =>
'Y',
1147 'MULTIPLE_CNT' => 1,
1152 'WITH_DESCRIPTION' =>
'Y',
1153 'MULTIPLE_CNT' => 1,
1156 'NAME' =>
GetMessage(
'IBLOCK_XML2_BASE_UNIT_NAME'),
1157 'WITH_DESCRIPTION' =>
'Y',
1162 'WITH_DESCRIPTION' =>
'Y',
1163 'MULTIPLE_CNT' => 1,
1172 'WITH_DESCRIPTION' =>
'Y',
1173 'MULTIPLE_CNT' => 1,
1178 'NAME' =>
GetMessage(
'IBLOCK_XML2_PROP_MANUFACTURER'),
1180 'WITH_DESCRIPTION' =>
'N',
1181 'MULTIPLE_CNT' => 1,
1192 if (isset(
$arIBlock[
'CATALOG_XML_ID']) && $this->use_offers)
1208 $this->next_step[
"IBLOCK_ID"] =
$arIBlock[
"ID"];
1209 $this->next_step[
"XML_ELEMENTS_PARENT"] = $XML_ELEMENTS_PARENT;
1212 if($meta_data_xml_id)
1214 $rs = $this->_xml_file->GetList(
1216 array(
"PARENT_ID" => $xml_root_id,
"NAME" => $this->mess[
"IBLOCK_XML2_METADATA"]),
1219 while($arMetadata =
$rs->Fetch())
1222 $bMetaFound =
false;
1223 $meta_roots =
array();
1224 $rsMetaRoots = $this->_xml_file->GetList(
1225 array(
"ID" =>
"asc"),
1226 array(
"PARENT_ID" => $arMetadata[
"ID"])
1228 while($arMeta = $rsMetaRoots->Fetch())
1230 if(isset($arMeta[
"VALUE_CLOB"]))
1231 $arMeta[
"VALUE"] = $arMeta[
"VALUE_CLOB"];
1233 if($arMeta[
"NAME"] == $this->mess[
"IBLOCK_XML2_ID"] && $arMeta[
"VALUE"] == $meta_data_xml_id)
1236 $meta_roots[] = $arMeta;
1242 foreach($meta_roots as $arMeta)
1244 if($arMeta[
"NAME"] == $this->mess[
"IBLOCK_XML2_GROUPS"])
1245 $XML_SECTIONS_PARENT = $arMeta[
"ID"];
1246 elseif($arMeta[
"NAME"] == $this->mess[
"IBLOCK_XML2_PROPERTIES"])
1247 $XML_PROPERTIES_PARENT = $arMeta[
"ID"];
1248 elseif($arMeta[
"NAME"] == $this->mess[
"IBLOCK_XML2_GROUPS_PROPERTIES"])
1249 $XML_SECTIONS_PROPERTIES_PARENT = $arMeta[
"ID"];
1250 elseif($arMeta[
"NAME"] == $this->mess[
"IBLOCK_XML2_SECTION_PROPERTIES"])
1251 $XML_SECTION_PROPERTIES = $arMeta[
"ID"];
1252 elseif($arMeta[
"NAME"] == $this->mess[
"IBLOCK_XML2_PRICE_TYPES"])
1253 $XML_PRICES_PARENT = $arMeta[
"ID"];
1254 elseif($arMeta[
"NAME"] == $this->mess[
"IBLOCK_XML2_STORES"])
1255 $XML_STORES_PARENT = $arMeta[
"ID"];
1256 elseif($arMeta[
"NAME"] == $this->mess[
"IBLOCK_XML2_BASE_UNITS"])
1257 $XML_BASE_UNITS_PARENT = $arMeta[
"ID"];
1264 $iblockFields = CIBlock::GetFields(
$arIBlock[
"ID"]);
1265 $iblockFields[
"XML_IMPORT_START_TIME"] =
array(
1266 "NAME" =>
"XML_IMPORT_START_TIME",
1267 "IS_REQUIRED" =>
"N",
1268 "DEFAULT_VALUE" => date(
"Y-m-d H:i:s"),
1270 CIBlock::SetFields(
$arIBlock[
"ID"], $iblockFields);
1272 if($XML_PROPERTIES_PARENT)
1279 if($XML_SECTION_PROPERTIES)
1286 if($XML_SECTIONS_PROPERTIES_PARENT)
1288 $result = $this->ImportSectionsProperties($XML_SECTIONS_PROPERTIES_PARENT,
$arIBlock[
"ID"]);
1293 if($XML_PRICES_PARENT)
1303 if($XML_STORES_PARENT)
1313 if($XML_BASE_UNITS_PARENT)
1323 $this->next_step[
"section_sort"] = 100;
1324 $this->next_step[
"XML_SECTIONS_PARENT"] = $XML_SECTIONS_PARENT;
1326 $rs = $this->_xml_file->GetList(
1328 array(
"PARENT_ID" => $xml_root_id,
"NAME" => $this->mess[
"IBLOCK_XML2_PRODUCTS_SETS"]),
1329 array(
"ID",
"ATTRIBUTES")
1334 $this->next_step[
"SETS"] = (int)
$ar[
"ID"];
3068 "PROPERTY_VALUES" =>
array(),
3071 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_VERSION"]]))
3072 $arElement[
"TMP_ID"] = $arXMLElement[$this->mess[
"IBLOCK_XML2_VERSION"]];
3076 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_ID_1C_SITE"]]))
3077 $arElement[
"XML_ID"] = $arXMLElement[$this->mess[
"IBLOCK_XML2_ID_1C_SITE"]];
3078 elseif(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_ID"]]))
3079 $arElement[
"XML_ID"] = $arXMLElement[$this->mess[
"IBLOCK_XML2_ID"]];
3083 $rsElement = $obElement->GetList(
3085 Array(
"=XML_ID" => $arElement[
"XML_ID"],
"IBLOCK_ID" => $this->next_step[
"IBLOCK_ID"]),
3087 Array(
"ID",
"TMP_ID",
"ACTIVE",
"CODE",
"PREVIEW_PICTURE",
"DETAIL_PICTURE")
3091 if($arDBElement = $rsElement->Fetch())
3092 $bMatch = ($arElement[
"TMP_ID"] == $arDBElement[
"TMP_ID"]);
3094 if($bMatch && $this->use_crc)
3100 if($arDBElement[
"ACTIVE"] !=
"Y")
3102 $obElement->Update($arDBElement[
"ID"],
array(
"ACTIVE"=>
"Y"), $bWF);
3107 $arElement[
"ID"] = $arDBElement[
"ID"];
3109 elseif(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_NAME"]]))
3113 if ($arDBElement[
"PREVIEW_PICTURE"] > 0)
3114 $this->arElementFilesId[
"PREVIEW_PICTURE"] =
array($arDBElement[
"PREVIEW_PICTURE"]);
3115 if ($arDBElement[
"DETAIL_PICTURE"] > 0)
3116 $this->arElementFilesId[
"DETAIL_PICTURE"] =
array($arDBElement[
"DETAIL_PICTURE"]);
3118 $rsProperties = $obElement->GetProperty($this->next_step[
"IBLOCK_ID"], $arDBElement[
"ID"],
"sort",
"asc");
3119 while($arProperty = $rsProperties->Fetch())
3121 if(!array_key_exists($arProperty[
"ID"], $arElement[
"PROPERTY_VALUES"]))
3122 $arElement[
"PROPERTY_VALUES"][$arProperty[
"ID"]] =
array(
3126 $arElement[
"PROPERTY_VALUES"][$arProperty[
"ID"]][$arProperty[
'PROPERTY_VALUE_ID']] =
array(
3127 "VALUE"=>$arProperty[
'VALUE'],
3128 "DESCRIPTION"=>$arProperty[
"DESCRIPTION"]
3131 if($arProperty[
"PROPERTY_TYPE"] ==
"F" && $arProperty[
"VALUE"] > 0)
3132 $this->arElementFilesId[$arProperty[
"ID"]][] = $arProperty[
"VALUE"];
3136 if ($this->bCatalog && $this->next_step[
"bOffer"])
3138 if (isset($this->PROPERTY_MAP[
"CML2_LINK"]))
3140 $p = strpos($arXMLElement[$this->mess[
"IBLOCK_XML2_ID"]],
"#");
3143 $link_xml_id = substr($arXMLElement[$this->mess[
"IBLOCK_XML2_ID"]], 0,
$p);
3147 $link_xml_id = $arXMLElement[$this->mess[
"IBLOCK_XML2_ID"]];
3150 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_LINK"]] = [
3153 $this->arProperties[$this->PROPERTY_MAP[
"CML2_LINK"]][
"LINK_IBLOCK_ID"],
3156 "DESCRIPTION" =>
false,
3162 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_NAME"]]))
3163 $arElement[
"NAME"] = $arXMLElement[$this->mess[
"IBLOCK_XML2_NAME"]];
3165 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_DELETE_MARK"]]))
3167 $value = $arXMLElement[$this->mess[
"IBLOCK_XML2_DELETE_MARK"]];
3168 $arElement[
"ACTIVE"] = ($value==
"true") || intval($value)?
"N":
"Y";
3171 if(array_key_exists($this->mess[
"IBLOCK_XML2_BX_TAGS"], $arXMLElement))
3172 $arElement[
"TAGS"] = $arXMLElement[$this->mess[
"IBLOCK_XML2_BX_TAGS"]];
3174 if(array_key_exists($this->mess[
"IBLOCK_XML2_DESCRIPTION"], $arXMLElement))
3176 if($arXMLElement[$this->mess[
"IBLOCK_XML2_DESCRIPTION"]] <>
'')
3177 $arElement[
"DETAIL_TEXT"] = $arXMLElement[$this->mess[
"IBLOCK_XML2_DESCRIPTION"]];
3179 $arElement[
"DETAIL_TEXT"] =
"";
3181 if(preg_match(
'/<[a-zA-Z0-9]+.*?>/', $arElement[
"DETAIL_TEXT"]))
3182 $arElement[
"DETAIL_TEXT_TYPE"] =
"html";
3184 $arElement[
"DETAIL_TEXT_TYPE"] =
"text";
3187 if(array_key_exists($this->mess[
"IBLOCK_XML2_FULL_TITLE"], $arXMLElement))
3189 if($arXMLElement[$this->mess[
"IBLOCK_XML2_FULL_TITLE"]] <>
'')
3190 $arElement[
"PREVIEW_TEXT"] = $arXMLElement[$this->mess[
"IBLOCK_XML2_FULL_TITLE"]];
3192 $arElement[
"PREVIEW_TEXT"] =
"";
3194 if(preg_match(
'/<[a-zA-Z0-9]+.*?>/', $arElement[
"PREVIEW_TEXT"]))
3195 $arElement[
"PREVIEW_TEXT_TYPE"] =
"html";
3197 $arElement[
"PREVIEW_TEXT_TYPE"] =
"text";
3200 if(array_key_exists($this->mess[
"IBLOCK_XML2_INHERITED_TEMPLATES"], $arXMLElement))
3202 $arElement[
"IPROPERTY_TEMPLATES"] =
array();
3203 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_INHERITED_TEMPLATES"]] as $TEMPLATE)
3205 $id = $TEMPLATE[$this->mess[
"IBLOCK_XML2_ID"]];
3206 $template = $TEMPLATE[$this->mess[
"IBLOCK_XML2_VALUE"]];
3208 $arElement[
"IPROPERTY_TEMPLATES"][$id] =
$template;
3211 if (isset($this->PROPERTY_MAP[
"CML2_BAR_CODE"]))
3213 if (array_key_exists($this->mess[
"IBLOCK_XML2_BAR_CODE2"], $arXMLElement))
3215 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_BAR_CODE"]] = [
3217 "VALUE" => $arXMLElement[$this->mess[
"IBLOCK_XML2_BAR_CODE2"]],
3218 "DESCRIPTION" =>
false,
3222 elseif (array_key_exists($this->mess[
"IBLOCK_XML2_BAR_CODE"], $arXMLElement))
3224 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_BAR_CODE"]] = [
3226 "VALUE" => $arXMLElement[$this->mess[
"IBLOCK_XML2_BAR_CODE"]],
3227 "DESCRIPTION" =>
false,
3233 if (isset($this->PROPERTY_MAP[
"CML2_ARTICLE"]))
3235 if (array_key_exists($this->mess[
"IBLOCK_XML2_ARTICLE"], $arXMLElement))
3237 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_ARTICLE"]] = [
3239 "VALUE" => $arXMLElement[$this->mess[
"IBLOCK_XML2_ARTICLE"]],
3240 "DESCRIPTION" =>
false,
3247 array_key_exists($this->mess[
"IBLOCK_XML2_MANUFACTURER"], $arXMLElement)
3248 && isset($this->PROPERTY_MAP[
"CML2_MANUFACTURER"])
3249 && $this->PROPERTY_MAP[
"CML2_MANUFACTURER"] > 0
3252 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_MANUFACTURER"]] =
array(
3254 "VALUE" => $this->
CheckManufacturer($arXMLElement[$this->mess[
"IBLOCK_XML2_MANUFACTURER"]]),
3255 "DESCRIPTION" =>
false,
3260 if(array_key_exists($this->mess[
"IBLOCK_XML2_PICTURE"], $arXMLElement))
3262 $rsFiles = $this->_xml_file->GetList(
3263 array(
"ID" =>
"asc"),
3264 array(
"PARENT_ID" => $arParent[
"ID"],
"NAME" => $this->mess[
"IBLOCK_XML2_PICTURE"])
3266 $arFile = $rsFiles->Fetch();
3270 if($arFile[
"ATTRIBUTES"] <>
'')
3272 $arAttributes = unserialize($arFile[
"ATTRIBUTES"], [
'allowed_classes' =>
false]);
3273 if(is_array($arAttributes) && array_key_exists($this->mess[
"IBLOCK_XML2_DESCRIPTION"], $arAttributes))
3275 $description = $arAttributes[$this->mess[
"IBLOCK_XML2_DESCRIPTION"]];
3279 if($arFile[
"VALUE"] <>
'')
3281 $arElement[
"DETAIL_PICTURE"] = $this->
ResizePicture($arFile[
"VALUE"], $this->detail,
"DETAIL_PICTURE", $this->PROPERTY_MAP[
"CML2_PICTURES"] ??
'');
3283 if(is_array($arElement[
"DETAIL_PICTURE"]))
3285 $arElement[
"DETAIL_PICTURE"][
"description"] =
$description;
3286 $this->arFileDescriptionsMap[$arFile[
"VALUE"]][] = &$arElement[
"DETAIL_PICTURE"][
"description"];
3289 if(is_array($this->preview))
3291 $arElement[
"PREVIEW_PICTURE"] = $this->
ResizePicture($arFile[
"VALUE"], $this->preview,
"PREVIEW_PICTURE");
3292 if(is_array($arElement[
"PREVIEW_PICTURE"]))
3294 $arElement[
"PREVIEW_PICTURE"][
"description"] =
$description;
3295 $this->arFileDescriptionsMap[$arFile[
"VALUE"]][] = &$arElement[
"PREVIEW_PICTURE"][
"description"];
3301 $arElement[
"DETAIL_PICTURE"] = $this->
MakeFileArray($this->_xml_file->GetAllChildrenArray($arFile[
"ID"]));
3303 if(is_array($arElement[
"DETAIL_PICTURE"]))
3305 $arElement[
"DETAIL_PICTURE"][
"description"] =
$description;
3309 $prop_id = (int)($this->PROPERTY_MAP[
"CML2_PICTURES"] ?? 0);
3313 while($arFile = $rsFiles->Fetch())
3316 if($arFile[
"ATTRIBUTES"] <>
'')
3318 $arAttributes = unserialize($arFile[
"ATTRIBUTES"], [
'allowed_classes' =>
false]);
3319 if(is_array($arAttributes) && array_key_exists($this->mess[
"IBLOCK_XML2_DESCRIPTION"], $arAttributes))
3321 $description = $arAttributes[$this->mess[
"IBLOCK_XML2_DESCRIPTION"]];
3325 if($arFile[
"VALUE"] <>
'')
3326 $arPropFile = $this->
ResizePicture($arFile[
"VALUE"], $this->detail, $this->PROPERTY_MAP[
"CML2_PICTURES"],
"DETAIL_PICTURE");
3328 $arPropFile = $this->
MakeFileArray($this->_xml_file->GetAllChildrenArray($arFile[
"ID"]));
3330 if(is_array($arPropFile))
3332 $arPropFile =
array(
3333 "VALUE" => $arPropFile,
3337 $arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$i] = $arPropFile;
3338 if ($arFile[
"VALUE"] <>
'')
3339 $this->arFileDescriptionsMap[$arFile[
"VALUE"]][] = &$arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$i][
"DESCRIPTION"];
3344 isset($arElement[
"PROPERTY_VALUES"][$prop_id])
3345 && is_array($arElement[
"PROPERTY_VALUES"][$prop_id]))
3347 foreach($arElement[
"PROPERTY_VALUES"][$prop_id] as $PROPERTY_VALUE_ID => $PROPERTY_VALUE)
3349 if(!$PROPERTY_VALUE_ID)
3350 unset($arElement[
"PROPERTY_VALUES"][$prop_id][$PROPERTY_VALUE_ID]);
3351 elseif(strncmp($PROPERTY_VALUE_ID,
"n", 1) !== 0)
3352 $arElement[
"PROPERTY_VALUES"][$prop_id][$PROPERTY_VALUE_ID] =
array(
3357 unset($arElement[
"PROPERTY_VALUES"][$prop_id][
"bOld"]);
3363 $cleanCml2FilesProperty =
false;
3365 array_key_exists($this->mess[
"IBLOCK_XML2_FILE"], $arXMLElement)
3366 && isset($this->PROPERTY_MAP[
"CML2_FILES"])
3369 $prop_id = $this->PROPERTY_MAP[
"CML2_FILES"];
3370 $rsFiles = $this->_xml_file->GetList(
3371 array(
"ID" =>
"asc"),
3372 array(
"PARENT_ID" => $arParent[
"ID"],
"NAME" => $this->mess[
"IBLOCK_XML2_FILE"])
3375 while($arFile = $rsFiles->Fetch())
3378 if($arFile[
"VALUE"] <>
'')
3381 $file = $this->
MakeFileArray($this->_xml_file->GetAllChildrenArray($arFile[
"ID"]));
3383 $arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$i] =
array(
3385 "DESCRIPTION" => $file[
"description"],
3387 if($arFile[
"ATTRIBUTES"] <>
'')
3389 $desc = unserialize($arFile[
"ATTRIBUTES"], [
'allowed_classes' =>
false]);
3390 if(is_array(
$desc) && array_key_exists($this->mess[
"IBLOCK_XML2_DESCRIPTION"],
$desc))
3392 $arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$i][
"DESCRIPTION"] =
$desc[$this->mess[
"IBLOCK_XML2_DESCRIPTION"]];
3397 $cleanCml2FilesProperty =
true;
3400 if(array_key_exists($this->mess[
"IBLOCK_XML2_GROUPS"], $arXMLElement))
3402 $arElement[
"IBLOCK_SECTION"] =
array();
3404 !empty($arXMLElement[$this->mess[
"IBLOCK_XML2_GROUPS"]])
3405 && is_array($arXMLElement[$this->mess[
"IBLOCK_XML2_GROUPS"]])
3408 foreach ($arXMLElement[$this->mess[
"IBLOCK_XML2_GROUPS"]] as $value)
3410 if (array_key_exists($value, $this->SECTION_MAP))
3411 $arElement[
"IBLOCK_SECTION"][] = $this->SECTION_MAP[$value];
3414 if($arElement[
"IBLOCK_SECTION"])
3415 $arElement[
"IBLOCK_SECTION_ID"] = $arElement[
"IBLOCK_SECTION"][0];
3418 if(array_key_exists($this->mess[
"IBLOCK_XML2_PRICES"], $arXMLElement))
3420 $arElement[
"PRICES"] =
array();
3421 if (is_array($arXMLElement[$this->mess[
"IBLOCK_XML2_PRICES"]]))
3423 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_PRICES"]] as $price)
3425 if(isset($price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]]) && array_key_exists($price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]], $this->PRICES_MAP))
3427 $price[
"PRICE"] = $this->PRICES_MAP[$price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]]];
3428 $arElement[
"PRICES"][] = $price;
3433 $arElement[
"DISCOUNTS"] =
array();
3434 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_DISCOUNTS"]]))
3436 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_DISCOUNTS"]] as
$discount)
3439 isset(
$discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_CONDITION"]])
3440 &&
$discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_CONDITION"]]===$this->mess[
"IBLOCK_XML2_DISCOUNT_COND_VOLUME"]
3443 $discount_value = $this->
ToInt($discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_COND_VALUE"]]);
3444 $discount_percent = $this->
ToFloat($discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_COND_PERCENT"]]);
3445 if($discount_value > 0 && $discount_percent > 0)
3446 $arElement[
"DISCOUNTS"][$discount_value] = $discount_percent;
3452 if($this->bCatalog && array_key_exists($this->mess[
"IBLOCK_XML2_AMOUNT"], $arXMLElement))
3454 $arElement[
"QUANTITY_RESERVED"] = 0;
3458 'select' => [
'ID',
'QUANTITY_RESERVED'],
3459 'filter' => [
'=ID' => $arDBElement[
'ID']]
3462 if (isset($arElementTmp[
"QUANTITY_RESERVED"]))
3463 $arElement[
"QUANTITY_RESERVED"] = (float)$arElementTmp[
"QUANTITY_RESERVED"];
3464 unset($arElementTmp);
3467 $arElement[
"QUANTITY"] = $this->
ToFloat($arXMLElement[$this->mess[
"IBLOCK_XML2_AMOUNT"]]) - $arElement[
"QUANTITY_RESERVED"];
3471 isset($arXMLElement[$this->mess[
"IBLOCK_XML2_ITEM_ATTRIBUTES"]])
3472 && isset($this->PROPERTY_MAP[
"CML2_ATTRIBUTES"])
3475 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_ATTRIBUTES"]] =
array();
3477 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_ITEM_ATTRIBUTES"]] as $value)
3479 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_ATTRIBUTES"]][
"n".$i] =
array(
3480 "VALUE" => $value[$this->mess[
"IBLOCK_XML2_VALUE"]],
3481 "DESCRIPTION" => $value[$this->mess[
"IBLOCK_XML2_NAME"]],
3489 if (isset($arXMLElement[$this->mess[
"IBLOCK_XML2_TRAITS_VALUES"]]))
3491 if (isset($this->PROPERTY_MAP[
"CML2_TRAITS"]))
3493 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_TRAITS"]] = [];
3495 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_TRAITS_VALUES"]] as $value)
3498 !array_key_exists(
"PREVIEW_TEXT", $arElement)
3499 && $value[$this->mess[
"IBLOCK_XML2_NAME"]] == $this->mess[
"IBLOCK_XML2_FULL_TITLE2"]
3502 $arElement[
"PREVIEW_TEXT"] = $value[$this->mess[
"IBLOCK_XML2_VALUE"]];
3503 if(strpos($arElement[
"PREVIEW_TEXT"],
"<") !==
false)
3504 $arElement[
"PREVIEW_TEXT_TYPE"] =
"html";
3506 $arElement[
"PREVIEW_TEXT_TYPE"] =
"text";
3509 $value[$this->mess[
"IBLOCK_XML2_NAME"]] == $this->mess[
"IBLOCK_XML2_HTML_DESCRIPTION"]
3512 if($value[$this->mess[
"IBLOCK_XML2_VALUE"]] <>
'')
3514 $arElement[
"DETAIL_TEXT"] = $value[$this->mess[
"IBLOCK_XML2_VALUE"]];
3515 $arElement[
"DETAIL_TEXT_TYPE"] =
"html";
3519 $value[$this->mess[
"IBLOCK_XML2_NAME"]] == $this->mess[
"IBLOCK_XML2_FILE"]
3522 if($value[$this->mess[
"IBLOCK_XML2_VALUE"]] <>
'')
3524 $prop_id = $this->PROPERTY_MAP[
"CML2_FILES"] ?? 0;
3527 while (isset($arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$j]))
3530 $file = $this->
MakeFileArray($value[$this->mess[
"IBLOCK_XML2_VALUE"]],
array($prop_id));
3531 if (is_array($file))
3533 $arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$j] =
array(
3535 "DESCRIPTION" =>
"",
3537 unset($arElement[
"PROPERTY_VALUES"][$prop_id][
"bOld"]);
3538 $this->arFileDescriptionsMap[$value[$this->mess[
"IBLOCK_XML2_VALUE"]]][] = &$arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$j][
"DESCRIPTION"];
3539 $cleanCml2FilesProperty =
true;
3544 $value[$this->mess[
"IBLOCK_XML2_NAME"]] == $this->mess[
"IBLOCK_XML2_FILE_DESCRIPTION"]
3547 if($value[$this->mess[
"IBLOCK_XML2_VALUE"]] <>
'')
3550 if (isset($this->arFileDescriptionsMap[
$fileName]))
3559 if($value[$this->mess[
"IBLOCK_XML2_NAME"]] == $this->mess[
"IBLOCK_XML2_WEIGHT"])
3561 $arElement[
"BASE_WEIGHT"] = $this->
ToFloat($value[$this->mess[
"IBLOCK_XML2_VALUE"]])*1000;
3562 $weightKey =
"n".$i;
3564 if (isset($this->PROPERTY_MAP[
"CML2_TRAITS"]))
3566 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_TRAITS"]][
"n" .
$i] = [
3567 "VALUE" => $value[$this->mess[
"IBLOCK_XML2_VALUE"]],
3568 "DESCRIPTION" => $value[$this->mess[
"IBLOCK_XML2_NAME"]],
3576 if (isset($arXMLElement[$this->mess[
"IBLOCK_XML2_WEIGHT"]]))
3578 if (isset($this->PROPERTY_MAP[
"CML2_TRAITS"]))
3580 if ($weightKey ===
false)
3582 if (!isset($arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_TRAITS"]]))
3584 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_TRAITS"]] = [];
3589 $weightKey =
"n" .
$i;
3592 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_TRAITS"]][$weightKey] = [
3593 "VALUE" => $arXMLElement[$this->mess[
"IBLOCK_XML2_WEIGHT"]],
3594 "DESCRIPTION" => $this->mess[
"IBLOCK_XML2_WEIGHT"],
3597 $arElement[
"BASE_WEIGHT"] = $this->
ToFloat($arXMLElement[$this->mess[
"IBLOCK_XML2_WEIGHT"]])*1000;
3600 if ($this->bCatalog)
3602 $arElement = array_merge(
3608 if ($cleanCml2FilesProperty)
3610 $prop_id = $this->PROPERTY_MAP[
"CML2_FILES"] ?? 0;
3612 isset($arElement[
"PROPERTY_VALUES"][$prop_id])
3613 && is_array($arElement[
"PROPERTY_VALUES"][$prop_id])
3616 foreach($arElement[
"PROPERTY_VALUES"][$prop_id] as $PROPERTY_VALUE_ID => $PROPERTY_VALUE)
3618 if(!$PROPERTY_VALUE_ID)
3619 unset($arElement[
"PROPERTY_VALUES"][$prop_id][$PROPERTY_VALUE_ID]);
3620 elseif(strncmp($PROPERTY_VALUE_ID,
"n", 1) !== 0)
3621 $arElement[
"PROPERTY_VALUES"][$prop_id][$PROPERTY_VALUE_ID] =
array(
3626 unset($arElement[
"PROPERTY_VALUES"][$prop_id][
"bOld"]);
3630 if (isset($arXMLElement[$this->mess[
"IBLOCK_XML2_TAXES_VALUES"]]))
3632 if (isset($this->PROPERTY_MAP[
"CML2_TAXES"]))
3634 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_TAXES"]] = [];
3636 foreach ($arXMLElement[$this->mess[
"IBLOCK_XML2_TAXES_VALUES"]] as $value)
3638 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_TAXES"]][
"n" .
$i] = [
3639 "VALUE" => $value[$this->mess[
"IBLOCK_XML2_TAX_VALUE"]],
3640 "DESCRIPTION" => $value[$this->mess[
"IBLOCK_XML2_NAME"]],
3647 $rsBaseUnit = $this->_xml_file->GetList(
3648 array(
"ID" =>
"asc"),
3650 "><LEFT_MARGIN" =>
array($arParent[
"LEFT_MARGIN"], $arParent[
"RIGHT_MARGIN"]),
3651 "NAME" => $this->mess[
"IBLOCK_XML2_BASE_UNIT"],
3653 array(
"ID",
"ATTRIBUTES")
3655 while ($arBaseUnit = $rsBaseUnit->Fetch())
3657 if($arBaseUnit[
"ATTRIBUTES"] <>
'')
3659 $info = unserialize($arBaseUnit[
"ATTRIBUTES"], [
'allowed_classes' =>
false]);
3662 && array_key_exists($this->mess[
"IBLOCK_XML2_CODE"],
$info)
3665 $arXMLElement[$this->mess[
"IBLOCK_XML2_BASE_UNIT"]] =
$info[$this->mess[
"IBLOCK_XML2_CODE"]];
3670 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_BASE_UNIT"]]))
3673 if (isset($this->PROPERTY_MAP[
"CML2_BASE_UNIT"]))
3675 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_BASE_UNIT"]] = [
3679 if ($unitData[
"DESCRIPTION"])
3681 $arElement[
'MEASURE'] = $unitData[
"DESCRIPTION"];
3685 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_PROPERTIES_VALUES"]]))
3687 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_PROPERTIES_VALUES"]] as $value)
3689 if (!isset($value[$this->mess[
'IBLOCK_XML2_ID']]))
3694 $prop_id = $value[$this->mess[
"IBLOCK_XML2_ID"]];
3695 unset($value[$this->mess[
"IBLOCK_XML2_ID"]]);
3698 if(!array_key_exists($prop_id, $this->PROPERTY_MAP))
3700 if($prop_id ==
"CML2_CODE")
3701 $arElement[
"CODE"] = $value[$this->mess[
"IBLOCK_XML2_VALUE"]] ??
"";
3702 elseif($prop_id ==
"CML2_ACTIVE")
3704 $value = array_pop($value);
3705 $arElement[
"ACTIVE"] = ($value==
"true") || intval($value)?
"Y":
"N";
3707 elseif($prop_id ==
"CML2_SORT")
3708 $arElement[
"SORT"] = array_pop($value);
3709 elseif($prop_id ==
"CML2_ACTIVE_FROM")
3710 $arElement[
"ACTIVE_FROM"] = CDatabase::FormatDate(array_pop($value),
"YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat(
"FULL"));
3711 elseif($prop_id ==
"CML2_ACTIVE_TO")
3712 $arElement[
"ACTIVE_TO"] = CDatabase::FormatDate(array_pop($value),
"YYYY-MM-DD HH:MI:SS", CLang::GetDateFormat(
"FULL"));
3713 elseif($prop_id ==
"CML2_PREVIEW_TEXT")
3715 if(array_key_exists($this->mess[
"IBLOCK_XML2_VALUE"], $value))
3717 if(isset($value[$this->mess[
"IBLOCK_XML2_VALUE"]]))
3718 $arElement[
"PREVIEW_TEXT"] = $value[$this->mess[
"IBLOCK_XML2_VALUE"]];
3720 $arElement[
"PREVIEW_TEXT"] =
"";
3722 if(isset($value[$this->mess[
"IBLOCK_XML2_TYPE"]]))
3723 $arElement[
"PREVIEW_TEXT_TYPE"] = $value[$this->mess[
"IBLOCK_XML2_TYPE"]];
3725 $arElement[
"PREVIEW_TEXT_TYPE"] =
"html";
3728 elseif($prop_id ==
"CML2_DETAIL_TEXT")
3730 if(array_key_exists($this->mess[
"IBLOCK_XML2_VALUE"], $value))
3732 if(isset($value[$this->mess[
"IBLOCK_XML2_VALUE"]]))
3733 $arElement[
"DETAIL_TEXT"] = $value[$this->mess[
"IBLOCK_XML2_VALUE"]];
3735 $arElement[
"DETAIL_TEXT"] =
"";
3737 if(isset($value[$this->mess[
"IBLOCK_XML2_TYPE"]]))
3738 $arElement[
"DETAIL_TEXT_TYPE"] = $value[$this->mess[
"IBLOCK_XML2_TYPE"]];
3740 $arElement[
"DETAIL_TEXT_TYPE"] =
"html";
3743 elseif($prop_id ==
"CML2_PREVIEW_PICTURE")
3745 if(!is_array($this->preview) || !$arElement[
"PREVIEW_PICTURE"])
3747 $arElement[
"PREVIEW_PICTURE"] = $this->
MakeFileArray($value[$this->mess[
"IBLOCK_XML2_VALUE"]],
array(
"PREVIEW_PICTURE"));
3748 $arElement[
"PREVIEW_PICTURE"][
"COPY_FILE"] =
"Y";
3755 $prop_id = $this->PROPERTY_MAP[$prop_id];
3756 $prop_type = $this->arProperties[$prop_id][
"PROPERTY_TYPE"];
3758 if(!array_key_exists($prop_id, $arElement[
"PROPERTY_VALUES"]))
3759 $arElement[
"PROPERTY_VALUES"][$prop_id] =
array();
3762 if(array_key_exists($this->mess[
"IBLOCK_XML2_PROPERTY_VALUE"], $value))
3765 $strPV = $this->mess[
"IBLOCK_XML2_PROPERTY_VALUE"];
3766 $lPV = mb_strlen($strPV);
3767 foreach($value as
$k=>$prop_value)
3769 if ($prop_value ===
null)
3773 if(mb_substr(
$k, 0, $lPV) === $strPV)
3775 if(array_key_exists($this->mess[
"IBLOCK_XML2_SERIALIZED"], $prop_value))
3776 $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]] = $this->
Unserialize($prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]]);
3779 $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]] = $this->
MakeFileArray($prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]],
array($prop_id));
3782 $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]] = $this->
GetSectionByXML_ID($this->arProperties[$prop_id][
"LINK_IBLOCK_ID"], $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]]);
3784 $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]] = $this->
GetElementByXML_ID($this->arProperties[$prop_id][
"LINK_IBLOCK_ID"], $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]]);
3786 $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]] = $this->
GetEnumByXML_ID($this->arProperties[$prop_id][
"ID"], $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]]);
3788 if(array_key_exists(
"bOld", $arElement[
"PROPERTY_VALUES"][$prop_id]))
3792 foreach($arElement[
"PROPERTY_VALUES"][$prop_id] as $PROPERTY_VALUE_ID => $PROPERTY_VALUE)
3793 $arElement[
"PROPERTY_VALUES"][$prop_id][$PROPERTY_VALUE_ID] =
array(
3797 unset($arElement[
"PROPERTY_VALUES"][$prop_id][
"bOld"]);
3800 $arElement[
"PROPERTY_VALUES"][$prop_id] =
array();
3803 $arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$i] =
array(
3804 "VALUE" => $prop_value[$this->mess[
"IBLOCK_XML2_VALUE"]],
3805 "DESCRIPTION" => $prop_value[$this->mess[
"IBLOCK_XML2_DESCRIPTION"]] ??
null,
3813 if($prop_type ==
"L" && !array_key_exists($this->mess[
"IBLOCK_XML2_VALUE_ID"], $value))
3814 $l_key = $this->mess[
"IBLOCK_XML2_VALUE"];
3816 $l_key = $this->mess[
"IBLOCK_XML2_VALUE_ID"];
3819 foreach($value as
$k=>$prop_value)
3821 if(array_key_exists(
"bOld", $arElement[
"PROPERTY_VALUES"][$prop_id]))
3825 foreach($arElement[
"PROPERTY_VALUES"][$prop_id] as $PROPERTY_VALUE_ID => $PROPERTY_VALUE)
3826 $arElement[
"PROPERTY_VALUES"][$prop_id][$PROPERTY_VALUE_ID] =
array(
3830 unset($arElement[
"PROPERTY_VALUES"][$prop_id][
"bOld"]);
3834 $arElement[
"PROPERTY_VALUES"][$prop_id] =
array();
3838 if($prop_type ==
"L" &&
$k == $l_key)
3840 $prop_value = $this->
GetEnumByXML_ID($this->arProperties[$prop_id][
"ID"], $prop_value);
3842 elseif($prop_type ==
"N" && isset($this->next_step[
"sdp"]))
3844 if ($prop_value <>
'')
3845 $prop_value = $this->
ToFloat($prop_value);
3848 $arElement[
"PROPERTY_VALUES"][$prop_id][
"n".$i] =
array(
3849 "VALUE" => $prop_value,
3850 "DESCRIPTION" =>
false,
3859 if (isset($this->PROPERTY_MAP[
"CML2_BASE_UNIT"]))
3863 !array_key_exists($this->PROPERTY_MAP[
"CML2_BASE_UNIT"], $arElement[
"PROPERTY_VALUES"])
3865 is_array($arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_BASE_UNIT"]])
3866 && array_key_exists(
"bOld",
3867 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_BASE_UNIT"]])
3870 && isset($arXMLElement[$this->mess[
"IBLOCK_XML2_PRICES"]])
3873 foreach ($arXMLElement[$this->mess[
"IBLOCK_XML2_PRICES"]] as $price)
3876 isset($price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]])
3877 && array_key_exists($price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]], $this->PRICES_MAP)
3878 && array_key_exists($this->mess[
"IBLOCK_XML2_MEASURE"], $price)
3881 $arElement[
"PROPERTY_VALUES"][$this->PROPERTY_MAP[
"CML2_BASE_UNIT"]] = [
3892 foreach($arElement[
"PROPERTY_VALUES"] as $prop_id=>$prop)
3894 if(is_array($arElement[
"PROPERTY_VALUES"][$prop_id]) && array_key_exists(
"bOld", $arElement[
"PROPERTY_VALUES"][$prop_id]))
3896 if($this->arProperties[$prop_id][
"PROPERTY_TYPE"]==
"F")
3897 unset($arElement[
"PROPERTY_VALUES"][$prop_id]);
3899 unset($arElement[
"PROPERTY_VALUES"][$prop_id][
"bOld"]);
3903 if (!isset($arElement[
'MODIFIED_BY']) || (
int)$arElement[
'MODIFIED_BY'] <= 0)
3905 if ($this->currentUserId > 0)
3911 if(!array_key_exists(
"CODE", $arElement) && is_array($this->translit_on_update))
3913 $CODE = CUtil::translit($arElement[
"NAME"], LANGUAGE_ID, $this->translit_on_update);
3914 $CODE = $this->
CheckElementCode($this->next_step[
"IBLOCK_ID"], $arDBElement[
"ID"], $CODE);
3916 $arElement[
"CODE"] = $CODE;
3921 isset($arElement[
"DETAIL_PICTURE"])
3922 && !isset($arElement[
"PREVIEW_PICTURE"])
3923 && is_array($arElement[
"DETAIL_PICTURE"])
3924 && isset($arElement[
"DETAIL_PICTURE"][
"external_id"])
3925 && $this->arElementFilesId
3926 && $this->arElementFilesId[
"DETAIL_PICTURE"]
3927 && isset($this->arElementFiles[$this->arElementFilesId[
"DETAIL_PICTURE"][0]])
3928 && $this->arElementFiles[$this->arElementFilesId[
"DETAIL_PICTURE"][0]][
"EXTERNAL_ID"] === $arElement[
"DETAIL_PICTURE"][
"external_id"]
3929 && $this->arElementFiles[$this->arElementFilesId[
"DETAIL_PICTURE"][0]][
"DESCRIPTION"] === $arElement[
"DETAIL_PICTURE"][
"description"]
3932 unset($arElement[
"DETAIL_PICTURE"]);
3935 $updateResult = $obElement->Update($arDBElement[
"ID"], $arElement, $bWF,
true, $this->iblock_resize);
3937 if($arDBElement[
"ACTIVE"] !=
"Y")
3941 $arElement[
"ID"] = $arDBElement[
"ID"];
3948 $this->LAST_ERROR = $obElement->LAST_ERROR;
3954 if(!array_key_exists(
"CODE", $arElement) && is_array($this->translit_on_add))
3956 $CODE = CUtil::translit($arElement[
"NAME"], LANGUAGE_ID, $this->translit_on_add);
3959 $arElement[
"CODE"] = $CODE;
3962 $arElement[
"IBLOCK_ID"] = $this->next_step[
"IBLOCK_ID"];
3965 $arElement[
"ID"] = $obElement->Add($arElement, $bWF,
true, $this->iblock_resize);
3966 if($arElement[
"ID"])
3972 $this->LAST_ERROR = $obElement->LAST_ERROR;
3977 elseif(array_key_exists($this->mess[
"IBLOCK_XML2_PRICES"], $arXMLElement))
3980 $arElement[
"PRICES"] =
array();
3981 if (is_array($arXMLElement[$this->mess[
"IBLOCK_XML2_PRICES"]]))
3983 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_PRICES"]] as $price)
3985 if(isset($price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]]) && array_key_exists($price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]], $this->PRICES_MAP))
3987 $price[
"PRICE"] = $this->PRICES_MAP[$price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]]];
3988 $arElement[
"PRICES"][] = $price;
3993 $arElement[
"DISCOUNTS"] =
array();
3994 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_DISCOUNTS"]]))
3996 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_DISCOUNTS"]] as
$discount)
3999 isset(
$discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_CONDITION"]])
4000 &&
$discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_CONDITION"]]===$this->mess[
"IBLOCK_XML2_DISCOUNT_COND_VOLUME"]
4003 $discount_value = $this->
ToInt($discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_COND_VALUE"]]);
4004 $discount_percent = $this->
ToFloat($discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_COND_PERCENT"]]);
4005 if($discount_value > 0 && $discount_percent > 0)
4006 $arElement[
"DISCOUNTS"][$discount_value] = $discount_percent;
4013 $arElement[
"ID"] = $arDBElement[
"ID"];
4018 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_STORE_AMOUNT_LIST"]]))
4020 $arElement[
"STORE_AMOUNT"] =
array();
4021 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_STORE_AMOUNT_LIST"]] as $storeAmount)
4023 if(isset($storeAmount[$this->mess[
"IBLOCK_XML2_STORE_ID"]]))
4025 $storeXMLID = $storeAmount[$this->mess[
"IBLOCK_XML2_STORE_ID"]];
4026 $amount = $this->
ToFloat($storeAmount[$this->mess[
"IBLOCK_XML2_AMOUNT"]]);
4027 $arElement[
"STORE_AMOUNT"][$storeXMLID] =
$amount;
4032 array_key_exists($this->mess[
"IBLOCK_XML2_STORES"], $arXMLElement)
4033 || array_key_exists($this->mess[
"IBLOCK_XML2_STORE"], $arXMLElement)
4036 $arElement[
"STORE_AMOUNT"] =
array();
4037 $rsStores = $this->_xml_file->GetList(
4038 array(
"ID" =>
"asc"),
4040 "><LEFT_MARGIN" =>
array($arParent[
"LEFT_MARGIN"], $arParent[
"RIGHT_MARGIN"]),
4041 "NAME" => $this->mess[
"IBLOCK_XML2_STORE"],
4043 array(
"ID",
"ATTRIBUTES")
4045 while ($arStore = $rsStores->Fetch())
4047 if($arStore[
"ATTRIBUTES"] <>
'')
4049 $info = unserialize($arStore[
"ATTRIBUTES"], [
'allowed_classes' =>
false]);
4052 && array_key_exists($this->mess[
"IBLOCK_XML2_STORE_ID"],
$info)
4053 && array_key_exists($this->mess[
"IBLOCK_XML2_STORE_AMOUNT"],
$info)
4056 $arElement[
"STORE_AMOUNT"][
$info[$this->mess[
"IBLOCK_XML2_STORE_ID"]]] = $this->
ToFloat(
$info[$this->mess[
"IBLOCK_XML2_STORE_AMOUNT"]]);
4062 if($bMatch && $this->use_crc)
4066 elseif($arElement[
"ID"] && $this->bCatalog && $this->isCatalogIblock)
4069 "ID" => $arElement[
"ID"],
4072 if(isset($arElement[
"QUANTITY"]))
4073 $arProduct[
"QUANTITY"] = (float)$arElement[
"QUANTITY"];
4074 elseif(isset($arElement[
"STORE_AMOUNT"]) && !empty($arElement[
"STORE_AMOUNT"]))
4078 $CML_LINK_ELEMENT = 0;
4079 if (isset($this->PROPERTY_MAP[
"CML2_LINK"]))
4081 $CML_LINK = $this->PROPERTY_MAP[
"CML2_LINK"];
4082 if (isset($arElement[
"PROPERTY_VALUES"][$CML_LINK]))
4084 $CML_LINK_ELEMENT = $arElement[
"PROPERTY_VALUES"][$CML_LINK];
4087 if (is_array($CML_LINK_ELEMENT) && isset($CML_LINK_ELEMENT[
"n0"]))
4089 $CML_LINK_ELEMENT = $CML_LINK_ELEMENT[
"n0"];
4091 if (is_array($CML_LINK_ELEMENT) && isset($CML_LINK_ELEMENT[
"VALUE"]))
4093 $CML_LINK_ELEMENT = $CML_LINK_ELEMENT[
"VALUE"];
4096 if(isset($arElement[
"BASE_WEIGHT"]))
4098 $arProduct[
"WEIGHT"] = (float)$arElement[
"BASE_WEIGHT"];
4100 elseif ($CML_LINK_ELEMENT > 0)
4102 $rsWeight = CIBlockElement::GetProperty($this->arProperties[$CML_LINK][
"LINK_IBLOCK_ID"], $CML_LINK_ELEMENT,
array(),
array(
"CODE" =>
"CML2_TRAITS"));
4103 while($arWeight = $rsWeight->Fetch())
4105 if($arWeight[
"DESCRIPTION"] == $this->mess[
"IBLOCK_XML2_WEIGHT"])
4106 $arProduct[
"WEIGHT"] = $this->
ToFloat($arWeight[
"VALUE"])*1000;
4110 if ($CML_LINK_ELEMENT > 0)
4112 $rsUnit = CIBlockElement::GetProperty($this->arProperties[$CML_LINK][
"LINK_IBLOCK_ID"], $CML_LINK_ELEMENT,
array(),
array(
"CODE" =>
"CML2_BASE_UNIT"));
4113 while($arUnit = $rsUnit->Fetch())
4115 if($arUnit[
"DESCRIPTION"] > 0)
4116 $arProduct[
"MEASURE"] = $arUnit[
"DESCRIPTION"];
4120 if(isset($arElement[
"PRICES"]))
4125 $arTaxMap =
array();
4126 if ($CML_LINK !==
'' && isset($this->arProperties[$CML_LINK]) && $CML_LINK_ELEMENT > 0)
4128 $rsTaxProperty = CIBlockElement::GetProperty(
4129 $this->arProperties[$CML_LINK][
"LINK_IBLOCK_ID"],
4134 "CODE" =>
"CML2_TAXES",
4137 while ($arTaxProperty = $rsTaxProperty->Fetch())
4140 $arTaxProperty[
"DESCRIPTION"] <>
''
4141 && !array_key_exists($arTaxProperty[
"DESCRIPTION"], $arTaxMap)
4144 if ($arTaxProperty[
"VALUE"] ===
'' || !is_numeric($arTaxProperty[
"VALUE"]))
4150 $taxValue = $this->
ToFloat($arTaxProperty[
"VALUE"]);
4152 $arTaxMap[$arTaxProperty[
"DESCRIPTION"]] = [
4153 "RATE" => $this->
ToFloat($arTaxProperty[
"VALUE"]),
4154 "ID" => $this->
CheckTax($arTaxProperty[
"DESCRIPTION"], $taxValue),
4158 unset($rsTaxProperty);
4164 foreach($arElement[
"PRICES"] as $price)
4166 if($price[
"PRICE"][
"TAX_IN_SUM"] !==
"true")
4174 if($TAX_IN_SUM ===
"N")
4176 foreach($arElement[
"PRICES"] as $price)
4178 if($price[
"PRICE"][
"TAX_IN_SUM"] !==
"false")
4186 if($TAX_IN_SUM ===
"Y")
4188 foreach($arElement[
"PRICES"] as
$key=>$price)
4190 if($price[
"PRICE"][
"TAX_IN_SUM"] !==
"true")
4192 $TAX_NAME = $price[
"PRICE"][
"TAX_NAME"];
4193 if(array_key_exists($TAX_NAME, $arTaxMap))
4195 $PRICE_WO_TAX = $this->
ToFloat($price[$this->mess[
"IBLOCK_XML2_PRICE_FOR_ONE"]]);
4196 $PRICE = $PRICE_WO_TAX + ($PRICE_WO_TAX / 100.0 * $arTaxMap[$TAX_NAME][
"RATE"]);
4197 $arElement[
"PRICES"][
$key][$this->mess[
"IBLOCK_XML2_PRICE_FOR_ONE"]] = $PRICE;
4203 foreach($arElement[
"PRICES"] as $price)
4205 $TAX_NAME = $price[
"PRICE"][
"TAX_NAME"];
4206 if(array_key_exists($TAX_NAME, $arTaxMap))
4208 $arProduct[
"VAT_ID"] = $arTaxMap[$TAX_NAME][
"ID"];
4212 $arProduct[
"VAT_INCLUDED"] = $TAX_IN_SUM;
4215 $arProduct = array_merge(
4221 if (!empty($productCache))
4226 'fields' => $arProduct,
4227 'external_fields' =>
array(
4228 'IBLOCK_ID' => $this->next_step[
"IBLOCK_ID"]
4237 'fields' => $arProduct,
4238 'external_fields' =>
array(
4239 'IBLOCK_ID' => $this->next_step[
"IBLOCK_ID"]
4244 if ($productResult->isSuccess())
4248 'select' =>
array(
'ID'),
4249 'filter' =>
array(
'=PRODUCT_ID' => $arElement[
'ID'])
4252 if (empty($ratioRow))
4254 $ratioResult = \Bitrix\Catalog\MeasureRatioTable::add(
array(
4255 'PRODUCT_ID' => $arElement[
'ID'],
4259 unset($ratioResult);
4264 if(isset($arElement[
"PRICES"]))
4265 $this->
SetProductPrice($arElement[
"ID"], $arElement[
"PRICES"], $arElement[
"DISCOUNTS"]);
4267 if(isset($arElement[
"STORE_AMOUNT"]))
4272 return $arElement[
"ID"];
4355 static $catalogs =
array();
4359 "XML_ID" => $arXMLElement[$this->mess[
"IBLOCK_XML2_ID"]],
4362 $hashPosition = strrpos($arElement[
"XML_ID"],
"#");
4365 && $hashPosition ===
false && !$this->force_offers
4366 && isset($this->PROPERTY_MAP[
"CML2_LINK"])
4367 && isset($this->arProperties[$this->PROPERTY_MAP[
"CML2_LINK"]])
4370 $IBLOCK_ID = $this->arProperties[$this->PROPERTY_MAP[
"CML2_LINK"]][
"LINK_IBLOCK_ID"];
4381 "YANDEX_EXPORT" =>
"N",
4382 "SUBSCRIPTION" =>
"N",
4387 $this->LAST_ERROR = $ex->GetString();
4399 $rsElement = $obElement->
GetList(
4401 Array(
"=XML_ID" => $arElement[
"XML_ID"],
"IBLOCK_ID" =>
$IBLOCK_ID),
4403 Array(
"ID",
"TMP_ID",
"ACTIVE")
4405 $arDBElement = $rsElement->Fetch();
4407 $arElement[
"ID"] = $arDBElement[
"ID"];
4409 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_STORE_AMOUNT_LIST"]]))
4411 $arElement[
"STORE_AMOUNT"] =
array();
4412 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_STORE_AMOUNT_LIST"]] as $storeAmount)
4414 if(isset($storeAmount[$this->mess[
"IBLOCK_XML2_STORE_ID"]]))
4416 $storeXMLID = $storeAmount[$this->mess[
"IBLOCK_XML2_STORE_ID"]];
4417 $amount = $this->
ToFloat($storeAmount[$this->mess[
"IBLOCK_XML2_AMOUNT"]]);
4418 $arElement[
"STORE_AMOUNT"][$storeXMLID] =
$amount;
4422 elseif(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_RESTS"]]))
4424 $arElement[
"STORE_AMOUNT"] =
array();
4425 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_RESTS"]] as $xmlRest)
4427 foreach($xmlRest as $storeAmount)
4429 if(is_array($storeAmount))
4431 if (isset($storeAmount[$this->mess[
"IBLOCK_XML2_ID"]]))
4433 $storeXMLID = $storeAmount[$this->mess[
"IBLOCK_XML2_ID"]];
4434 $amount = $this->
ToFloat($storeAmount[$this->mess[
"IBLOCK_XML2_AMOUNT"]]);
4435 $arElement[
"STORE_AMOUNT"][$storeXMLID] =
$amount;
4440 if ($storeAmount <>
'')
4443 $arElement[
"QUANTITY"] =
$amount;
4452 array_key_exists($this->mess[
"IBLOCK_XML2_STORES"], $arXMLElement)
4453 || array_key_exists($this->mess[
"IBLOCK_XML2_STORE"], $arXMLElement)
4457 $arElement[
"STORE_AMOUNT"] =
array();
4458 $rsStores = $this->_xml_file->GetList(
4459 array(
"ID" =>
"asc"),
4461 "><LEFT_MARGIN" =>
array($arParent[
"LEFT_MARGIN"], $arParent[
"RIGHT_MARGIN"]),
4462 "NAME" => $this->mess[
"IBLOCK_XML2_STORE"],
4464 array(
"ID",
"ATTRIBUTES")
4466 while ($arStore = $rsStores->Fetch())
4468 if($arStore[
"ATTRIBUTES"] <>
'')
4470 $info = unserialize($arStore[
"ATTRIBUTES"], [
'allowed_classes' =>
false]);
4473 && array_key_exists($this->mess[
"IBLOCK_XML2_STORE_ID"],
$info)
4474 && array_key_exists($this->mess[
"IBLOCK_XML2_STORE_AMOUNT"],
$info)
4477 $arElement[
"STORE_AMOUNT"][
$info[$this->mess[
"IBLOCK_XML2_STORE_ID"]]] = $this->
ToFloat(
$info[$this->mess[
"IBLOCK_XML2_STORE_AMOUNT"]]);
4483 if(isset($arElement[
"STORE_AMOUNT"]))
4489 "ID" => $arElement[
"ID"],
4492 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_PRICES"]]))
4494 $arElement[
"PRICES"] =
array();
4495 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_PRICES"]] as $price)
4498 isset($price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]])
4499 && array_key_exists($price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]], $this->PRICES_MAP)
4502 $price[
"PRICE"] = $this->PRICES_MAP[$price[$this->mess[
"IBLOCK_XML2_PRICE_TYPE_ID"]]];
4503 $arElement[
"PRICES"][] = $price;
4506 array_key_exists($this->mess[
"IBLOCK_XML2_MEASURE"], $price)
4507 && !isset($arProduct[
"MEASURE"])
4511 if (
$tmp[
"DESCRIPTION"] > 0)
4512 $arProduct[
"MEASURE"] =
$tmp[
"DESCRIPTION"];
4517 $arElement[
"DISCOUNTS"] =
array();
4518 if(isset($arXMLElement[$this->mess[
"IBLOCK_XML2_DISCOUNTS"]]))
4520 foreach($arXMLElement[$this->mess[
"IBLOCK_XML2_DISCOUNTS"]] as
$discount)
4523 isset(
$discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_CONDITION"]])
4524 &&
$discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_CONDITION"]] === $this->mess[
"IBLOCK_XML2_DISCOUNT_COND_VOLUME"]
4527 $discount_value = $this->
ToInt($discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_COND_VALUE"]]);
4528 $discount_percent = $this->
ToFloat($discount[$this->mess[
"IBLOCK_XML2_DISCOUNT_COND_PERCENT"]]);
4529 if($discount_value > 0 && $discount_percent > 0)
4530 $arElement[
"DISCOUNTS"][$discount_value] = $discount_percent;
4536 if($this->bCatalog && array_key_exists($this->mess[
"IBLOCK_XML2_AMOUNT"], $arXMLElement))
4538 $arElement[
"QUANTITY_RESERVED"] = 0;
4539 if($arElement[
"ID"])
4542 'select' => [
'ID',
'QUANTITY_RESERVED'],
4543 'filter' => [
'=ID' => $arDBElement[
'ID']]
4546 if (!empty($arElementTmp) && is_array($arElementTmp) && isset($arElementTmp[
"QUANTITY_RESERVED"]))
4547 $arElement[
"QUANTITY_RESERVED"] = (float)$arElementTmp[
"QUANTITY_RESERVED"];
4548 unset($arElementTmp);
4551 $arElement[
"QUANTITY"] = $this->
ToFloat($arXMLElement[$this->mess[
"IBLOCK_XML2_AMOUNT"]]) - $arElement[
"QUANTITY_RESERVED"];
4554 if(isset($arElement[
"PRICES"]) && $this->bCatalog)
4556 if(isset($arElement[
"QUANTITY"]))
4557 $arProduct[
"QUANTITY"] = (float)$arElement[
"QUANTITY"];
4558 elseif(isset($arElement[
"STORE_AMOUNT"]) && !empty($arElement[
"STORE_AMOUNT"]))
4561 $rsWeight = CIBlockElement::GetProperty(
$IBLOCK_ID, $arElement[
"ID"],
array(),
array(
"CODE" =>
"CML2_TRAITS"));
4562 while($arWeight = $rsWeight->Fetch())
4564 if($arWeight[
"DESCRIPTION"] == $this->mess[
"IBLOCK_XML2_WEIGHT"])
4565 $arProduct[
"WEIGHT"] = $this->
ToFloat($arWeight[
"VALUE"])*1000;
4568 $rsUnit = CIBlockElement::GetProperty(
$IBLOCK_ID, $arElement[
"ID"],
array(),
array(
"CODE" =>
"CML2_BASE_UNIT"));
4569 while($arUnit = $rsUnit->Fetch())
4571 if($arUnit[
"DESCRIPTION"] > 0)
4572 $arProduct[
"MEASURE"] = $arUnit[
"DESCRIPTION"];
4578 $arTaxMap =
array();
4579 $rsTaxProperty = CIBlockElement::GetProperty(
$IBLOCK_ID, $arElement[
"ID"],
array(
"sort" =>
"asc"),
array(
"CODE" =>
"CML2_TAXES"));
4580 while($arTaxProperty = $rsTaxProperty->Fetch())
4583 $arTaxProperty[
"DESCRIPTION"] <>
''
4584 && !array_key_exists($arTaxProperty[
"DESCRIPTION"], $arTaxMap)
4587 if ($arTaxProperty[
"VALUE"] ===
'' || !is_numeric($arTaxProperty[
"VALUE"]))
4593 $taxValue = $this->
ToFloat($arTaxProperty[
"VALUE"]);
4595 $arTaxMap[$arTaxProperty[
"DESCRIPTION"]] =
array(
4596 "RATE" => $this->
ToFloat($arTaxProperty[
"VALUE"]),
4597 "ID" => $this->
CheckTax($arTaxProperty[
"DESCRIPTION"], $taxValue),
4605 && $this->use_offers
4606 && $hashPosition !==
false
4607 && isset($this->PROPERTY_MAP[
"CML2_LINK"])
4608 && $this->arProperties[$this->PROPERTY_MAP[
"CML2_LINK"]][
"LINK_IBLOCK_ID"] > 0
4611 $rsLinkProperty = CIBlockElement::GetProperty(
$IBLOCK_ID, $arElement[
"ID"],
array(
"sort" =>
"asc"),
array(
"CODE" =>
"CML2_LINK"));
4612 if( ($arLinkProperty = $rsLinkProperty->Fetch()) && ($arLinkProperty[
"VALUE"] > 0))
4614 $rsTaxProperty = CIBlockElement::GetProperty($this->arProperties[$this->PROPERTY_MAP[
"CML2_LINK"]][
"LINK_IBLOCK_ID"], $arLinkProperty[
"VALUE"],
array(
"sort" =>
"asc"),
array(
"CODE" =>
"CML2_TAXES"));
4615 while($arTaxProperty = $rsTaxProperty->Fetch())
4618 $arTaxProperty[
"DESCRIPTION"] <>
''
4619 && !array_key_exists($arTaxProperty[
"DESCRIPTION"], $arTaxMap)
4622 if ($arTaxProperty[
"VALUE"] ===
'' || !is_numeric($arTaxProperty[
"VALUE"]))
4628 $taxValue = $this->
ToFloat($arTaxProperty[
"VALUE"]);
4630 $arTaxMap[$arTaxProperty[
"DESCRIPTION"]] =
array(
4631 "RATE" => $this->
ToFloat($arTaxProperty[
"VALUE"]),
4632 "ID" => $this->
CheckTax($arTaxProperty[
"DESCRIPTION"], $taxValue),
4641 foreach($arElement[
"PRICES"] as $price)
4643 if($price[
"PRICE"][
"TAX_IN_SUM"] !==
"true")
4651 if($TAX_IN_SUM ===
"N")
4653 foreach($arElement[
"PRICES"] as $price)
4655 if($price[
"PRICE"][
"TAX_IN_SUM"] !==
"false")
4663 if($TAX_IN_SUM ===
"Y")
4665 foreach($arElement[
"PRICES"] as
$key=>$price)
4667 if($price[
"PRICE"][
"TAX_IN_SUM"] !==
"true")
4669 $TAX_NAME = $price[
"PRICE"][
"TAX_NAME"];
4670 if(array_key_exists($TAX_NAME, $arTaxMap))
4672 $PRICE_WO_TAX = $this->
ToFloat($price[$this->mess[
"IBLOCK_XML2_PRICE_FOR_ONE"]]);
4673 $PRICE = $PRICE_WO_TAX + ($PRICE_WO_TAX / 100.0 * $arTaxMap[$TAX_NAME][
"RATE"]);
4674 $arElement[
"PRICES"][
$key][$this->mess[
"IBLOCK_XML2_PRICE_FOR_ONE"]] = $PRICE;
4681 if ($TAX_IN_SUM ==
"Y" && $arTaxMap)
4683 $vat = current($arTaxMap);
4684 $arProduct[
"VAT_ID"] =
$vat[
"ID"];
4688 foreach($arElement[
"PRICES"] as $price)
4690 $TAX_NAME = $price[
"PRICE"][
"TAX_NAME"];
4691 if(array_key_exists($TAX_NAME, $arTaxMap))
4693 $arProduct[
"VAT_ID"] = $arTaxMap[$TAX_NAME][
"ID"];
4699 $arProduct[
"VAT_INCLUDED"] = $TAX_IN_SUM;
4702 if (!empty($productCache))
4707 'fields' => $arProduct,
4708 'external_fields' =>
array(
4718 'fields' => $arProduct,
4719 'external_fields' =>
array(
4725 if ($productResult->isSuccess())
4729 'select' =>
array(
'ID'),
4730 'filter' =>
array(
'=PRODUCT_ID' => $arElement[
'ID'])
4733 if (empty($ratioRow))
4735 $ratioResult = \Bitrix\Catalog\MeasureRatioTable::add(
array(
4736 'PRODUCT_ID' => $arElement[
'ID'],
4740 unset($ratioResult);
4745 $this->
SetProductPrice($arElement[
"ID"], $arElement[
"PRICES"], $arElement[
"DISCOUNTS"]);
4751 (isset($arElement[
"STORE_AMOUNT"]) && !empty($arElement[
"STORE_AMOUNT"]))
4752 || isset($arElement[
"QUANTITY"])
4757 'select' => [
'ID',
'QUANTITY_RESERVED'],
4758 'filter' => [
'=ID' => $arElement[
'ID']]
4761 if (!empty($arElementTmp) && is_array($arElementTmp))
4763 $quantityReserved = 0;
4764 if (isset($arElementTmp[
"QUANTITY_RESERVED"]))
4765 $quantityReserved = (float)$arElementTmp[
"QUANTITY_RESERVED"];
4766 $internalFields = [];
4767 if (isset($arElement[
"STORE_AMOUNT"]) && !empty($arElement[
"STORE_AMOUNT"]))
4771 elseif (isset($arElement[
"QUANTITY"]))
4773 $internalFields[
'QUANTITY'] = $arElement[
"QUANTITY"];
4775 if (!empty($internalFields))
4777 $internalFields[
'QUANTITY'] -= $quantityReserved;
4781 'fields' => $internalFields,
4782 'external_fields' =>
array(
4787 if (!$internalResult->isSuccess())
4791 unset($internalResult);
4793 unset($internalFields);
4794 unset($quantityReserved);
4796 unset($arElementTmp);
4802 return $arElement[
"ID"];