// Acttion, ������������ ������� �� ���������� �������
        private void ShowChartAction_Execute(object sender, EventArgs e)
        {
            Plant CurrentPlant;
              ReportPart CurrentPart;
              DataRow ChartRow;
              BookColumn ChartColumn;
              GetCurrentCellInfo(out CurrentPlant, out CurrentPart, out ChartRow, out ChartColumn);
              if (ChartColumn == null)
              {
            MessageBox.Show("���������� ������� ������� � ������� ��� ��������� ��������", "�������� ��������", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
              }
              if (ChartRow == null || CurrentPart == null)
              {
            MessageBox.Show("���������� ������� ������ � ��������� ��� ��������� ��������", "�������� ��������", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
              }
              string ModuleNorm = FM[CurrentPart.NormRow, ChartColumn.column1];
              string ModuleName = "";

              string CurrentFieldIndex = CurrentPart.FieldName(ChartColumn.column1).Split('*')[1];
              object CurrentLowerNorm = ChartRow["LowerLimit*" + CurrentFieldIndex];
              object CurrentUpperNorm = ChartRow["UpperLimit*" + CurrentFieldIndex];

              List<Plant> PlantsList = new List<Plant>();
              foreach (ReportPart part in Parts)
            if (part.Data != null && part.Data.Rows.Count > 0)
            {
              Plant p = plants.FindPlant(Convert.ToInt32(part.Data[0, "plantid"]));
              if (!PlantsList.Contains(p))
            PlantsList.Add(p);
            }

              QueryResult[] ChartDatas = new QueryResult[PlantsList.Count];
              DataRow ModuleRow;

              int i = 0;
              foreach (ReportPart part in Parts)
              {
            if (part.Data != null && part.Data.Rows.Count > 0)
            {
              string FieldName = part.FieldName(ChartColumn.column1);
              if (FieldName != "")
              {
            string[] values = FieldName.Split('*');
            int ColumnIndex = Functions.ConvertToInt32(values[1]);
            ModuleRow = part.Columns.Rows[ColumnIndex];

            ModuleName = ModuleRow["TextModule"].ToString();
            if (ModuleRow["TestGroup"].ToString().Trim() != "")
              ModuleName = ModuleRow["TestGroup"].ToString() + ", " + ModuleName;

            string DateField = "qaodecisiontime";
            string CertField = "batchno";
            string DataField = "Result*" + ColumnIndex.ToString();
            string MinField = "LowerLimit*" + ColumnIndex.ToString();
            string MaxField = "UpperLimit*" + ColumnIndex.ToString();

            // ���� ����� ���������, ��
            /*if (ModuleNorm.ToLower() != ModuleRow["ModuleNorm"].ToString().ToLower())
              continue;*/
            if (CurrentLowerNorm.ToString().ToLower() != part.Data[0, MinField].ToString().ToLower()
             || CurrentUpperNorm.ToString().ToLower() != part.Data[0, MaxField].ToString().ToLower())
              continue;

            // ��������� ����� �������� �������
            QueryResult dt = new QueryResult(part.Data.DefaultView.ToTable(false, DateField, CertField, DataField, MinField, MaxField));
            // �������������� ��������
            dt.Columns[DateField].ColumnName = "Date";
            dt.Columns[CertField].ColumnName = "Passport";
            dt.Columns[DataField].ColumnName = "Value";
            dt.Columns[MinField].ColumnName = "Min";
            dt.Columns[MaxField].ColumnName = "Max";
            // ���������� ����� ��������
            dt.AddColumn("PlantName", typeof(string), plants.FindPlant(Convert.ToInt32(part.Data[0, "plantid"])).ShortPlantName);
            dt.AddColumn("Module", typeof(string), ModuleName);
            dt.AddColumn("Norm", typeof(string), ModuleRow["ModuleNorm"]);
            if (Functions.IsNumber(FM[part.RowAvg, ChartColumn.column1]))
              dt.AddColumn("Average", typeof(double), FM[part.RowAvg, ChartColumn.column1]);

            i = PlantsList.IndexOf(plants.FindPlant(Convert.ToInt32(part.Data[0, "plantid"])));
            if (ChartDatas[i] == null)
              ChartDatas[i] = new QueryResult(dt);
            else
            {
              // ���� � ������ ������ ���� �������� � ����������� �������, �� �� ����� ����������
              ChartDatas[i].Merge(dt);
              // �������� ����������������� �������� ����� ����������� ������
              if (ChartDatas[i].Columns.Contains("Average"))
              {
                object newavg = ChartDatas[i].Compute("avg(Average)", "");
                foreach (DataRow row in ChartDatas[i].Rows)
                  row["Average"] = newavg;
              }
            }
              }

            }
            if (ChartDatas[i] != null) // ��������� ������ ����� ������������ (����� ����������, ���� ���� ����������� ������ ���������)
            {
              DataView dv = ChartDatas[i].DefaultView;
              dv.Sort = "Date, Passport";
              ChartDatas[i] = new QueryResult(dv.ToTable());
            }
              }

              //Array.Resize<QueryResult>(ref ChartDatas, 5);

              ChartForm form = new ChartForm();
              form.Text = string.Format("{0}. {1}, {2}", (ProductCombo.SelectedItem as DataRowView)["Description"], ModuleName, ModuleNorm);
              form.TitleLabel.Text = form.Text;
              form.Initialize(ChartDatas);

              form.WindowState = FormWindowState.Maximized;
              form.Show();
        }
        public void Show(OracleConnection connection, PassportInfo info)
        {
            if (Functions.IsNull(info))
            return;
              Splash.ProgressInit(2);
              try
              {
            string HostName = Dns.GetHostName();
            string IPAddress = Functions.GetCurrentIPAddress();
            string TemporaryFileName;

            // запрос для получения вида паспорта (pdf файл)
            Splash.Message("Получение вида паспорта...");
            MemoryStream PassportStream = GetPassport(connection, info.PlantID, info.OrderID, info.LanguageID);
            Splash.ProgressAdd();

            if (!Functions.IsNull(PassportStream)) // нашли вид паспорта
            {
              Splash.ProgressMaximum(4);
              Splash.Message("Маркировка паспорта...");
              PassportStream = MarkPassport(PassportStream); // маркируем документ - добавляем слова "Копия" и разную информацию
              if (Functions.IsNull(PassportStream))
              {
            MessageBox.Show("Ошибка при маркировке паспорта. Паспорт без маркировке 'COPY' выдать нельзя", "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
              }
              TemporaryFileName = GetTempFilePath(".pdf");
              FileStream FS = new FileStream(TemporaryFileName, FileMode.Create, FileAccess.Write);
              PassportStream.WriteTo(FS);
              FS.Close();
              Splash.ProgressAdd();
            }
            else
            {
              Splash.ProgressMaximum(6);
              // запрос для получения данных паспорта
              Splash.Message("Получение данных паспорта...");
              OracleCommand DataCommand = OracleProc.Execute(connection, "DataAccessPKG.GetPassportData",
            new object[] { info.PlantID, info.OrderID, info.LanguageID, null });
              QueryResult Data = new QueryResult(DataCommand.Parameters["rc"].Value);
              Splash.ProgressAdd();

              Splash.Message("Загрузка шаблона паспорта...");
              MemoryStream TemplateStream = GetPassportTemplate(connection, info.PlantID, info.ProductID, info.LanguageID);
              Splash.ProgressAdd();

              Splash.Message("Формирование документа...");
              //PassportTemplate CurrentTemplate = plant.PassportTemplates.FindLanguage(LanguageID);
              if (TemplateStream == null)
              {
            MessageBox.Show(string.Format("Отсутствует шаблон паспорта продукта {0} (ID предприятия: {1}) для языка {2}. Обратитесь в тех.поддержку за помощью", info.ProductID, info.PlantID, info.LanguageID), "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
              }
              if (Data.Rows.Count == 0)
              {
            MessageBox.Show("Отсутствуют данные по выбранному паспорту. Попробуйте обновить данные за текущий период", "Просмотр паспорта", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
              }

              MSWordReport word = new MSWordReport(TemplateStream);
              QueryResult PassportData = FormatPassportData(Data);
              word.Execute(PassportData);

              // добавляем информацию о пользователе
              Data.AddColumn("UserInfo", typeof(string), string.Format("Пользователь: {0} ({1}). Компьютер: {2} ({3})", Program.StartForm.current.User.name, Common.PZUsers.Current.WindowsDomainName(), HostName, IPAddress));
              Data.AddColumn("CreationDate", typeof(DateTime), DateTime.Now);
              word.Document.MailMerge.Execute(Data.Rows[0]);
              word.PrepareToSave();
              word.Document.Protect(Aspose.Words.ProtectionType.ReadOnly);

              // вставляем знак "Копия"
              Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(word.Document);
              builder.MoveToHeaderFooter(Aspose.Words.HeaderFooterType.HeaderPrimary);
              System.Drawing.Image image = System.Drawing.Image.FromFile(System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "Images\\Exclamation.gif"));
              double useablePageWidth = builder.PageSetup.PageWidth - builder.PageSetup.LeftMargin - builder.PageSetup.RightMargin;
              double useablePageHeight = builder.PageSetup.PageHeight - builder.PageSetup.TopMargin - builder.PageSetup.BottomMargin;
              const int PointsPerInch = 72;
              double imageWidth = (image.Width / image.HorizontalResolution) * PointsPerInch;
              double imageHeight = (image.Height / image.VerticalResolution) * PointsPerInch;
              double imageLeft = (useablePageWidth - imageWidth) / 2;
              double imageTop = (useablePageHeight - imageHeight) / 2;
              builder.InsertImage(image, Aspose.Words.RelativeHorizontalPosition.Margin, imageLeft, Aspose.Words.RelativeVerticalPosition.Margin, imageTop, imageWidth, imageHeight, Aspose.Words.WrapType.None, Aspose.Words.WrapSide.Both, true, null);

              TemporaryFileName = GetTempFilePath(".doc");
              word.Document.Save(TemporaryFileName);
              Splash.ProgressAdd();
            }

            // логирование паспорта
            Splash.Message("Запись в журнал операций...");
            OracleProc.Execute(connection, "LogPKG.LogPassport",
              new object[] { info.PlantID, info.CertificateID, info.OrderID, Program.StartForm.current.Program.id, Program.StartForm.current.User.id, HostName, IPAddress, Common.PZUsers.Current.WindowsDomainName() });
            connection.Commit();
            Splash.ProgressAdd();

            Splash.Message(TemporaryFileName.EndsWith(".doc") ? "Запуск Microsoft Word..." : "Запуск Adobe Acrobat Reader...");
            //PrintDocumentFromWord(TemporaryFileName);
            OpenDocument(TemporaryFileName);
            Splash.ProgressAdd();

              }
              finally
              {
            Splash.Close();
              }
              /*System.Diagnostics.Process.Start(TemporaryFileName);
              Splash.ProgressAdd(); */
        }