Большая часть российских предприятий для автоматизации бухгалтерского учета и экономических расчетов использует программу 1С. Эта программа предлагает вполне достаточный базовый функционал, но никогда не сможет удовлетворить ВСЕ наши пожелания. Поэтому, если в программе, написанной на C#, научиться напрямую читать данные из баз 1С, то весь недостающий функционал 1С вы сможете сами реализовать в своих программах. В предыдущих трех статьях мы создали 3 класса: MyConnect – позволяющий создать подключение к базе данных (метод OleDbConn(string DataPath)) и скопировать dbf–файл в объект DataTable (метод CopyDataTable(OleDbConnection OleDbConn, string myDoc). См. Microsoft OLE DB Provider for Visual FoxPro
Browse – выводящий на экран объект DataTable в виде таблицы (метод Browse(DataTable tbl)). См. DataGridView
Graph – строящий график из двух заданных полей объекта DataTable (метод Graph(DataTable tblgraph, string X, string Y)). См. Microsoft Chart Controls
Создаем библиотеку классов
Если вы работаете с Microsoft Visual Studio, выберите шаблон – "Пустой проект", укажите название проекта – "Tools" и добавьте в него "Файл с текстом программы". Кроме того, в свойствах проекта поменяйте тип выходных данных на "Библиотека классов". Не забудьте в обозреватель решений добавить ссылки на:
System
System.Data
System.Windows.Forms
System.XML
System.Drawing
System.Windows.Forms.DataVisualization
Все классы и методы я оставил без изменений, кроме метода CopyDataTable(OleDbConnection OleDbConn, string myDoc). В новой версии он стал более универсальным, так как теперь ему передается не название dbf–файла, а сторока SQL – запроса. Измененные строки выделены более ярким цветом:
using System;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
using System.Xml;
using System.Data.OleDb;
using System.Windows.Forms.DataVisualization.Charting;
namespace tools
{
public class MyConnect
{
const string DataProvider = @"vfpoledb.1"; // Провайдер
// Создать OleDbConnection
public OleDbConnection OleDbConn(string DataPath)
{
// Для того, чтобы создать OLE – соединение с локальной базой данных,
// необходимо указать 2 параметра – провайдера и путь к базе данных.
// Для наглядности я воспользовался построителем строк подключения –
// OleDbConnectionStringBuilder.
OleDbConnectionStringBuilder bldr = new OleDbConnectionStringBuilder();
bldr.DataSource = DataPath; // Указываем путь
bldr.Provider = DataProvider; // Указываем провайдера
// Создаем подключение к источнику данных
OleDbConnection myConn = new OleDbConnection(bldr.ConnectionString);
return myConn;
}
// Прочитать dbf-файл в DataTable
public DataTable CopyDataTable(OleDbConnection OleDbConn, string mySQL)
{
// Класс, необходимый для задания оператора SQL и источника данных
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = @mySQL; // Задаем оператор SQL
cmd.Connection = OleDbConn; // Задаем источник данных
// Объект OleDbDataAdapter выполняет функцию моста между DataTable и источником данных.
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = cmd;
DataTable tbl = new DataTable();
// Обеспечивает он такой мост с помощью метода Fill.
da.Fill(tbl);
return tbl;
}
}
public class Browse : Form
{
internal protected DataGridView dataGridView;
public Browse(DataTable tbl)
{
// Browse форма – свойства
Text = "Viewer2";
// Задаем размер клиентской области формы
ClientSize = new Size(700, 400);
// Располагаем форму в центре экрана
StartPosition = FormStartPosition.CenterScreen;
// Browse форма – методы
Resize += new EventHandler(BrowseResize);
// dataGridView – свойства
dataGridView = new DataGridView();
dataGridView.Parent = this;
// Задаем размер таблицы относительно клиентской области формы
dataGridView.Height = ClientSize.Height – 20;
dataGridView.Width = ClientSize.Width – 20;
// Задаем положение таблицы относительно левого верхнего угла формы
dataGridView.Left = 10;
dataGridView.Top = 10;
// указываем источник данных
dataGridView.DataSource = tbl;
// Подбираем в цикле ширину всех колонок
foreach (DataColumn col in tbl.Columns)
dataGridView.Columns[col.Caption].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
// Реакция формы на изменение размера
void BrowseResize(object sender, EventArgs e)
{
// Подгоняем размер таблицы под клиентскую область формы
dataGridView.Height = ClientSize.Height – 20;
dataGridView.Width = ClientSize.Width – 20;
}
}
public class Graph : Form
{
public Graph(DataTable tblgraph, string X, string Y)
{
// Главная форма – свойства
Text = "Graph1";
ClientSize = new Size(700, 400);
// MicrosoftChart – свойства
Chart myChart = new Chart();
myChart.Parent = this;
myChart.Left = 10;
myChart.Top = 10;
myChart.Width = (ClientSize.Width – 20);
myChart.Height = (ClientSize.Height – 20);
myChart.DataSource = tblgraph;
// Фон
myChart.BackColor = Color.MistyRose;
myChart.BackGradientStyle = GradientStyle.DiagonalLeft;
// Оформление границ
myChart.BorderSkin.SkinStyle = BorderSkinStyle.Sunken;
myChart.BorderSkin.PageColor = this.BackColor;
// Область в которой будет построен график
ChartArea myChartArea = new ChartArea();
myChartArea.Name = "myChartArea";
myChart.ChartAreas.Add(myChartArea);
// Линии сетки
myChartArea.AxisX.MajorGrid.LineColor = SystemColors.ControlLight;
myChartArea.AxisY.MajorGrid.LineColor = SystemColors.ControlLight;
// График
Series mySeries1 = new Series();
mySeries1.ChartType = SeriesChartType.Spline;
mySeries1.ChartArea = "myChartArea";
mySeries1.XValueMember = X;
mySeries1.YValueMembers = Y;
myChart.Series.Add(mySeries1);
}
}
}
Постройте решение ("Build Solution") и проверьте в папке …\bin\Debug\ наличие файла Tools.dll. Библиотека готова, и мы можем приступить к работе с базой 1С7.7. Она существует в 2-х вариантах: локальная и SQL версии. Весь изложенный материал применим к обеим из них, разница лишь в методе подключения к базе данных. Например, для подключения к SQL базе можно вместо метода – OleDbConn(string DataPath) использовать следующий метод:
public SqlConnection SqlConn(string DataPath)
{
SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder ();
bldr.DataSource = @".\SQLEXPRESS";
bldr.InitialCatalog = DataPath;
bldr.IntegratedSecurity = true;
bldr.ConnectTimeout = 30;
bldr.UserInstance = true;
SqlConnection myConn = new SqlConnection(bldr.ConnectionString);
return myConn;
}
В локальной версии база данных 1С7.7 состоит из совокупности файлов формата Dbase. Информация о назначении и структуре каждого файла указана в файле – 1Cv7.dd. Обычно он находится там же, где и база данных. Как это выглядит, разберем на примере документа – "Расходная накладная". Необходимую нам информацию я выделил более ярким цветом, мои пояснения – зеленым цветом:
Видно, что хранение информации организовано по канонам СУБД: Если у документа есть табличная часть, то она хранится в отдельном файле (dh294.dbf – заголовочная часть документа, dt294.dbf – табличная часть документа).
Вместо названий товаров и контрагентов в файле хранятся только коды, а сами названия – отдельно в справочниках.
Поэтому нам еще потребуется информация из трех справочников: Журналы (1sjourn.dbf) – только здесь хранятся номера и даты всех документов 1С,
Справочник контрагентов (sc133.dbf) – отсюда возьмем названия клиентов,
Справочник номенклатуры (sc156.dbf) – здесь названия всей номенклатуры товаров и услуг.
Всю необходимую информацию для написания SQL запроса к базе данных 1С7.7 мы собрали. Формируем документ "Расходная накладная":
SELECT _1sjourn.docno, _1sjourn.date, sc133.descr AS Client, "sc156.descr AS Good,
dt294.sp284 AS Number, dt294.sp285 AS Price, dt294.sp286 AS Summa,
dt294.sp287 AS NDS, dt294.sp290 AS Total
FROM dh294
INNER JOIN 1sjourn _1sjourn ON dh294.iddoc = _1sjourn.iddoc
INNER JOIN sc133 ON dh294.sp277 = sc133.id
INNER JOIN dt294 ON dh294.iddoc = dt294.iddoc
INNER JOIN sc156 ON dt294.sp283 = sc156.id
Теперь перейдем к созданию исполняемой программы. Если вы работаете с Microsoft Visual Studio, выберите шаблон – "Пустой проект", укажите название проекта – "1С77" и добавьте в него "Файл с текстом программы". Кроме того, в свойствах проекта поменяйте тип выходных данных на "Приложение Windows".
Используем Browse для просмотра документов – "Расходная накладная"
В обозревателе решений указываем ссылки на:
System
System.Data
System.Windows.Forms
System.XML
И, кроме того, надо добавить ссылку на нашу библиотеку – Tools. Разница лишь в том, что в окне "Добавить ссылку" надо вместо вкладки ".NET" выбрать вкладку "Обзор" и найти Tools.dll. Ниже приведен листинг программы:
using System;
using System.Data;
using System.Data.OleDb;
using tools;
namespace _1C77
{
public class SQL1C
{
// Документу из 1С приводим в соответствие SQL запрос
public string SQL1C77(string NameDoc)
{
string StringSQL = "SELECT * FROM " + NameDoc;
switch (NameDoc)
{
case "РасходнаяНакладная":
StringSQL = "SELECT _1sjourn.docno, _1sjourn.date, sc133.descr AS Client, " +
"sc156.descr AS Good, dt294.sp284 AS Number, dt294.sp285 AS Price, " +
"dt294.sp286 AS Summa, dt294.sp287 AS NDS, dt294.sp290 AS Total FROM dh294 " +
"INNER JOIN 1sjourn _1sjourn ON dh294.iddoc = _1sjourn.iddoc " +
"INNER JOIN sc133 ON dh294.sp277 = sc133.id " +
"INNER JOIN dt294 ON dh294.iddoc = dt294.iddoc " +
"INNER JOIN sc156 ON dt294.sp283 = sc156.id";
break;
}
return StringSQL;
}
}
class _1C77
{
public static void Main()
{
MyConnect mycon = new MyConnect();
// Создаем соединение с базой данных
OleDbConnection OleDbCon = mycon.OleDbConn(@"C:\Program Files\1Cv77\1SBDemo\");
// Открываем его
OleDbCon.Open();
SQL1C mySQL1C = new SQL1C();
// Выбираем SQL запрос для Расходной накладной
string SQL1C1 = mySQL1C.SQL1C77("РасходнаяНакладная");
// Указывая соединение с базой данных и строку SQL, получем объект DataTable
DataTable Doc1C1 = mycon.CopyDataTable(OleDbCon, SQL1C1);
// Создаем объект browse
Browse browse = new Browse(Doc1C1);
// и выводим его на экран
browse.ShowDialog();
// Закрываем соединение
OleDbCon.Close();
}
}
}
Принцип, думаю понятен и теперь вы сами сможете организовать запрос к любому документу в базе 1С7.7. В заключение лишь хочу привести еще один пример, во-первых, использования созданной нами библиотеки (класс Graph), а, во-вторых, открытия другого документа 1С – "Платежного поручения":
Строим график, используя данные документов – "Платежное поручение"
using System;
using System.Data;
using System.Data.OleDb;
using tools;
namespace _1C77
{
public class SQL1C
{
// Документу из 1С приводим в соответствие SQL запрос
public string SQL1C77(string NameDoc)
{
string StringSQL = "SELECT * FROM " + NameDoc;
switch (NameDoc)
{
case "РасходнаяНакладная":
StringSQL = "SELECT _1sjourn.docno, _1sjourn.date, sc133.descr AS Client, " +
"sc156.descr AS Good, dt294.sp284 AS Number, dt294.sp285 AS Price, " +
"dt294.sp286 AS Summa, dt294.sp287 AS NDS, dt294.sp290 AS Total FROM dh294 " +
"INNER JOIN 1sjourn _1sjourn ON dh294.iddoc = _1sjourn.iddoc " +
"INNER JOIN sc133 ON dh294.sp277 = sc133.id " +
"INNER JOIN dt294 ON dh294.iddoc = dt294.iddoc " +
"INNER JOIN sc156 ON dt294.sp283 = sc156.id";
break;
case "ПлатежноеПоручение":
StringSQL = "SELECT _1sjourn.docno, _1sjourn.date, sc133.descr AS Client, " +
"dh12070.sp12059 AS Summa, dh12070.sp12061 AS NDS FROM dh12070 " +
"INNER JOIN 1sjourn _1sjourn ON dh12070.iddoc = _1sjourn.iddoc " +
"INNER JOIN sc133 ON dh12070.sp12058 = sc133.id";
break;
}
return StringSQL;
}
}
class _1C77
{
public static void Main()
{
MyConnect mycon = new MyConnect();
// Создаем соединение с базой данных
OleDbConnection OleDbCon = mycon.OleDbConn(@"C:\Program Files\1Cv77\1SBDemo\");
// Открываем его
OleDbCon.Open();
SQL1C mySQL1C = new SQL1C();
// Выбираем SQL запрос для Платежного поручения
string SQL1C2 = mySQL1C.SQL1C77("ПлатежноеПоручение");
// Указывая соединение с базой данных и строку SQL, получем объект DataTable
DataTable Doc1C2 = mycon.CopyDataTable(OleDbCon, SQL1C2);
// Создаем объект graph
Graph graph = new Graph(Doc1C2, "date", "summa");
// и выводим его на экран
graph.ShowDialog();
// Закрываем соединение
OleDbCon.Close();
}
}
}
В этой статье вы научились получать данные из базы данных 1С7.7, посмотрели их в DataGridView и построили на основе этих данных график. Для полного комплекта не хватает только еще научиться: сохранять данные на диск,
выводить их в отчет и на печать
В следующей статье разберем универсальный метод сохранения объекта DataTable в dbf-файл.
www.virtualexpert.ru
Recent Comments