Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
34 / 30 / 3
Регистрация: 16.12.2019
Сообщений: 110
.NET 4.x

Остаточный процесс EXCEL.EXE

06.02.2020, 11:10. Показов 3414. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте товарищи профессионалы! =)
Тем подобных нашел уйму, перепробовал все, чтобы не плодить еще одну тему, не помогает.
Программа по функционалу полностью устраивает , не устраивает то, что остается процесс Excel.exe
Причем если перезапустить программу и произвести действие после которого он остается и затем закрыть программу, то останется так же 1, единственный процесс.
Остается он после того, как Я обрабатываю Drop в ListBox, файлов (хоть 1, хоть нескольких, разницы нет), далее идет проверка, что это файлы *.xls*, происходит поиск нужных столбцов и формируется новая таблица, данные о которой заносятся в ListBox и БД, на основе того же Excel.
В обычном режиме процесс закрывается, тоесть при просмотре уже готовых документов, добавлении документа в ручную, создании объектов.
В попытках исправить это уже достаточно сильно намусорил в коде)))

Есть возможность залить проект если это поможет, часть кода после которой это происходит вряд ли поможет, но то же могу залить (проверил ее на 10 раз)
прописывал закрытие каждой открываемой книги, после этого даже прописал на книгу = nothing, хотя это лишнее, объекты Excel.Application повсеместно прописаны .Quit(), затем = nothing, добавлена GC.Collect() в конце той части и при закрытии самой программы...

злосчастная часть кода (заранее прошу прощение, код не причесан):
VB.NET
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
Private Sub BetterListBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles BetterListBox1.DragDrop
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            Dim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())
            If ListBox1.SelectedIndex = -1 Then
                Exit Sub
            Else
                Me.Enabled = False
                ' Dim i As Integer = 0
                Dim ExcApp As New Microsoft.Office.Interop.Excel.Application
                'ExcApp = CreateObject("Excel.Application")
                Dim ExcApp_for_dropped_file As New Microsoft.Office.Interop.Excel.Application
                Dim dropped_file As Microsoft.Office.Interop.Excel.Workbook
                Dim new_spec_from_file As Microsoft.Office.Interop.Excel.Workbook
                'ExcApp_for_dropped_file = CreateObject("Excel.Application")
                For ij As Integer = 0 To files.Length - 1
                    If IO.Path.GetExtension(files(ij)).ToLower.Contains("xls") Then
                        Dim Column_position As Integer() = New Integer(8) {0, 0, 0, 0, 0, 0, 0, 0, 0}
                        dropped_file = ExcApp_for_dropped_file.Workbooks.Open(files(ij))
                        Dim row As Integer = 1
                        Dim col As Integer = 1
                        Dim this_row As Integer = 0
                        Dim name_of_spec_in_LB As String = IO.Path.GetFileNameWithoutExtension(files(ij))
                        dropped_file.Sheets(1).Range(dropped_file.Sheets(1).Cells(1, 1), dropped_file.Sheets(1).Cells(20, 20)).MergeCells = False
                        For row = 1 To 20
                            For col = 1 To 20
                                If dropped_file.Sheets(1).Cells(row, col).Value IsNot Nothing Then
                                    If InStr(dropped_file.Sheets(1).Cells(row, col).Value.ToString.ToLower, "поз") > 0 Or
                                        InStr(dropped_file.Sheets(1).Cells(row, col).Value.ToString.ToLower, "№") > 0 Then
                                        Column_position(0) = col
                                    End If
                                    If InStr(dropped_file.ActiveSheet.Cells(row, col).Value.ToString.ToLower, "наимен") > 0 Then
                                        Column_position(1) = col
                                        this_row = row
                                    End If
                                    'If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "тип") > 0 And this_row = row Then
                                    '    Column_position(2) = col
                                    'End If
                                    'If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "код") > 0 And this_row = row Then
                                    '    Column_position(3) = col
                                    'End If
                                    If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "завод") > 0 And this_row = row Then
                                        Column_position(7) = col
                                    End If
                                    If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "ед") > 0 And this_row = row And
                                        InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "мас") = 0 Then
                                        Column_position(2) = col
                                    End If
                                    If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "кол") > 0 And this_row = row Then
                                        Column_position(3) = col
                                    End If
                                    'If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "мас") > 0 And
                                    '    this_row = row And Column_position(5) <> col Then
                                    '    Column_position(6) = col
                                    'End If
                                    If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "примеч") > 0 And this_row = row Then
                                        Column_position(6) = col
                                    End If
                                    If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "конт") > 0 And this_row = row Then
                                        Column_position(8) = col
                                    End If
                                    If InStr(dropped_file.ActiveSheet.Cells(row, col).value.ToString.ToLower, "цена") > 0 And this_row = row Then
                                        Column_position(4) = col
                                        Column_position(5) = col + 1
                                    End If
                                End If
                            Next
                            If this_row > 0 Then Exit For
                        Next
                        this_row += 1
                        If dropped_file.ActiveSheet.Cells(this_row, Column_position(1)).value Is Nothing Then this_row += 1
                        Do While IsNumeric(dropped_file.ActiveSheet.Cells(this_row, Column_position(1)).value)
                            this_row += 1
                        Loop
                        Dim i As Integer = 1
                        If BetterListBox1.FindStringExact(name_of_spec_in_LB) > -1 Then
                            Do While BetterListBox1.FindStringExact(name_of_spec_in_LB & " - " & i.ToString) > -1
                                i += 1
                            Loop
                            name_of_spec_in_LB = name_of_spec_in_LB & " - " & i
                        End If
 
                        element_is_create = True
                        BetterListBox1.Items.Add(name_of_spec_in_LB)
                        BetterListBox1.SelectedIndex = BetterListBox1.Items.Count - 1
                        Form2.TextBox1.Text = name_of_spec_in_LB
                        Действие_со_списками(2, 1, name_of_spec_in_LB)
                        'System.IO.File.Copy(path_of_prog & "\data\new_spec.dbs", path_of_prog & "\data\Specs\" & ListBox1.SelectedItem.ToString & "\" & name_of_spec_in_LB & ".xlsx", True)
                        new_spec_from_file = ExcApp.Workbooks.Open(path_of_prog & "\data\Specs\" & ListBox1.SelectedItem.ToString & "\" & name_of_spec_in_LB & ".xlsx")
                        col = 2
                        row = 6
                        Do While dropped_file.ActiveSheet.Cells(this_row, Column_position(1)).value IsNot Nothing
                            If InStr(dropped_file.ActiveSheet.Cells(this_row, Column_position(1)).value.ToString.ToLower, "итог") = 0 Then
                                For i = 0 To 7
                                    If Column_position(1 + i) > 0 Then
                                        new_spec_from_file.ActiveSheet.Cells(row, col + i).Value = dropped_file.ActiveSheet.Cells(this_row, Column_position(1 + i)).Value
                                    End If
                                    If row = 6 Then
                                        new_spec_from_file.ActiveSheet.Cells(row, 1).Value = 1
                                    Else
                                        new_spec_from_file.ActiveSheet.Cells(row, 1).Value = new_spec_from_file.ActiveSheet.Cells(row - 1, 1).Value + 1
                                    End If
                                Next
                                row += 1
                            End If
                            this_row += 1
                        Loop
                        'dropped_file.Saved = True
                        'ExcelApp.visible = True
                        dropped_file.Close(SaveChanges:=False)
 
                        row -= 1
                        new_spec_from_file.ActiveSheet.Cells(1, 1).Value = "Спецификация - " & name_of_spec_in_LB
                        'выравниваем
                        new_spec_from_file.ActiveSheet.range(new_spec_from_file.ActiveSheet.Cells(1, 1), new_spec_from_file.ActiveSheet.Cells(row, 9)).VerticalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter
                        new_spec_from_file.ActiveSheet.range(new_spec_from_file.ActiveSheet.Cells(6, 1), new_spec_from_file.ActiveSheet.Cells(row, 1)).HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter
                        new_spec_from_file.ActiveSheet.range(new_spec_from_file.ActiveSheet.Cells(6, 3), new_spec_from_file.ActiveSheet.Cells(row, 6)).HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter
                        ' перенос текста на новую строку
                        new_spec_from_file.ActiveSheet.range(new_spec_from_file.ActiveSheet.Cells(6, 1), new_spec_from_file.ActiveSheet.Cells(row, 9)).WrapText = True
                        ' выделяем область печати
                        new_spec_from_file.ActiveSheet.PageSetup.PrintArea = "$A$1:$I$" & row
                        ' обводим ячейки
                        new_spec_from_file.ActiveSheet.Range(new_spec_from_file.ActiveSheet.Cells(6, 1), new_spec_from_file.ActiveSheet.Cells(row, 9)).Cells.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlLineStyleNone
                        new_spec_from_file.ActiveSheet.Range(new_spec_from_file.ActiveSheet.Cells(6, 1), new_spec_from_file.ActiveSheet.Cells(row, 9)).Cells.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous
 
                        'два знака после запятой
                        new_spec_from_file.ActiveSheet.range(new_spec_from_file.ActiveSheet.Cells(6, 5), new_spec_from_file.ActiveSheet.Cells(row + 5, 6)).NumberFormat = "0.00"
 
                        new_spec_from_file.Save()
                        new_spec_from_file.Close()
                        
 
                    Else
                        Exit Sub
                    End If
                    ExcApp.Quit()
                    ExcApp_for_dropped_file.Quit()
                    
                Next
 
                dropped_file = Nothing
                new_spec_from_file = Nothing
                ExcApp = Nothing
                ExcApp_for_dropped_file = Nothing
                'database.Save()
                'database.Close()
 
                GC.Collect()
                Me.Enabled = True
            End If
 
        End If
    End Sub
Добавлено через 14 минут
Заметил еще одну странную вещь, при висящем процессе, если открывать другие *.xls файлы которые в программе не использовались создается новый процесс, НО, если открыть любой из вновь добавленных (Drop-нутых) файлов, то процесс остается только один, причем при закрытии этого файла процесс не пропадает... никаких гребаных мыслей...

Добавлено через 1 час 12 минут
Есть соображения сохранить массив процессов excel созданных при работе программы и при закрытии их kill, только не знаю как это сделать...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.02.2020, 11:10
Ответы с готовыми решениями:

Не могу закрыть процесс excel.exe (не стандартная ситуация)
Добрый день! Понимаю, что тема выглядит избитой, но я уже двое суток не могу решить проблему с подвисшим процессом excel. Открываю: ...

Почему процесс EXCEL.EXE висит даже после уничтожения его переменных
Приветствую. Гружу данные с Excel'я и забавная штука получается. Выполняю код: Dim Exc As Object Exc =...

Программно завершить процесс explorer.exe
Нужно одной кнопкой программно завершить процесс explorer.exe, а второй—запустить.

13
3260 / 3289 / 556
Регистрация: 17.02.2019
Сообщений: 5,196
06.02.2020, 19:49
попробуй вынести
VB.NET
1
2
ExcApp.Quit()
ExcApp_for_dropped_file.Quit()
за все условия а то если условие равно -1 выйдет из процедуры Exit Sub
не закрыв файл
VB.NET
1
2
3
4
5
If ListBox1.SelectedIndex = -1 Then
                Exit Sub
            Else
 ' действие
End If
или пропиши до Exit Sub
0
259 / 200 / 49
Регистрация: 18.12.2015
Сообщений: 416
06.02.2020, 20:02
Таких тем на форуме много, используйте процедуру выгрузки объектов из памяти:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  
  
'...
            releaseObject(ExWS)
            releaseObject(ExWB)
            releaseObject(ExApp) 
'...
 
Private Sub releaseObject(ByVal obj As Object)
        Try
            Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
Если у вас останется висеть отдельный процесс, то он выгрузится после закрытия вашего приложения.
0
34 / 30 / 3
Регистрация: 16.12.2019
Сообщений: 110
07.02.2020, 09:19  [ТС]
January29,
Выносить пробовал, а вот это условие происходит до объявления переменных с Excel. Application

Добавлено через 2 минуты
Jungl, тоже пробовал, все равно один единственный процесс остаётся висеть. Причём, сам по себе он завершаться не хочет... Ждал достаточно долго.

Добавлено через 10 минут
А есть возможность в памяти проверить какие из процессов (Excel) являются скрытими и Kill-нуть их?

Добавлено через 1 час 26 минут
Пытался сделать так

VB.NET
1
2
3
4
5
6
7
Dim proc As Process
        For Each proc In Process.GetProcessesByName("EXCEL")
            'MsgBox(proc.StartInfo.WindowStyle)
            If proc.StartInfo.WindowStyle = 0 Then
                proc.Kill()
            End If
        Next
Но почему-то закрывает все и скрытые и не скрытые процессы, ищу дальше...

Добавлено через 1 час 28 минут
Пробовал так:
VB.NET
1
2
3
4
5
6
7
8
Dim proc As Process
        For Each proc In Process.GetProcessesByName("EXCEL")
            'MsgBox(proc.StartInfo.WindowStyle)
            If (proc.MainWindowTitle) = "" Then
                'If proc.StartInfo.WindowStyle = 0 Then
                proc.Kill()
            End If
        Next
При этом сторонние Excel не закрываются, НО, Если есть открытый (не программой) документ, то как бы после работы остается один процесс (вроде все норм), но вот при завершении его, во-первых вылезает диалог на сохранение файла, хотя Я там ничего не менял, а во-вторых после закрытия (хоть сохраняй, хоть нет в диалоге) процесс остается висеть... при чем если после этого просто открыть и закрыть программу, процесс уходит...
0
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
07.02.2020, 18:55
М.б. так получиться
VB.NET
1
2
3
4
Dim pro As System.Diagnostics.Process() = CType(System.Diagnostics.Process.GetProcessesByName("EXCEL"), System.Diagnostics.Process())
For Each i As System.Diagnostics.Process In pro
    i.Kill()
Next
0
3260 / 3289 / 556
Регистрация: 17.02.2019
Сообщений: 5,196
07.02.2020, 20:03
Пробуй
VB.NET
1
2
3
4
5
6
7
8
9
ExcApp.Quit()
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcApp)
            ExcApp = Nothing
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            GC.Collect()
        End Try
должен закрыть в диспетчер задач

Добавлено через 9 минут
закрывает открытые программой
0
34 / 30 / 3
Регистрация: 16.12.2019
Сообщений: 110
08.02.2020, 04:23  [ТС]
January29, пробовал, не помогает

Добавлено через 1 минуту
ovva, попробую как доберусь до работы)
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4359 / 3429 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
08.02.2020, 06:54
Вообще, я тоже такое замечал в своих ПО, и решал задачу таким образом:

1) Вынести функцию создания объекта и открытия и работы с Эксель в отдельный метод
2) На кнопке или в месте, где нужно его открыть и запустить обработку чего-то, ссылался на метод-обертку, созданную в п.1
3) После отработки кода с экселем и закрытии его программным способом в методе, созданном в п.1, в коде кнопки, самой последней строкой указать GC.Collect()
4) После чего, все переменные, которые отработали в том методе (п.1) будут = Nothing и при сборе мусора GC красиво и благополучно его закрывает, без всяких убийств процессов и тому подобного...
5) Эту хрень я заметил давно и данное решение до сих порт работает везде, где я работаю с Эксель.

Добавлено через 5 минут
Как пример, чтобы было понятно вышеизложенное, покажу логику того, что я наговорил:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
Sub Нажали_Кнопку()
   Работа_с_Эксель()
   GC.Collect() ' и вот тут сборщик мусора уже выполняет работу по уничтожению всего, что лишнее.
End Sub
 
Sub Работа_с_Эксель()
  ' открыти
  '  поработали
  '   закрыли
  ' (обязательно все объекты App, Book и Sheet   =  Nothing)
End Sub
Добавлено через 11 минут
А вообще, посмотрел ваш код в первом посте, у вас там все неправильно организовано:

1) Вы открываете Эксель,
2) Перебираете файлы, которые были перенесены мышкой на Листбокс
3) Если файл не XLS, тогда вы сразу же ВЫХОДИТЕ через Exit Sub
А Эксель то не закрыт, и висит, ожидая дальнейших команд, и тут хоть че делайте в коде, поможет только Kill...


Как-то так.
3
34 / 30 / 3
Регистрация: 16.12.2019
Сообщений: 110
08.02.2020, 11:23  [ТС]
Yury Komar,
Да, спасибо, Я это тоже заметил и поправил, внёс объявление внутрь цикла for и там же в конце, до next прописал все .close() .quit(), а так же присвоил всем переменным nothing, не помогло, но это действительно более правильная организация
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4359 / 3429 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
08.02.2020, 11:45
Лучший ответ Сообщение было отмечено Zhivoder как решение

Решение

Zhivoder, и не помодет, потому что GC.Collect вызывать нужно за пределами того метода, в котором выполняется код.
В вашем случает, нужно весь ваш код вынести в отдельный метод, а уже в методе DragDrop вызывать так:

VB.NET
1
2
3
4
Sub xXx_DragDrop()
  Ваш_метод(со своими аргументами)
  GC.Collect()
End Sub
2
34 / 30 / 3
Регистрация: 16.12.2019
Сообщений: 110
08.02.2020, 12:03  [ТС]
Yury Komar, GC.Collect у меня сразу же после цикла, попробую в отдельный метод убрать цикл, но мне кажется сути это не поменяет)
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4359 / 3429 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
08.02.2020, 14:13
Zhivoder, Если вы сделаете так, как я описал, то 95% гарантии того, что все получится.
Ну, я дал совет, дальше сами решайте.
0
34 / 30 / 3
Регистрация: 16.12.2019
Сообщений: 110
10.02.2020, 12:57  [ТС]
Yury Komar,
Спасибо!
Перенес в отдельный метод, после него сборщика мусора, пару раз затестил, оба раза в процессах тишина.
Был не прав!
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4359 / 3429 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
10.02.2020, 15:54
Zhivoder, Ну вот видите как бывает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.02.2020, 15:54
Помогаю со студенческими работами здесь

Как убить процесс explorer.exe?
Слышал, что можно &quot;убить&quot; процесс. Как реализовать например, чтобы при открытии формы убивался процесс &quot;Explorer.exe&quot;.

Не закрывает процесс Excel.exe
Нужна помощь! После копирования строк и столбцов из одного файла Excel в другой файл Excel не закрывается процесс Excel.exe. ...

не закрывается процесс excel.exe
добрый день столкнулся с проблемой в представленном ниже коде: не понятно по каким причинам не отрабатывается OpExcel.Quit. После...

"Висящий" процесс Excel.exe
Доброго времени суток, господа! Возник следующий вопрос... Ситуация: запускаем свежеиспеченный прожект.ехе, жмякаем по кнопочке,...

Процесс svchost.exe или TRACER.exe загружают процессор
Здравствуйте, столкнулся с некоторой проблемой. Если подробнее, то через некоторое время после старта работы ОС снижается...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Определение даты списания и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: установить период списания автоматически и запретить. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru