private MdxAxis GetWrappedAxis(MdxAxis ax, IList<DrillActionContainer> actions)
        {
            MdxExpression axisExpression = ax.Expression;

            // 1. Если первым на оси стоит ключевое слово NON EMPTY то выражение формируем из его аргументов, а уже потом все это выражение обрамляем ключевым словом NON EMPTY 
            // 2. Если запрос на оси обрамлен функцией HIERARCHIZE, то выражение формируем из ее аргумента, а уже потом все это выражение обрамляем функцией HIERARCHIZE
            /* 
             * Флаг NonEmpty перенесен в MdxAxis. Проверок не требуется.
             * 
            MdxNonEmptyExpression nonEmpty = ax.Expression as MdxNonEmptyExpression;
            if (actions != null && actions.Count > 0)
            {
                if (nonEmpty != null)
                {
                    MdxExpression expression = nonEmpty.Expression;
                    MdxFunctionExpression hierarchize = expression as MdxFunctionExpression;
                    if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
                    {
                        expression = hierarchize.Arguments[0];
                    }

                    axisExpression = new MdxNonEmptyExpression(
                        new MdxFunctionExpression("HIERARCHIZE",
                            new MdxExpression[]
                        {
                            GetWrappedExpression(expression, actions)
                        }));
                }
                else
                {
                    MdxExpression expression = ax.Expression;
                    MdxFunctionExpression hierarchize = expression as MdxFunctionExpression;
                    if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
                    {
                        expression = hierarchize.Arguments[0];
                    }

                    axisExpression = new MdxFunctionExpression(
                                 "HIERARCHIZE",
                                 new MdxExpression[]
                        {
                            GetWrappedExpression(expression, actions)
                        });
                }
            }
            */

            if (actions.Count > 0)
            {
                var expression = ax.Expression;
                var hierarchize = expression as MdxFunctionExpression;
                if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
                {
                    expression = hierarchize.Arguments[0];
                }

                axisExpression = new MdxFunctionExpression(
                             "HIERARCHIZE",
                             new MdxExpression[]
                        {
                            GetWrappedExpression(expression, actions)
                        });
            }


            // Возможность убрать пустые колонки
            /*
            if (nonEmpty == null && actions == History.CurrentHistoryItem.ColumnsActionChain && HideEmptyColumns)
            {
                axisExpression = new MdxNonEmptyExpression(axisExpression);
            }
            */
            // Возможность убрать пустые строки
            /*
            if (nonEmpty == null && actions == History.CurrentHistoryItem.RowsActionChain && HideEmptyRows)
            {
                axisExpression = new MdxNonEmptyExpression(axisExpression);
            }
            */
            if (History.CurrentHistoryItem.ColumnsActionChain.Equals(actions) && HideEmptyColumns)
            {
                ax.NonEmpty = true;
            }
            if (History.CurrentHistoryItem.RowsActionChain.Equals(actions) && HideEmptyRows)
            {
                ax.NonEmpty = true;
            }

            return new MdxAxis(
                    ax.Name,
                    axisExpression,
                    ax.Having,
                    ax.DimensionProperties
                    )
            {
                NonEmpty = ax.NonEmpty
            };
        }
		internal MdxAxis GetWrappedAxis(MdxAxis ax /*, Func<MdxObject, MdxActionContext, MdxObject> ConcretizeMdxObject */)
		{
			MdxExpression axisExpression = ax.Expression;

			// 1. Если первым на оси стоит ключевое слово NON EMPTY то выражение формируем из его аргументов, а уже потом все это выражение обрамляем ключевым словом NON EMPTY 
			// 2. Если запрос на оси обрамлен функцией HIERARCHIZE, то выражение формируем из ее аргумента, а уже потом все это выражение обрамляем функцией HIERARCHIZE
			/* 
			 * Флаг NonEmpty перенесен в MdxAxis. Проверок не требуется.
			 * 
			MdxNonEmptyExpression nonEmpty = ax.Expression as MdxNonEmptyExpression;
			if (actions != null && actions.Count > 0)
			{
					if (nonEmpty != null)
					{
							MdxExpression expression = nonEmpty.Expression;
							MdxFunctionExpression hierarchize = expression as MdxFunctionExpression;
							if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
							{
									expression = hierarchize.Arguments[0];
							}

							axisExpression = new MdxNonEmptyExpression(
									new MdxFunctionExpression("HIERARCHIZE",
											new MdxExpression[]
									{
											GetWrappedExpression(expression, actions)
									}));
					}
					else
					{
							MdxExpression expression = ax.Expression;
							MdxFunctionExpression hierarchize = expression as MdxFunctionExpression;
							if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
							{
									expression = hierarchize.Arguments[0];
							}

							axisExpression = new MdxFunctionExpression(
													 "HIERARCHIZE",
													 new MdxExpression[]
									{
											GetWrappedExpression(expression, actions)
									});
					}
			}
			*/

			if (Actions.Count > 0)
			{
				var expression = ax.Expression;
				axisExpression = this.GetWrappedExpression(expression/*, ConcretizeMdxObject*/);
			}
			axisExpression = SortExpression(axisExpression, MeasuresSort);

			return new MdxAxis(
							ax.Name,
							axisExpression,
							ax.Having,
							ax.DimensionProperties
							)
			{
				// Возможность убрать пустые колонки
				NonEmpty = HideEmpty
			};
		}