• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/businessvalue.php
  • Класс: BitrixSaleBusinessValueHandlers
  • Вызов: BusinessValueHandlers::getProviders
static function getProviders()
{
	static $providers = array();
	if ($providers)
		return $providers;

	$providers = array(
		'VALUE' => array(
			'NAME'      => Loc::getMessage('BIZVAL_PROVIDER_VALUE'),
			'SORT'      => 100,
		),
		'COMPANY' => array(
			'NAME'   => Loc::getMessage('BIZVAL_PROVIDER_COMPANY'),
			'SORT'   => 600,
			'FIELDS' => call_user_func(function ()
			{
				$data = array(
					'ID'          => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_COMPANY_ID')),
					'NAME'        => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_NAME'       )),
					'LOCATION_ID' => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_LOCATION'   )),
					'CODE'        => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_CODE'       )),
					'XML_ID'      => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_XML_ID'     )),
					'ACTIVE'      => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_ACTIVE'     )),
					'DATE_CREATE' => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_DATE_CREATE')),
					'DATE_MODIFY' => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_DATE_MODIFY')),
					'CREATED_BY'  => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_CREATED_BY' )),
					'MODIFIED_BY' => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_MODIFIED_BY')),
					'ADDRESS'     => array('GROUP' => 'ENTITY', 'NAME' => Loc::getMessage('BIZVAL_CODE_ADDRESS'    )),
				);

				global $USER_FIELD_MANAGER;
				$result = $USER_FIELD_MANAGER->GetUserFields(InternalsCompanyTable::getUfId(), null, LANGUAGE_ID);

				foreach ($result as $name => $row)
					$data[$name] = array('NAME' => $row['EDIT_FORM_LABEL'] ?: $name, 'GROUP' => 'UF');

				return $data;
			}),
			'FIELDS_GROUPS' => array(
				'ENTITY' => array('NAME' => Loc::getMessage('BIZVAL_GROUP_CODE_COMPANY_ENTITY')),
				'UF'     => array('NAME' => Loc::getMessage('BIZVAL_GROUP_CODE_COMPANY_UF'    )),
			),
			'GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId)
			{
				$value = null;

				if ($providerInstance === null)
					return $value;

				if (mb_substr($providerValue, 0, 3) == 'UF_')
				{
					global $USER_FIELD_MANAGER;
					$value = $USER_FIELD_MANAGER->GetUserFieldValue(InternalsCompanyTable::getUfId(), $providerValue, $providerInstance) ?: null;
				}
				elseif ($company = InternalsCompanyTable::getById($providerInstance)->fetch())
				{
					$value = $company[$providerValue];
				}

				return $value;
			},
		),
		'ORDER' => call_user_func(
			function ()
			{
				$result = array(
					'NAME'   => Loc::getMessage('BIZVAL_PROVIDER_ORDER'),
					'SORT'   => 200,
					'FIELDS' => array(
						'ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_ID')),
						'LID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_SITE_ID')),
						'ACCOUNT_NUMBER' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_ACCOUNT_NUMBER')),
						'TRACKING_NUMBER' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_TRACKING_NUMBER')),
						'DATE_INSERT' => array('NAME' => Loc::getMessage('BIZVAL_CODE_DATE_CREATE')),
						'DATE_INSERT_DATE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_DATE_CREATE_DATE')),
						'DATE_UPDATE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_DATE_MODIFY')),
						'PERSON_TYPE_ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PERSON_TYPE_ID')),
						'USER_ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_USER_ID')),
						'PAYED' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAID')),
						'DATE_PAY_BEFORE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_PAY_BEFORE')),
						'SHOULD_PAY' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_PRICE')),
						'CURRENCY' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_CURRENCY')),
						'PRICE_DELIVERY' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_PRICE_DELIV')),
						'DISCOUNT_VALUE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_DESCOUNT')),
						'PAY_SYSTEM_ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_PAY_SYSTEM_ID')),
						'DELIVERY_ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_DELIVERY_ID')),
						'TAX_VALUE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_TAX')),
						'COMMENTS' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_COMMENTS')),
						'USER_DESCRIPTION' => array('NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_USER_DESCRIPTION')),
					),
					'GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId)
					{
						$value = null;

						if ($providerInstance instanceof Order)
						{
							if ($providerValue == 'DATE_INSERT_DATE')
							{
								$value = new Date($providerInstance->getField('DATE_INSERT'));
							}
							else if ($providerValue == 'DATE_BILL_DATE') // for crm compatibility
							{
								$value = new Date($providerInstance->getField('DATE_BILL'));
							}
							else
							{
								$value = $providerInstance->getField($providerValue);
							}
						}

						return $value;
					},
				);

				if (IsModuleInstalled('crm'))
				{
					$result['FIELDS']['ORDER_TOPIC'] = ['NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_ORDER_TOPIC')];
					$result['FIELDS']['PRICE'] = ['NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_PRICE')];
					$result['FIELDS']['DATE_BILL'] = ['NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_DATE_BILL')];
					$result['FIELDS']['DATE_BILL_DATE'] = ['NAME' => Loc::getMessage('BIZVAL_CODE_ORDER_DATE_BILL_DATE')];
				}

				return $result;
			}
		),
		'USER' => array(
			'NAME'   => Loc::getMessage('BIZVAL_PROVIDER_USER'),
			'SORT'   => 110,
			'FIELDS' => array(
				'ID'                  => array('NAME' => Loc::getMessage('BIZVAL_CODE_USER_ID'), 'GROUP' => 'CLIENT'),
				'LOGIN'               => array('NAME' => Loc::getMessage('BIZVAL_CODE_LOGIN'), 'GROUP' => 'CLIENT'),
				'NAME'                => array('NAME' => Loc::getMessage('BIZVAL_CODE_FIRST_NAME'), 'GROUP' => 'CLIENT'),
				'SECOND_NAME'         => array('NAME' => Loc::getMessage('BIZVAL_CODE_SECOND_NAME'), 'GROUP' => 'CLIENT'),
				'LAST_NAME'           => array('NAME' => Loc::getMessage('BIZVAL_CODE_LAST_NAME'), 'GROUP' => 'CLIENT'),
				'EMAIL'               => array('NAME' => Loc::getMessage('BIZVAL_CODE_EMAIL'), 'GROUP' => 'CLIENT'),
				'LID'                 => array('NAME' => Loc::getMessage('BIZVAL_CODE_SITE_ID'), 'GROUP' => 'CLIENT'),
				'PERSONAL_PROFESSION' => array('NAME' => Loc::getMessage('BIZVAL_CODE_JOB_PROFESSION'), 'GROUP' => 'CLIENT'),
				'PERSONAL_WWW'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_WEBSITE'), 'GROUP' => 'CLIENT'),
				'PERSONAL_ICQ'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_ICQ'), 'GROUP' => 'CLIENT'),
				'PERSONAL_GENDER'     => array('NAME' => Loc::getMessage('BIZVAL_CODE_GENDER'), 'GROUP' => 'CLIENT'),
				'PERSONAL_FAX'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_FAX'), 'GROUP' => 'CLIENT'),
				'PERSONAL_MOBILE'     => array('NAME' => Loc::getMessage('BIZVAL_CODE_PHONE'), 'GROUP' => 'CLIENT'),
				'PERSONAL_STREET'     => array('NAME' => Loc::getMessage('BIZVAL_CODE_ADDRESS'), 'GROUP' => 'CLIENT'),
				'PERSONAL_MAILBOX'    => array('NAME' => Loc::getMessage('BIZVAL_CODE_POSTAL_ADDRESS'), 'GROUP' => 'CLIENT'),
				'PERSONAL_CITY'       => array('NAME' => Loc::getMessage('BIZVAL_CODE_CITY'), 'GROUP' => 'CLIENT'),
				'PERSONAL_STATE'      => array('NAME' => Loc::getMessage('BIZVAL_CODE_REGION'), 'GROUP' => 'CLIENT'),
				'PERSONAL_ZIP'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_ZIP'), 'GROUP' => 'CLIENT'),
				'PERSONAL_COUNTRY'    => array('NAME' => Loc::getMessage('BIZVAL_CODE_COUNTRY'), 'GROUP' => 'CLIENT'),
				'PERSONAL_NOTES'      => array('NAME' => Loc::getMessage('BIZVAL_CODE_NOTES'), 'GROUP' => 'CLIENT'),
				'WORK_COMPANY'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_NAME'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_DEPARTMENT'     => array('NAME' => Loc::getMessage('BIZVAL_CODE_JOB_DEPARTMENT'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_POSITION'       => array('NAME' => Loc::getMessage('BIZVAL_CODE_JOB_POSITION'  ), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_WWW'            => array('NAME' => Loc::getMessage('BIZVAL_CODE_WEBSITE'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_PHONE'          => array('NAME' => Loc::getMessage('BIZVAL_CODE_PHONE'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_FAX'            => array('NAME' => Loc::getMessage('BIZVAL_CODE_FAX'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_STREET'         => array('NAME' => Loc::getMessage('BIZVAL_CODE_ADDRESS'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_MAILBOX'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_POSTAL_ADDRESS'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_CITY'           => array('NAME' => Loc::getMessage('BIZVAL_CODE_CITY'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_STATE'          => array('NAME' => Loc::getMessage('BIZVAL_CODE_REGION'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_ZIP'            => array('NAME' => Loc::getMessage('BIZVAL_CODE_ZIP'), 'GROUP' => 'CLIENT_COMPANY'),
				'WORK_COUNTRY'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_COUNTRY'), 'GROUP' => 'CLIENT_COMPANY'),
			),
			'FIELDS_GROUPS' => array(
				'CLIENT' => array('NAME' => Loc::getMessage('BIZVAL_GROUP_CODE_CLIENT'        )),
				'CLIENT_COMPANY' => array('NAME' => Loc::getMessage('BIZVAL_GROUP_CODE_CLIENT_COMPANY')),
			),
			'GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId)
			{
				$value = null;

				global $USER;

				if ($user = $USER->GetByID($providerInstance)->Fetch())
				{
					$value = $user[$providerValue];
				}
				return $value;
			},
		),
		'PAYMENT' => array(
			'NAME'   => Loc::getMessage('BIZVAL_PROVIDER_PAYMENT'),
			'SORT'   => 400,
			'FIELDS' => array(
				'ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_ID')),
				'ACCOUNT_NUMBER' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_ACCOUNT_NUMBER')),
				'PAID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAID')),
				'DATE_PAID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_DATE_PAID')),
				'PAY_SYSTEM_ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_SYSTEM_ID')),
				'PAY_VOUCHER_NUM' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_VOUCHER_NUM')),
				'PAY_VOUCHER_DATE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_VOUCHER_DATE')),
				'DATE_PAY_BEFORE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_DATE_PAY_BEFORE')),
				'DATE_BILL' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_DATE_BILL')),
				'DATE_BILL_DATE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_DATE_BILL_DATE')),
				'XML_ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_XML_ID')),
				'SUM' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_SUM')),
				'CURRENCY' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_CURRENCY')),
				'PAY_SYSTEM_NAME' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_SYSTEM_NAME')),
				'COMPANY_ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_COMPANY_ID')),
				'PAY_RETURN_NUM' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_RETURN_NUM')),
				'PAY_RETURN_DATE' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_RETURN_DATE')),
				'PAY_RETURN_COMMENT' => array('NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_RETURN_COMMENT')),
			),
			'GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId)
			{
				$value = null;

				if ($providerInstance instanceof Payment)
				{
					if ($providerValue == 'DATE_BILL_DATE')
						$value = new Date($providerInstance->getField('DATE_BILL'));
					else
						$value = $providerInstance->getField($providerValue);
				}
				return $value;
			},
		),
		'SHIPMENT' => array(
			'NAME'   => Loc::getMessage('BIZVAL_PROVIDER_SHIPMENT'),
			'SORT'   => 500,
			'FIELDS' => array(
				'STATUS_ID'             => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_STATUS_ID')),
				'PRICE_DELIVERY'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_PRICE_DELIVERY')),
				'ALLOW_DELIVERY'        => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_ALLOW_DELIVERY')),
				'DATE_ALLOW_DELIVERY'   => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DATE_ALLOW_DELIVERY')),
				'EMP_ALLOW_DELIVERY_ID' => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_EMP_ALLOW_DELIVERY_ID')),
				'DEDUCTED'              => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DEDUCTED')),
				'DATE_DEDUCTED'         => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DATE_DEDUCTED')),
				'EMP_DEDUCTED_ID'       => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_EMP_DEDUCTED_ID')),
				'REASON_UNDO_DEDUCTED'  => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_REASON_UNDO_DEDUCTED')),
				'DELIVERY_ID'           => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DELIVERY_ID')),
				'DELIVERY_DOC_NUM'      => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DELIVERY_DOC_NUM')),
				'DELIVERY_DOC_DATE'     => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DELIVERY_DOC_DATE')),
				'TRACKING_NUMBER'       => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_TRACKING_NUMBER')),
				'XML_ID'                => array('NAME' => Loc::getMessage('BIZVAL_CODE_XML_ID')),
				'PARAMETERS'            => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_PARAMETERS')),
				'DELIVERY_NAME'         => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DELIVERY_NAME')),
				'COMPANY_ID'            => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_COMPANY_ID')),
				'MARKED'                => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_MARKED')),
				'DATE_MARKED'           => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DATE_MARKED')),
				'EMP_MARKED_ID'         => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_EMP_MARKED_ID')),
				'REASON_MARKED'         => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_REASON_MARKED')),
				'CANCELED'              => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_CANCELED')),
				'DATE_CANCELED'         => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DATE_CANCELED')),
				'EMP_CANCELED_ID'       => array('NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_EMP_CANCELED_ID')),
			),
			'GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId)
			{
				$value = null;

				if ($providerInstance instanceof Shipment)
					$value = $providerInstance->getField($providerValue);

				return $value;
			},
		),
		'PROPERTY' => call_user_func(
			function ()
			{
				$getFields = function ($registryType)
				{
					static $fields = array();

					if (isset($fields[$registryType]))
					{
						return $fields[$registryType];
					}

					$fields[$registryType] = [];

					$result = InternalsOrderPropsTable::getList(array(
						'select' => array('ID', 'NAME', 'PERSON_TYPE_ID', 'TYPE', 'CODE'),
						'filter' => array(
							'=PERSON_TYPE_ID' => array_keys(BusinessValue::getPersonTypes()),
							'=ENTITY_REGISTRY_TYPE' => $registryType
						),
						'order'  => array('PERSON_TYPE_ID', 'SORT'),
					));

					while ($row = $result->fetch())
					{
						$id    = $row['ID'];
						$name  = $row['NAME'];
						$field = array(
							'NAME' => $name,
							'CODE' => $row['CODE'],
							'GROUP' => $row['PERSON_TYPE_ID'],
							'PERSON_TYPE_ID' => $row['PERSON_TYPE_ID']
						);

						$fields[$registryType][$id] = $field;

						if ($row['TYPE'] == 'LOCATION')
						{
							$field['NAME'] = $name.' ('.Loc::getMessage('BIZVAL_CODE_COUNTRY').')';
							$fields[$registryType][$id.'_COUNTRY'] = $field;

							$field['NAME'] = $name.' ('.Loc::getMessage('BIZVAL_CODE_REGION').')';
							$fields[$registryType][$id.'_REGION'] = $field;

							$field['NAME'] = $name.' ('.Loc::getMessage('BIZVAL_CODE_CITY').')';
							$fields[$registryType][$id.'_CITY'] = $field;
						}
					}

					return $fields[$registryType];
				};

				$parseId = function ($propertyId)
				{
					$propertyCode = null;
					$locationField = null;

					if (! is_numeric($propertyId)) // TODO is_int
					{
						if (($a = explode('_', $propertyId, 2))
							&& is_numeric($a[0])
							&& in_array($a[1], array('CITY', 'COUNTRY', 'REGION'), true))
						{
							$propertyId = $a[0];
							$locationField = $a[1];
						}
						else
						{
							$propertyCode = $propertyId;
							$propertyId = null;
						}
					}

					return array($propertyCode, $propertyId, $locationField);
				};

				return array(
					'NAME'   => Loc::getMessage('BIZVAL_PROVIDER_PROPERTY'),
					'SORT'   => 300,
					'FIELDS' => call_user_func($getFields, Registry::REGISTRY_TYPE_ORDER),
					'FIELDS_GROUPS' => array_map(
						function ($i)
						{
							return array('NAME' => $i['TITLE']);
						},
						BusinessValue::getPersonTypes()
					),
					'GET_VALUE' => function ($providerValue, $personTypeId, $options, $provider) use ($parseId, $getFields)
					{
						list ($propertyCode, $propertyId, $locationField) = call_user_func($parseId, $providerValue);

						// for crm invoice compatibility
						if ($provider && method_exists($provider, 'getRegistryType'))
						{
							$registry = $provider::getRegistryType();
						}
						else
						{
							$registry = Registry::REGISTRY_TYPE_ORDER;
						}

						$fields = $getFields($registry);

						if ($propertyCode)
						{
							if ($options == 'BY_ID')
							{
								foreach ($fields as $propertyId => $property)
								{
									if ($property['PERSON_TYPE_ID'] == $personTypeId && $property['CODE'] == $propertyCode)
									{
										$providerValue = $propertyId;
										break;
									}
								}
							}
						}
						else
						{
							if ($options != 'BY_ID' && ($property = $fields[$propertyId]))
							{
								$providerValue = $property['CODE'];
							}
						}

						return $providerValue;
					},
					'GET_INSTANCE_VALUE' => function ($providerInstance, $providerValue, $personTypeId) use ($parseId)
					{
						$value = null;

						if ($providerInstance instanceof Order)
						{
							list ($propertyCode, $propertyId, $locationField) = call_user_func($parseId, $providerValue);

							/** @var PropertyValue $property */
							foreach ($providerInstance->getPropertyCollection() as $property)
							{
								if ($property->getPersonTypeId() == $personTypeId)
								{
									if ($propertyCode)
									{
										if ($property->getField('CODE') == $propertyCode)
										{
											$value = $property->getValue();
											break;
										}
									}
									elseif ($property->getPropertyId() == $propertyId)
									{
										if (($value = $property->getValue())
											&& ($propertyField = $property->getProperty())
										)
										{
											if($propertyField['TYPE'] == "LOCATION")
											{
												$limit = -1;
												$filter['=CODE'] = $value;
												$filter['=PARENTS.NAME.LANGUAGE_ID'] = LANGUAGE_ID;
												if(is_set($locationField))
												{
													$filter['=PARENTS.TYPE.CODE'] = $locationField;
													$limit = 1;
												}
												$row = BitrixSaleLocationLocationTable::getList(array(
														'select' => array('LOCATION_NAME' => 'PARENTS.NAME.NAME'),
														'filter' => $filter,
														'limit' => $limit,
												));
												$locations  = array();
												while($location = $row->fetch())
													$locations[] = $location['LOCATION_NAME'];

												$value = (count($locations) > 0) ? implode('-', $locations) : null;
											}
											elseif($propertyField['TYPE'] == "ENUM")
											{
												$multipleValues = $property->getValue();

												if(is_array($multipleValues) && count($multipleValues)>0)
												{
													$value = [];
													foreach($multipleValues as $v)
													{
														if(isset($propertyField['OPTIONS'][$v]))
														$value[] = $propertyField['OPTIONS'][$v];
													}
												}
												else
													$value = $propertyField['OPTIONS'][$property->getValue()];
											}
										}
										break;
									}
								}
							}
						}

						return $value;
					},
				);
			}
		),
	);

	return $providers;
}