// ���������� ������ � ����������� ���������� �� ��������
 private void MergeColumns(BookColumns columns, int row1, int row2)
 {
     // ����������� ������ � ��������
       foreach (BookColumn column in columns)
     if (column.ismerge && column.column1 == column.column2)
       FM.MergeEqualValues(row1, column.column1, row2, column.column1);
 }
 // ����������� �������� ���� � �������� - ����� flex �� ����� ������������ ������ ��� ������ ������.
 // ������ ������� ������ ��� ������� �������. ����� ��� ������ � ������� ��������� ������������, �����
 // ������ ������� ��������� �� ����������� ��������� ���������� ������ ����� �������
 private void SetColumnFormat(ReportPart part, BookColumns columns)
 {
     int[] Decimals = new int[columns.Count];
       for (int i = 0; i < Decimals.Length; i++) // prepare...
     Decimals[i] = -1;
       for (int i = 0; i < part.Columns.Rows.Count; i++)
       {
     int cindex = columns.IndexOf(part.Columns[i, "TestGroup"].ToString(), part.Columns[i, "TextModule"].ToString());
     //int cindex = part.Columns.Search(new object[] { part.Columns[i, "TestGroup"], part.Columns[i, "TextModule"], part.Columns[i, "modulenorm"], part.Columns[i, "precisionid"] });
     if (cindex < 0 || cindex > columns.Count-1)
       continue;
     BookColumn column = columns[cindex];
     if (column.column1 == column.column2 && FM.Book.Column(column.column1).Mask == MaskEnum.Numeric)
       Decimals[cindex] = Math.Max(Decimals[cindex], Precision2Decimal(part.Columns[i, "PrecisionID"]));
       }
       /* �������� �����, ����� ��� ������� ���� ��� ������ ������ ��������� ������ � ������ ��������� */
       for (int i = 0; i < Decimals.Length; i++)
       {
     columns[i].Decimal = Decimals[i];
                         // ��������� ��� �������� �����, ���������� ����
     if (Decimals[i] >= 0 && Decimals[i] > FM.Book.Column(columns[i].column1).DecimalLength)
       FM.Book.Column(columns[i].column1).DecimalLength = Decimals[i];
       }
       // ��� �� ������ � �������� �������� � ������������ � ��������� ��� ����������� ���������� � Excel
       foreach (BookColumn c in columns)
     if (c.Decimal >= 0 && c.column1 == c.column2 && !c.isgroup)
       for (int r = part.SummaryRow1; r <= part.SummaryRow2; r++)
     FM[r, c.column1] = MainForm.FormatValue(FM[r, c.column1], c.Decimal);
 }
 // �������� ������ �������, ���� ��� ����� ���� �������� ��� ����� ���������
 private void HideUnusedColumns(BookColumns columns)
 {
     bool IsUsed;
       foreach (BookColumn column in columns)
     if (column.tryhide && column.column1 == column.column2)
     {
       IsUsed = false;
       foreach (ReportPart part in Parts)
       {
     for (int row = part.Row1; row <= part.Row2; row++)
       IsUsed = IsUsed || FM[row, column.column1].Trim() != "";
       }
       if (!IsUsed)
     FM.Book.Column(column.column1).Width = 0;
     }
 }