/// <summary>
        /// Преобразовать данные
        /// </summary>
        /// <param name="Value"> Значение ячейки таблицы. </param>
        /// <param name="ParentTable"> Родительская таблица (из которой выгружаются данные). </param>
        /// <returns></returns>
        public new string ConvertData(string Value, Table ParentTable)
        {
            string[] Index = Value.Split(';');
            // Простая ссылка на ячейку родительской таблицы в формате "1;2" (где 1 - номер строки родительской таблицы; 2 - номер столбца родительской таблицы)
            if (Index.Count() == 2 && ParentTable != null)
            {
                return(ParentTable.GetCellValue(Convert.ToInt32(Index[0]), Convert.ToInt32(Index[1])));
            }
            else
            {
                // Ссылка на ячейку родительской таблицы в формате "1;2;.;3" (где 1 - номер строки родительской таблицы; 2 - номер столбца родительской таблицы;
                //. - разделитель целой и дробной части; 3 - количество знаков после разделителя, до которых требуется округлить значение)
                if (Index.Count() == 4 && ParentTable != null)
                {
                    String CellValue   = ParentTable.GetCellValue(Convert.ToInt32(Index[0]), Convert.ToInt32(Index[1]));
                    String Delimiter   = (CellValue.IndexOf(Index[2]) < 0) ? "," : Index[2];
                    Int32  Accuracy    = Convert.ToInt32(Index[3]);
                    Int32  ValueLength = Accuracy > 0 ? Accuracy + 1 : Accuracy;
                    string MyCellValue = CellValue.Contains(" ") ? CellValue.Substring(0, CellValue.IndexOf(" ")).Replace(Delimiter, ".") : CellValue.Replace(Delimiter, ".");
                    return(Math.Round(Convert.ToDecimal(MyCellValue), Accuracy).ToString());
                    //return CellValue.Substring(0, CellValue.IndexOf(Delimiter) + ValueLength).Replace(Delimiter, ".");
                }

                // Ссылка на ячейку родительской таблицы в формате "1;2;+;3;4;.;5" (где 1 - номер строки первой ячейки родительской таблицы; 2 - номер столбца первой ячейки родительской таблицы;
                // + - операция над значениями двух ячеек; 3 - номер строки второй ячейки родительской таблицы; 4 - номер столбца второй ячейки родительской таблицы;
                //. - разделитель целой и дробной части; 5 - количество знаков после разделителя, до которых требуется округлить значение)
                if (Index.Count() == 7 && ParentTable != null)
                {
                    String StringOperand1 = ParentTable.GetCellValue(Convert.ToInt32(Index[0]), Convert.ToInt32(Index[1]));
                    String StringOperand2 = ParentTable.GetCellValue(Convert.ToInt32(Index[3]), Convert.ToInt32(Index[4]));
                    String Operator       = Index[2];
                    String Delimiter      = (StringOperand1.IndexOf(Index[5]) < 0) && (StringOperand1.IndexOf(Index[5]) < 0) ? "," : Index[5];
                    Int32  Accuracy       = Convert.ToInt32(Index[6]);
                    Int32  ValueLength    = Accuracy > 0 ? Accuracy + 1 : Accuracy;

                    String NumDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
                    Unit   UnitOperand1        = UnitsOfMeasure.GetResistanceValue(StringOperand1, Delimiter); //Convert.ToDouble(StringOperand1.Substring(0, StringOperand1.IndexOf(Delimiter) + ValueLength).Replace(Delimiter, NumDecimalSeparator));
                    Unit   UnitOperand2        = UnitsOfMeasure.GetResistanceValue(StringOperand2, Delimiter); // Convert.ToDouble(StringOperand2.Substring(0, StringOperand2.IndexOf(Delimiter) + ValueLength).Replace(Delimiter, NumDecimalSeparator));
                    Unit   Result;

                    // Оператор вычитания
                    if (Operator == "-")
                    {
                        Result = UnitsOfMeasure.GetSubtraction(UnitOperand1, UnitOperand2, UnitOperand1.UnitsName);
                        return(Math.Round(Result.Value, Accuracy).ToString().Replace(NumDecimalSeparator, ".") + " " + Result.UnitsName);
                    }

                    // Оператор вычисления отношения ((арг1 - арг2)/(арг2))*100
                    if (Operator == "%")
                    {
                        Result = UnitsOfMeasure.GetRatio(UnitOperand1, UnitOperand2, UnitOperand1.UnitsName);
                        if (Result != null)
                        {
                            return(Math.Round(Result.Value, Accuracy).ToString().Replace(NumDecimalSeparator, "."));
                        }
                        else
                        {
                            return("-");
                        }
                    }
                }
                else
                {
                    if (Value.IndexOf("Random") >= 0)
                    {
                        int    randomIndex = Convert.ToInt32(Value.Substring(Value.IndexOf("[") + 1, Value.IndexOf("]") - Value.IndexOf("[") - 1));
                        string value       = Value.IndexOf("]") + 1 < Value.Length ? Value.Substring(Value.IndexOf("]") + 1) : "";

                        if (Value.IndexOf("RandomActualValue") >= 0)
                        {
                            return(Convert.ToString(RandomActualValue[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomActualInterval") >= 0)
                        {
                            return(Convert.ToString(RandomActualInterval[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomMeasuredValue") >= 0)
                        {
                            return(Convert.ToString(RandomMeasuredValue[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomMotionStartValue") >= 0)
                        {
                            return(Convert.ToString(RandomMotionStartValue[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomError") >= 0)
                        {
                            return(Value.IndexOf("RandomError") > 0 ?
                                   Value.Substring(0, Value.IndexOf("RandomError")) + Convert.ToString(RandomError[randomIndex]) + value :
                                   Convert.ToString(RandomError[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomIndication") >= 0)
                        {
                            return(Convert.ToString(RandomIndication[randomIndex]) + value);
                        }
                    }
                    if (Value.IndexOf("Variables") >= 0)
                    {
                        int    randomIndex = Convert.ToInt32(Value.Substring(Value.IndexOf("[") + 1, Value.IndexOf("]") - Value.IndexOf("[") - 1));
                        string value       = Value.IndexOf("]") + 1 < Value.Length ? Value.Substring(Value.IndexOf("]") + 1) : "";
                        return(Value.IndexOf("Variables") > 0 ? Value.Substring(0, Value.IndexOf("Variables")) + Convert.ToString(Variables[randomIndex]) + value :
                               Convert.ToString(Variables[randomIndex]) + value);
                    }
                }
            }
            return(Value);
        }
        /// <summary>
        /// Преобразовать данные json
        /// </summary>
        /// <param name="Value"> Значение ячейки таблицы. </param>
        /// <param name="ParentDocument"> Объект с данными измерений. </param>
        /// <returns></returns>
        public string ConvertData(string Value, RootObject ParentDocument)
        {
            string[] Index = Value.Split(';');

            if (Index.Count() == 2 && ParentDocument != null)
            {
                return(ParentDocument.GetMeasure(Convert.ToInt32(Index[0])).Index(Convert.ToInt32(Index[1])));
            }
            else
            {
                if (Index.Count() == 4 && ParentDocument != null)
                {
                    String CellValue   = ParentDocument.GetMeasure(Convert.ToInt32(Index[0])).Index(Convert.ToInt32(Index[1]));
                    String Delimiter   = (CellValue.IndexOf(Index[2]) < 0) ? "," : Index[2];
                    Int32  Accuracy    = Convert.ToInt32(Index[3]);
                    Int32  ValueLength = Accuracy > 0 ? Accuracy + 1 : Accuracy;

                    return(CellValue.Substring(0, CellValue.IndexOf(Delimiter) + ValueLength).Replace(Delimiter, "."));
                }
                if (Index.Count() == 7 && ParentDocument != null)
                {
                    String StringOperand1 = ParentDocument.GetMeasure(Convert.ToInt32(Index[0])).Index(Convert.ToInt32(Index[1]));
                    String StringOperand2 = ParentDocument.GetMeasure(Convert.ToInt32(Index[3])).Index(Convert.ToInt32(Index[4]));
                    String Operator       = Index[2];
                    String Delimiter      = (StringOperand1.IndexOf(Index[5]) < 0) && (StringOperand1.IndexOf(Index[5]) < 0) ? "," : Index[5];
                    Int32  Accuracy       = Convert.ToInt32(Index[6]);
                    Int32  ValueLength    = Accuracy > 0 ? Accuracy + 1 : Accuracy;

                    String NumDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
                    Unit   UnitOperand1        = UnitsOfMeasure.GetResistanceValue(StringOperand1, Delimiter); //Convert.ToDouble(StringOperand1.Substring(0, StringOperand1.IndexOf(Delimiter) + ValueLength).Replace(Delimiter, NumDecimalSeparator));
                    Unit   UnitOperand2        = UnitsOfMeasure.GetResistanceValue(StringOperand2, Delimiter); // Convert.ToDouble(StringOperand2.Substring(0, StringOperand2.IndexOf(Delimiter) + ValueLength).Replace(Delimiter, NumDecimalSeparator));
                    Unit   Result;

                    // Оператор вычитания
                    if (Operator == "-")
                    {
                        Result = UnitsOfMeasure.GetSubtraction(UnitOperand1, UnitOperand2, UnitOperand1.UnitsName);
                        return(Math.Round(Result.Value, Accuracy).ToString().Replace(NumDecimalSeparator, ".") + " " + Result.UnitsName);
                    }

                    // Оператор вычисления отношения ((арг1 - арг2)/(арг2))*100
                    if (Operator == "%")
                    {
                        Result = UnitsOfMeasure.GetRatio(UnitOperand1, UnitOperand2, UnitOperand1.UnitsName);
                        if (Result != null)
                        {
                            return(Math.Round(Result.Value, Accuracy).ToString().Replace(NumDecimalSeparator, "."));
                        }
                        else
                        {
                            return("-");
                        }
                    }
                }
                else
                {
                    if (Value.IndexOf("Random") >= 0)
                    {
                        int    randomIndex = Convert.ToInt32(Value.Substring(Value.IndexOf("[") + 1, Value.IndexOf("]") - Value.IndexOf("[") - 1));
                        string value       = Value.IndexOf("]") + 1 < Value.Length ? Value.Substring(Value.IndexOf("]") + 1) : "";

                        if (Value.IndexOf("RandomActualValue") >= 0)
                        {
                            return(Convert.ToString(RandomActualValue[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomActualInterval") >= 0)
                        {
                            return(Convert.ToString(RandomActualInterval[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomMeasuredValue") >= 0)
                        {
                            return(Convert.ToString(RandomMeasuredValue[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomMotionStartValue") >= 0)
                        {
                            return(Convert.ToString(RandomMotionStartValue[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomError") >= 0)
                        {
                            return(Value.IndexOf("RandomError") > 0 ?
                                   Value.Substring(0, Value.IndexOf("RandomError")) + Convert.ToString(RandomError[randomIndex]) + value :
                                   Convert.ToString(RandomError[randomIndex]) + value);
                        }

                        if (Value.IndexOf("RandomIndication") >= 0)
                        {
                            return(Convert.ToString(RandomIndication[randomIndex]) + value);
                        }
                    }
                    if (Value.IndexOf("Variables") >= 0)
                    {
                        int    randomIndex = Convert.ToInt32(Value.Substring(Value.IndexOf("[") + 1, Value.IndexOf("]") - Value.IndexOf("[") - 1));
                        string value       = Value.IndexOf("]") + 1 < Value.Length ? Value.Substring(Value.IndexOf("]") + 1) : "";
                        return(Value.IndexOf("Variables") > 0 ? Value.Substring(0, Value.IndexOf("Variables")) + Convert.ToString(Variables[randomIndex]) + value :
                               Convert.ToString(Variables[randomIndex]) + value);
                    }
                }
            }

            return(Value);
        }