2092 / 1256 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
1

Управление 1С: 8,2 из приложения, написанного на C#

01.09.2010, 15:49. Показов 33488. Ответов 36

Здравствуйте, форумчане!

Собственно, вопрос в названии темы. Возникла необходимость написания приложения, которое будет выполнять следующие действия:
  • Подключаться к платформе 1С: 8,2;
  • Забирать оттуда, например, остатки товаров на складе (пример);
  • Выгружать полученные данные в Word;

Это было задание. Сам вопрос - как мне подключится и управлять 1С? Порылся по форуму - ничего найти не получилось. Интернет мне тоже дает только, как написать компонент для 1С на c#. Вот и обращаюсь - может у кого есть какие наработки по данному вопросу, или подскажет ресурсы, где про это можно почитать.
Ну или, ставя вопрос немного по другому, каким образом происходит взаимодействие с 1С вообще?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2010, 15:49
Ответы с готовыми решениями:

Запуск приложения написанного в VS 2013 на машине с FW 3.5
Написал программу vb.net 2013, реально ли ее запустить на fraemwork 3.5 ?

Нужен рекомпилятор приложения, написанного на VB 6.0 в исходный код.
Помогите: нужен рекомпилятор приложения, написанного на VB 6.0 в исходный код. Исходник этого...

необходимые библиотеки для запуска написанного приложения
собственно что нужно для запуска приложений написанных и скомпилированных ? net framework там что...

Какова вероятность взлома web приложения, написанного на .NET Core c применением Identity?
Делаю свой проект с применением identity и соблюдаю все рекомендации по безопасности, рекомендуемые...

36
4 / 4 / 0
Регистрация: 25.08.2010
Сообщений: 11
01.09.2010, 15:55 2
Проще используя средства самой 1С реализовать выгрузки во что нибудь. Например в SQL базу. А уже потом написать программу которая эти данные оттуда обрабатывает. Ну это мое ИМХО.
0
Эксперт С++
1934 / 1046 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
01.09.2010, 16:06 3
на первый взгляд не разбираясь в структуре и методике работы 1С могу посоветовать узнать в каком виде у 1С хранится база данных, если есть стандартный провайдер - пользоваться и вычитывать себе на здоровье, если нет, то искать кто уже сделал этот провайдер за вас и пользоваться на здоровье, на и самый худший вариант, узнать структуру и типизацию БД, написать провайдер и опять таки пользоваться на здоровье. в общем как нибудь так.
0
2092 / 1256 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
01.09.2010, 16:08  [ТС] 4
Цитата Сообщение от Mordor Посмотреть сообщение
Проще используя средства самой 1С реализовать выгрузки во что нибудь. Например в SQL базу. А уже потом написать программу которая эти данные оттуда обрабатывает. Ну это мое ИМХО.
Как раз это не тот случай. Необходимо именно реализовать взаимодействие с 1С. Причем, по возможности, без какой-либо писанины в самой 1С.
0
4 / 4 / 0
Регистрация: 25.08.2010
Сообщений: 11
01.09.2010, 16:10 5
Я знаком с 7. Возможно,в 8 по другому, но в 7 есть две версии базы либо файловая либо SQL. В 8 по моему только SQL. Поэтому данные можно брать из самой базы напрямую.
0
2092 / 1256 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
01.09.2010, 16:12  [ТС] 6
l_a_m, ход мысли понял. Узнать структуру БД не составит особого труда (есть хороший программист на 1С.). Сразу скажу, что это курсовая. Задание придумал себе сам.
Я дуаю, что работа будет выглядеть следующим образом: необходимо будет подключиться к 1С, отправить ей команду на формирование документа остатков, после из сформированного документа забрать информацию, ну и далее уже работать с информацией.
0
Эксперт С++
1934 / 1046 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
01.09.2010, 16:16 7
Цитата Сообщение от kirill29 Посмотреть сообщение
l_a_m, ход мысли понял. Узнать структуру БД не составит особого труда (есть хороший программист на 1С.). Сразу скажу, что это курсовая. Задание придумал себе сам.
Я дуаю, что работа будет выглядеть следующим образом: необходимо будет подключиться к 1С, отправить ей команду на формирование документа остатков, после из сформированного документа забрать информацию, ну и далее уже работать с информацией.
сори за оффтоп, но ну и дурацкое же Вы задание себе выбрали :-)
Изучайте 1С и пробуйте вынимать данные.
Я знаком с 7. Возможно,в 8 по другому, но в 7 есть две версии базы либо файловая либо SQL. В 8 по моему только SQL. Поэтому данные можно брать из самой базы напрямую.
я то же слышал, что 1С умеет использовать MySQL или что-то в таком духе, так что если есть такая возможность - пользуйтесь чистым SQL и вынимайте данные напрямую из базы и бог им судья этим разработчикам 1С :-)
0
2092 / 1256 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
01.09.2010, 16:33  [ТС] 8

Не по теме:

Цитата Сообщение от l_a_m Посмотреть сообщение
сори за оффтоп, но ну и дурацкое же Вы задание себе выбрали :-)
Примерных тем для задания было предложено более трехсот. Суть - интеграция каких-либо двух сторонних приложений в мое приложение. Это может быть, например, word и winrar и т.д. Но, по долгу работы, я постоянно взаимодействую именно с 1С, но не как программист. Поэтому и задание выбрал, такое, что может в будущем помочь мне в работе.



Добавлено через 11 минут
На данный момент нашел два варианта решения:
  • использование 1С в роли Automation Server'a;
  • использование COM-соединения;
0
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 17
02.09.2010, 15:56 9
kirill29. Я Вам советую копать вариант 1.

Когда то давно, я реализовывал подобное на Delphi. Мне нужно было из SCADA,
а конкретнее из RSView32 (Rockwell) юзать собственную библиотеку.
Так вот, сама скада, это куча одновременно работающих екзешников и дллек.
НО, вот что я нарыл. САМА ОБЬЕКТНАЯ МОДЕЛЬ, при помоши которой работает
встроенный в нее VBA и которая хорошо документирована на самом деле представляет
из себя ИНТЕРФЕЙС, который "зашит" в дллке IRO32.DLL. Я при помощи делфей
"раскрыл" ее код интерфейса, и она построила мне .pas файл.

Я создавал COM экземпляр create(Application.RSView32) и напрямую обращался к его
дереву обьектов через созданные глобальные переменные из верхушки дерева
и далее через точки до 7 - 8 доходило. Хорошо, что в делфях есть WITH ;-)
Все это делалось как сейчас помню через кабинет. В конце работы ОБЯЗАТЕЛЬНО
нужно было все это хозяйство уничтожить (деструкт), или все висло намертво :-))
Дллки не любят некорректного завершения. Тогда про
сборку мусора не было слышно.

Так что, ищите ту САМУЮ ОБЪЕКТНУЮ модель 1С. Не помню, есть ли VBA в 1С, когда то я ее
просмотрел бегло. Если есть, то считайте, что половина задачи в кармане, если нет, то
плохо. Нужно спрашивать разработчиков. А они такие вопросы не любят.
Если нет ИНТЕРФЕЙСА, то это черный ящик.
Но по любому это где то зашито в DLL. Используйте
если что delphi или хак :-))

Тот исходник к сожалению утерян. Давно это было... Но свое ИМХО я Вам передал.
0
633 / 376 / 7
Регистрация: 25.05.2010
Сообщений: 1,372
02.09.2010, 16:05 10
Цитата Сообщение от Mordor Посмотреть сообщение
В 8 по моему только SQL
Работает и с DBF, просто обычно не используется.
0
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 17
02.09.2010, 16:28 11
kirill29. Конечно вариант 2. Извините запутал Вас.

Добавлено через 10 минут
Цитата Сообщение от ValeryB Посмотреть сообщение
Работает и с DBF, просто обычно не используется.
Кстати для чтения DBF есть конкретный исходник на C# и на Delphi, а там до Word/Excel
рукой подать.
0
2092 / 1256 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
02.09.2010, 16:30  [ТС] 12
В общем, нашел решение, как это реализовывается.
Для работы используем COM-соединение. С платформой вместе поставляется com-библиотека comcntr.dll, находящая в C:\Program Files\1cv82\8.2.10.77\bin\. Далее в Visual Studio через Add Reference переходим на вкладку COM. В отображенном списке должна присутствовать 1СV82 COM Connector Type Library. Если нет, то значит, что библиотека не зарегистрирована, и необходимо это сделать.
В данной библиотеки содержаться интерфейсы и класс для осуществление COM-соединения с 1С. Плюс данного типа заключается в том, что создается отдельный процесс на компьютере, а все выполняется внутри процесса, который его вызвал. Тем самым не занимаются ресурсы компьютера.
Так как приложение находится в стадии разработки, то пока привожу код, в котором осуществлено подключение к 1С и для тестирования произведен вызов двух функций, возвращающих значение:
1. Из рабочей конфигурации получен номер версии данной конфигурации. В 1С бы это выглядело так:
Код
Константы.НомерВерсииКонфигурации.Получить();
2. Для тестов была создана пустая конфигурация, в которой написана глобальная функция Сложение. Код функции следующий:
Код
функция Сложение(пар1, пар2) экспорт
	возврат пар1 + пар2;
КонецФункции
Сам код моего приложения. Не обращайте внимание на изобилие флагов в InvokeMember. Это пока только черновик:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System;
using System.Windows.Forms;
using System.Reflection;
using V82;
 
namespace MyProject
{
    public partial class Form1 : Form
    {
        COMConnectorClass connector = new COMConnectorClass();
        object v82con = null;
        object v82Base = null;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
        }
 
        private void btnConnect1C_Click(object sender, EventArgs e)
        {
            string _UserName = "Администратор";
            string _Password = null;
            string connectionString = @"File=""" + tbPathBase.Text + @""";" + @"Usr=" + (_UserName == null ? @";" : @"""" + _UserName + @""";") + @"Pwd=" + (_Password == null ? @";" : @"""" + _Password + @""";");//"
            v82con = connector.Connect(connectionString);
        }
 
        private void tbPathBase_Click(object sender, EventArgs e)
        {
            if (folderDialog.ShowDialog() == DialogResult.OK)
            {
                tbPathBase.Text = folderDialog.SelectedPath;
            }
        }
        // метод для вызова собственной глобальной функции Сложение(пар1, пар2)
        private object WorkDate() 
        {
            v82Base = v82con.GetType().InvokeMember(@"Сложение", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, v82con, new object[] { 5, 2 });
            return v82Base;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = VerConfig().ToString();
        }
        // метод для получения версии конфигурации
        private object VerConfig() 
        {
            object constant = v82con.GetType().InvokeMember(@"Константы", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, v82con, null);
            object nomer = constant.GetType().InvokeMember(@"НомерВерсииКонфигурации", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, constant, null);
            return nomer.GetType().InvokeMember(@"Получить", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, nomer, new object[0]);
        }
    }
}
После завершения работы выложу весь проект. А то в инете скудна информация по данному вопросу.
0
2092 / 1256 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
16.09.2010, 16:17  [ТС] 13
Лучший ответ Сообщение было отмечено как решение

Решение

Ну вот, как и говорил, выкладываю полный проект. Данное приложение подключается к 1С, формирует в 1С прайс, и выгружает его в MS Word. Имеется возможность печати полученного прайса, не открывая документ word. Ниже приведен код приложения:
Form1.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
using System;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using System.Reflection;
using System.Text;
using V82;
using Microsoft.Office.Interop.Word;
 
namespace MyProject
{
    public partial class Form1 : Form
    {
        // Экзмпляр делегата StatusControl
        StatusControl ctrl;
        // создание COM объекта для соединения с 1С
        COMConnectorClass connector = new COMConnectorClass();
        // объект подключения к базе
        object v82Base = null;
        XMLSerialization xml = new XMLSerialization();
        // Создание COM объекта для подключения к Word
        _Application wrd = new Microsoft.Office.Interop.Word.Application();
        object missing = Type.Missing;
        object PriceList = null;
        int rowcount; // количество строк, полученных в результате запроса
        Table table; // экзепляр таблицы в word документе
 
        public Form1()
        {
            InitializeComponent();
        }
        // Загрузка формы
        private void Form1_Load(object sender, EventArgs e)
        {
            ctrl = new StatusControl(EnabledControl);
            FillLogin();
        }
        // Кнопка "Подключить"
        private void btnConnect1C_Click(object sender, EventArgs e)
        {
            label7.Text = "Подключение...";
            Thread thread = new Thread(new ParameterizedThreadStart(Connect1C));
            thread.Start(GetConnectionString());
        }
        // Событие клика по текстбоксу "Путь к базе"
        private void tbPathBase_Click(object sender, EventArgs e)
        {
            if (folderDialog.ShowDialog() == DialogResult.OK)
            {
                tbPathBase.Text = folderDialog.SelectedPath;
            }
        }
        // Фомирует строку подключения
        private object GetConnectionString() 
        {
            StringBuilder ConnectionString = new StringBuilder(100);
            ConnectionString.Append(@"File=""" + tbPathBase.Text + @""";");
            ConnectionString.Append(@"Usr=" + (comboLogin.Text == null ? @";" : @"""" + comboLogin.Text + @""";"));
            ConnectionString.Append(@"Pwd=" + (tbPassword.Text == null ? @";" : @"""" + tbPassword.Text + @""";"));
            return (object)ConnectionString.ToString();
        }
        // Заполнение comboBox'a Логин
        private void FillLogin() 
        {
            if (File.Exists("login.xml")) 
            { 
                xml.Load();
                for (int i = 0; i < xml.Count; i++)
                {
                    comboLogin.Items.Add(xml[i]);
                }
            }
            else
                comboLogin.Items.Add("Администратор");
        }
        // Метод для подключения к 1С
        private void Connect1C(object connection) 
        {
            TextControl txt = new TextControl(LabelText);
            try
            {
                v82Base = connector.Connect((string)connection);
                label7.BeginInvoke(txt, "Подключено");
                FillcBoxStorage();
                FillTypePrice();
                this.BeginInvoke(ctrl, true);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка подключения!\n" + ex.Message);
                label7.BeginInvoke(txt, "Нет соединения");
            }
        }
        // Событие Закрытие формы
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            xml.Save();
            object saveChange = WdSaveOptions.wdDoNotSaveChanges;
            object originalFormat = WdOriginalFormat.wdOriginalDocumentFormat;
            object routeDocument = true;
            wrd.Quit(ref saveChange, ref originalFormat, ref routeDocument);
        }
        // Кнопка "Получить прайс"
        private void btnPrice_Click(object sender, EventArgs e)
        {
            if (cBoxStorage.Text != "")
            {
                if (chBoxTypePrice.CheckedItems.Count != 0)
                {
                    try
                    {
                        // Создание в 1с объекта Запрос
                        object price_list = CommandTo1C.ExecuteCreateObject(v82Base, "NewObject", new object[] { "Запрос" });
                        // Устанавливаем текст запроса
                        CommandTo1C.SetProperty(price_list, "Текст", new object[] { CommandTo1C.CreateRequest(chboxAvailability.Checked) });
                        // задаем параметры запроса
                        CommandTo1C.ExecuteFunction(price_list, "УстановитьПараметр", new object[] { "Склад", cBoxStorage.Text });
                        CommandTo1C.ExecuteFunction(price_list, "УстановитьПараметр", new object[] { "ТипыЦен", chBoxTypePrice.SelectedItem.ToString() });
                        //Выполняем запрос
                        object execute = CommandTo1C.ExecuteFunction(price_list, "Выполнить", new object[]{});
                        // выполняем команду Выбрать для получения лоступа к значениям нашего прайса
                        PriceList = CommandTo1C.ExecuteFunction(execute, "Выбрать", null);
                        // получаем количество записей в результате выполнения запроса
                        int.TryParse(CommandTo1C.ExecuteFunction(PriceList, "Количество", new object[] { }).ToString(), out rowcount);
                        MessageBox.Show("Прайс получен!");
                        progressBar.Maximum = rowcount;
                    }
                    catch (Exception ex) 
                    { 
                        MessageBox.Show("Произошла ошибка!\n" + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); 
                    }
                }
                else { MessageBox.Show("Должен быть выбран тип цен!"); }
            }
            else
                MessageBox.Show("Не выбран склад");
        }
        // Кнопка "Показать окно Word"
        private void btnView_Click(object sender, EventArgs e)
        {
            wrd.Visible = true;
        }
        // Кнопка "Скрыть окно Word" 
        private void btnHide_Click(object sender, EventArgs e)
        {
            wrd.Visible = false;
        }
        // Кнопка "Выгрузить в Word"
        private void btnWord_Click(object sender, EventArgs e)
        {
            CreateDocument();
            CreateTable();
            Thread thr = new Thread(new ThreadStart(FillPriceList));
            thr.Start();
            EnabledControl(false);
        }
        // Метод для создания документа в word
        private void CreateDocument() 
        {
            object template = "";
            object newtemp = false;
            object visible = true;
            object document = WdNewDocumentType.wdNewBlankDocument;
            wrd.Documents.Add(ref template, ref newtemp, ref document, ref visible);
        }
        // Метод для создания таблицы
        private void CreateTable() 
        {
            object start = 0;
            object end = 0;
            Range rang = wrd.Application.ActiveDocument.Range(ref start, ref end);
            wrd.ActiveDocument.Tables.Add(rang, rowcount + 1, 4, ref missing, ref missing);
            table = wrd.ActiveDocument.Tables[1];
            table.Borders.Enable = 4;
            table.Range.Font.Name = "Verdana";
            table.Range.Font.Size = 10;
            table.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
 
            #region Формирование шапки таблицы
 
            table.Rows[1].Range.Font.Size = 14;
            table.Rows[1].Range.Font.Name = "Times New Roman";
            table.Cell(1, 1).Range.Text = "Наименование";
            table.Cell(1, 2).Range.Text = "Единицы изм.";
            table.Cell(1, 3).Range.Text = "Валюта";
            if (chBoxTypePrice.SelectedItem.ToString().ToLower().Contains("розни"))
                table.Cell(1, 4).Range.Text = "Розница";
            else if (chBoxTypePrice.SelectedItem.ToString().ToLower().Contains("закуп"))
                table.Cell(1, 4).Range.Text = "Закуп";
            else if (chBoxTypePrice.SelectedItem.ToString().ToLower().Contains("мелкоопт"))
                table.Cell(1, 4).Range.Text = "Мелкий опт";
            else if (chBoxTypePrice.SelectedItem.ToString().ToLower().Contains("опт"))
                table.Cell(1, 4).Range.Text = "Оптовая цена";
 
            #endregion
        }
        // Метод для загрузки списка складов
        private void FillcBoxStorage() 
        {
            FillSkladName skl = new FillSkladName(FillcBoxSklad);
            object storage = CommandTo1C.ExecuteCreateObject(v82Base, "NewObject", new object[] { "Запрос" });
            CommandTo1C.SetProperty(storage, "Текст", new object[] { CommandTo1C.RequestStorage });
            object result = CommandTo1C.ExecuteFunction(storage, "Выполнить", null);
            object selection = CommandTo1C.ExecuteFunction(result, "Выбрать", null);
            while ((bool)CommandTo1C.ExecuteFunction(selection, "Следующий", null))
            {
                cBoxStorage.BeginInvoke(skl, CommandTo1C.GetProperty(selection, "Наименование"));
            }
        }
        // методдля загрузки списка Типы цен
        private void FillTypePrice() 
        {
            Filltype f = new Filltype(FillChBoxType);
            object price = CommandTo1C.ExecuteCreateObject(v82Base, "NewObject", new object[] { "Запрос" });
            CommandTo1C.SetProperty(price, "Текст", new object[] { CommandTo1C.RequestTypePrice });
            object result = CommandTo1C.ExecuteFunction(price, "Выполнить", null);
            object selection = CommandTo1C.ExecuteFunction(result, "Выбрать", null);
            while ((bool)CommandTo1C.ExecuteFunction(selection, "Следующий", null))
            {
                chBoxTypePrice.BeginInvoke(f, CommandTo1C.GetProperty(selection, "Наименование"));
            }
        }
        // Метод для выгрузки полученного прайса в word
        private void FillPriceList() 
        {
            // экземпляр делегата для использования PorgressBar'a в отдельном потоке
            ProgressUnloading progress = new ProgressUnloading(Progress);
            for (int i = 2; i <= rowcount + 1; i++)
            {
                // получение следующей записи из результата запроса
                CommandTo1C.ExecuteFunction(PriceList, "Следующий", null);
                // заполнение соответствующих ячеек в документе
                table.Cell(i, 1).Range.Text = CommandTo1C.GetProperty(PriceList, "Номенклатура").ToString();
                table.Cell(i, 2).Range.Text = CommandTo1C.GetProperty(PriceList, "ЕдиницаИзмерения").ToString();
                table.Cell(i, 3).Range.Text = CommandTo1C.GetProperty(PriceList, "Валюта").ToString();
                table.Cell(i, 4).Range.Text = CommandTo1C.GetProperty(PriceList, "Цена").ToString();
                // Изменение значение прогрессбара
                progressBar.BeginInvoke(progress, new object[] { i - 1 });
            }
            this.BeginInvoke(ctrl, true);
        }
        //обработчик для выбора единственного
        //значения в checkedListBox
        private void chBoxTypePrice_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            for (int i = 0; i < chBoxTypePrice.Items.Count; i++)
                if (i != e.Index)
                    chBoxTypePrice.SetItemChecked(i, false);
        }
        // Обработчик нажатия кнопки "Печать прайса"
        private void btnPrint_Click(object sender, EventArgs e)
        {
            object background = false;
            object append = false;
            object range = WdPrintOutRange.wdPrintAllDocument;
            object outputFileName = "";
            object from = missing;
            object to = missing;
            object item = WdPrintOutItem.wdPrintDocumentContent;
            object copies = (int)numerCopies.Value;
            object pages = missing;
            object pagetype = WdPrintOutPages.wdPrintAllPages;
            object printToFile = false;
            object collate = true;
            object activePrinterMacGX = missing;
            object manualDuplexPrint = false;
            object printZoomColumn = missing;
            object printZoomRow = missing;
            object printZoomPaperWidth = missing;
            object printZoomPaperHeight = missing;
            try
            {
                wrd.ActiveDocument.PrintOut(ref background, ref append, ref range, ref outputFileName,
                    ref from, ref to, ref item, ref copies, ref pages, ref pagetype, ref printToFile,
                    ref collate, ref activePrinterMacGX, ref manualDuplexPrint, ref printZoomColumn,
                    ref printZoomRow, ref printZoomPaperWidth, ref printZoomPaperHeight);
            }
            catch (Exception ex) 
            {
                MessageBox.Show("Произошла ошибка при попытке печати прайса!\n" + ex.Message + "\n" + ex.Source, "Исключение", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
 
        #region Методы и делегаты для доступа к контролам из другого потока
 
        delegate void TextControl(string text);
        delegate void ProgressUnloading(int value);
        delegate void StatusControl(bool value);
        delegate void FillSkladName(object obj);
        delegate void Filltype(object obj);
 
        // метод для изменения значения progressBar'a
        private void Progress(int value) 
        {
            this.progressBar.Value = value;
        }
        // метод для установки текста label'a
        private void LabelText(string text) 
        {
            this.label7.Text = text;
        }
        // метод для блокировки и разблокировки элементов формы
        private void EnabledControl(bool flag) 
        {
            groupBox1.Enabled = flag;
            groupBox2.Enabled = flag;
            groupBox3.Enabled = flag;
            groupBox4.Enabled = flag;
            btnPrice.Enabled = flag;
        }
        // метод для заподнения comboBox'a список складов
        private void FillcBoxSklad(object obj) 
        {
            cBoxStorage.Items.Add(obj);
        }
        // метод для заполнения checkedListBox'a Типы цен
        private void FillChBoxType(object obj) 
        {
            chBoxTypePrice.Items.Add(obj);
        }
 
        #endregion
    }
}
Класс CommandTo1C:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Text;
using System.Reflection;
 
namespace MyProject
{
    class CommandTo1C
    {
        /// <summary>
        /// Перечисления. Определяют выбор для извлекаемых действий.
        /// </summary>
        private static BindingFlags CREATE_OBJECT = BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.CreateInstance;
        private static BindingFlags INVOKE_METHOD = BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static;
        private static BindingFlags GET_PROPERTY = BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Static;
        private static BindingFlags SET_PROPERTY = BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Static;
 
        /// <summary>
        /// Статический метод для создания объекта в 1С
        /// </summary>
        /// <param name="Object1C">Объект 1С, в котором создается новый объект</param>
        /// <param name="NameObject">Наименование нового объекта</param>
        /// <param name="Arguments">Аргументы, необходимые для создания нового объекта</param>
        /// <returns>возвращает созданный объект</returns>
        public static object ExecuteCreateObject(object Object1C, string NameObject, object[] Arguments)
        {
            return Object1C.GetType().InvokeMember(NameObject, CREATE_OBJECT, null, Object1C, Arguments);
        }
 
        /// <summary>
        /// Статический метод для выполннения процедуры или функции в 1С
        /// </summary>
        /// <param name="Object1C">Объект 1С, для которого необходимо выполнить процедуру или функцию</param>
        /// <param name="NameObject">Наименование процедуры или функции</param>
        /// <param name="Arguments">Аргументы, необходимые для выполнения функции</param>
        /// <returns>Возвращает объект. сформированный в результате выполнения функции</returns>
        public static object ExecuteFunction(object Object1C, string NameObject, object[] Arguments)
        {
            return Object1C.GetType().InvokeMember(NameObject, INVOKE_METHOD, null, Object1C, Arguments);
        }
 
        /// <summary>
        /// Статический метод для установки свойства объекта 1С
        /// </summary>
        /// <param name="Object1C">Объект 1С, для которого необходимо задать свойство</param>
        /// <param name="NameObject">Наименование свойства</param>
        /// <param name="Arguments">Аргументы, необходимые для установки свойства</param>
        public static void SetProperty(object Object1C, string NameObject, object[] Arguments)
        {
            Object1C.GetType().InvokeMember(NameObject, SET_PROPERTY, null, Object1C, Arguments);
        }
 
        /// <summary>
        /// Статический метод для получения какого-либо значения объекта 1С
        /// </summary>
        /// <param name="Object1C">Объект 1С, у которого необходимо получить свойство</param>
        /// <param name="NameObject">Наименование свойства</param>
        /// <returns>Возвращает полученное значение</returns>
        public static object GetProperty(object Object1C, string NameObject)
        {
            return Object1C.GetType().InvokeMember(NameObject, GET_PROPERTY, null, Object1C, null);
        }
        /// <summary>
        /// Статический метод. Формирует текст запроса для получения прайса
        /// </summary>
        /// <param name="only_availability">True - получить прайс только по товарам, которые
        /// имеются на складе, False - получение прайса по всей номенклатуре</param>
        /// <returns></returns>
        public static string CreateRequest(bool only_availability) 
        {
            string keyword = "";
            if (only_availability)
                keyword = "ЛЕВОЕ";
            else
                keyword = "ПРАВОЕ";
            string date = "ДАТАВРЕМЯ(" + DateTime.Now.Year + "," + DateTime.Now.Month + "," + DateTime.Now.Day + ")";
            string request =
        @"ВЫБРАТЬ
            ЦеныНоменклатурыСрезПоследних.Номенклатура.Наименование КАК Номенклатура,
            ЦеныНоменклатурыСрезПоследних.Цена,
            ЦеныНоменклатурыСрезПоследних.Валюта.Наименование КАК Валюта,
            ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения.Наименование КАК ЕдиницаИзмерения
        ИЗ
            РегистрНакопления.ТоварыВРознице.Остатки(" + date + @", Склад.Наименование = &Склад) КАК ТоварыВРозницеОстатки
                " + keyword + " СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(" + date + @", ТипЦен.Наименование = &ТипыЦен) КАК ЦеныНоменклатурыСрезПоследних
                ПО ТоварыВРозницеОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";
            return request;
        }
 
        /// <summary>
        /// Строка запроса для получения списка складов
        /// </summary>
        public static string RequestStorage = @"ВЫБРАТЬ
                         Склады.Наименование
                     ИЗ
                         Справочник.Склады КАК Склады";
        /// <summary>
        /// Строка запроса для получения типов цен номенклатуры
        /// </summary>
        public static string RequestTypePrice = @"ВЫБРАТЬ
                        ТипыЦенНоменклатуры.Ссылка,
                        ТипыЦенНоменклатуры.Наименование,
                        ТипыЦенНоменклатуры.ВалютаЦены.Наименование
                     ИЗ
                        Справочник.ТипыЦенНоменклатуры КАК ТипыЦенНоменклатуры";
    }
}
сам проект:
Вложения
Тип файла: rar MyProjectOld.rar (523.3 Кб, 910 просмотров)
6
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 17
17.09.2010, 19:17 14
Молодец. Красивое решение.

Не по теме:

Но, меня в свое время за подобное на форумах по АСУТП обозвали желтым земляным червяком.
Мол, зачем все это надо. Да, это все можно. Но!!!, это все мол недокументированные возможности.
Вот если ты помрешь, то кто это будет потом енто сопровождать и тд. Кто потом будет
разбираться в твоем коде и твоих длл-как. Сначала мне было немного обидно, а потом я
действительно об ентом задумался и теперЪ пью кефьирЪ :D И еще ИМХО поделки нужны только если они реально приносят деньги. И лучше долго. Например мне некая шахта четвертый год реально платит деньги по договору, за работу которую я сделал еще на дважды предыдущем месте работы. Вот тогда я реально мозг напряг, типа как Вы сейчас. А крякну, пусть разбираются. Тем более на шахте есть асупщики, которые сидят сейчас, и в носу ковыряются, а в моем коде и не хотят разбираться, хотя он открыт :p Зачем, у шахты и так денег дохренища :delight:
Так что, денег и удачи :)

0
panshin
01.02.2011, 17:10 15
Мне нравится. И главное, переход на такую технологию разработки снижает время обработки и приводит к простому алгоритму синхронизации данных между 1С8 и базами mssql, mysql, etc.
Спасибо. Давно не видел красивых программ.
7 / 7 / 0
Регистрация: 06.02.2010
Сообщений: 31
02.02.2011, 09:40 16
делается это легко через COM.

http://v8.1c.ru/overview/IntegrationCOM.htm

http://wiki.kint.ru/index.php/... ние_(1Cv8)

ну и в тему http://www.sibeaz.ru/st_1c_pre... mami.shtml
0
195 / 13 / 4
Регистрация: 26.04.2011
Сообщений: 135
09.01.2014, 08:47 17
Помогите убогому
что есть такое "StatusControl" ? Сломал мозг

Добавлено через 8 минут
прошу прощения, разобрался!
0
19 / 19 / 2
Регистрация: 27.09.2011
Сообщений: 155
24.06.2014, 15:47 18
парни, спасайте, с ума уже схожу. не получается разорвать COM-соединение.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            dynamic result;
            V83.COMConnector com1s = new V83.COMConnector();
 
            com1s.PoolCapacity = 10;
            com1s.PoolTimeout = 60;
            com1s.MaxConnections = 2;
            string connectionStringFileDB = "File='" + file + "';Usr='" + user + "';pwd='" + pas + "';";
            string connectionStringClientServerDB = "Srvr='" + server + "';Ref='" + db + "';Usr='" + user + "';Pwd='" + pas + "';";
            result = com1s.Connect(connectionStringClientServerDB);
            
            
            string recomendVersion = result.КонтрольВерсииПлатформы.РекомендуемаяВерсияПлатформы();
            string configurationVersion = result.Константы.РТРС_ВерсияКонфигурации.Получить();
            bool isConfigurationModify = result.КонфигурацияИзменена();
 
            label1.Text = "Рекомендуемая версия клиента: " + recomendVersion;
            label2.Text = "Версия конфигурации ИБ: " + configurationVersion;
            label3.Text = "Доступно обновление конфигурации: " + isConfigurationModify;
 
            result.ЗавершитьРаботуСистемы(false);
КонфигурацияИзменена() - глобальный контекст, отрабатывает отлично.
ЗавершитьРаботуСистемы() - глобальный контекст, выдаёт ошибку "System.__ComObject" не содержит определения для "ЗавершитьРаботуСистемы",
хотя из 1с всё работает.
0
1445 / 1118 / 344
Регистрация: 11.04.2011
Сообщений: 2,615
24.06.2014, 19:45 19
INF1NUM, А вы уверены, что ЗавершитьРаботуСистемы доступен из под внешнего соединение. К 1С сейчас доступа нет, поэтому точно сказать не могу, но по логике она не должна быть доступной.
Вроде как COM объект должен уничтожаться, когда на него пропадает ссылка. Можно написать явно:
C#
1
result = null;
У меня 1С'ники жаловались, что ком-коннектор не всегда закрывался. Поэтому я для пущей убедительности стал делать так:
C#
1
System.Runtime.InteropServices.Marshal.ReleaseComObject(result);
Закрывается ли так ComConnector не знаю, не спрашивал. Но 1С'ники пока больше не жаловались.
0
19 / 19 / 2
Регистрация: 27.09.2011
Сообщений: 155
25.06.2014, 08:08 20
Цитата Сообщение от kodv Посмотреть сообщение
А вы уверены, что ЗавершитьРаботуСистемы доступен из под внешнего соединение
не уверен, но другого способа завершить соединение не знаю.
Цитата Сообщение от kodv Посмотреть сообщение
C#
1
result = null;
пробовал , не канает.
Цитата Сообщение от kodv Посмотреть сообщение
C#
1
System.Runtime.InteropServices.Marshal.ReleaseComObject(result);
не пробовал, завтра на работе попробую, но что-то мне подсказывает, что для корректного завершения соединения на стороне 1С это нужно как-то явно указывать. закрадывается мысль, что этого просто не предусмотрели.

Добавлено через 11 часов 50 минут
C#
1
System.Runtime.InteropServices.Marshal.ReleaseComObject(result);
Попробовал, бесполезно. Но заметил, что все соединения падают после закрытия программы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2014, 08:08

Запуск приложения, написанного для Windows 10, в Windows 8
Привет.Есть такое приложение PS4 Remote Play. Вместо того что бы четко написать &quot;данная программа...

Запуск приложения, написанного для Windows 8, в Windows 7
Привет. Есть один софт-RemotePlay PS4 . Он работает только на ОС не ниже Win8. А у меня Win7....

При создании дистрибутива приложения (написанного на VB) возникает ошибка: - Unexpected error number 80010108 has occurred : Automation error.
Уважаемые эксперты VB-ка , помогите разрешить следующую проблему: При создании дистрибутива...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.