Чем отличается "ПолучитьCOMОбъект" от "Новый COMОбъект"? И в каких случаях нужно каждый отдельно использовать?

1. user1088693 19.11.20 09:27 Сейчас в теме
Чем отличается "ПолучитьCOMОбъект" от "Новый COMОбъект"? И в каких случаях нужно каждый отдельно использовать? В синтаксисе помощника читал, но я ничего вообще не понял.
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 19.11.20 09:36 Сейчас в теме
(1) приведите кусок кода, где видели "ПолучитьCOMОбъект"
3. user1088693 19.11.20 09:40 Сейчас в теме
В обычной форме 8.2, в синтаксисе помощника
4. nomad_irk 76 19.11.20 09:40 Сейчас в теме
(1)Читать синтаксис-помощник по этим методам пробовали?
alex-l19041; user623969_dusa; +2 Ответить
5. user1088693 19.11.20 09:41 Сейчас в теме
(4) Пробовал, но я ничего вообще не понял. Поэтому у вас и спрашиваю
6. nomad_irk 76 19.11.20 09:48 Сейчас в теме
(5)Хорошо. Давайте разберем написанное в синтаксис-помощнике вместе.


Глобальный контекст (Global context)
ПолучитьCOMОбъект (GetCOMObject)
Синтаксис:
ПолучитьCOMОбъект(<ИмяФайла>, <ИмяКлассаCOM>)
Параметры:
<ИмяФайла> (необязательный)
Тип: Строка.
Имя файла, включающее полный путь.
<ИмяКлассаCOM> (необязательный)
Тип: Строка.
Имя класса COM, экземпляр которого должен быть создан или получен. Если расширение имени файла, указанное в первом параметре, полностью идентифицирует класс объекта, то параметр может быть опущен.
Возвращаемое значение:
Тип: COMОбъект.
Описание:
Основное применение функции ПолучитьCOMОбъект - это получение COM-объекта, соответствующего файлу. Для этого следует в качестве первого параметра функции задать имя файла, который будет определять COM-объект. Например, фрагмент кода:
Таб = ПолучитьCOMОбъект("C:\DATA\DATA.XLS");
создает объект Excel.Application и открывает с его помощью файл документа "C:\DATA\DATA.XLS". Если указанный файл во время выполнения данного фрагмента уже открыт с помощью MS Excel, то будет получена ссылка на уже существующий объект.
Для файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.
Если в качестве имени файла указана пустая строка, то будет создан новый экземпляр объекта. В этом случае необходимо указать имя класса COM.
Например, фрагмент кода:
Таб = ПолучитьCOMОбъект("", "Excel.Application");
создает новый документ Excel. В дальнейшем этот документ может быть программно заполнен и сохранен в файл.
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора:
П = ПолучитьCOMОбъект( , "Excel.Application");
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel, если таковое имелось, или будет вызвано исключение, если активных экземпляров MS Excel не было.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Пример:
// Получение объекта COM, соответствующего файлу

Таб = ПолучитьCOMОбъект("C:\DATA\DATA.XLS");

// Создание нового экземпляра объекта

Таб = ПолучитьCOMОбъект("", "Excel.Application");

// Получение активного объекта
Показать



COMОбъект (COMObject)
Конструкторы:
По имени приложения
Описание:
Создает COM-объект (например, Word, Excel и т.д.). Методы и свойства СОМ-объектов в дальнейшем становятся доступными через данный объект.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.


Что именно не понятно из описания каждого из методов?
7. user1088693 19.11.20 09:54 Сейчас в теме
(6) У меня задача, мне нужно просто прочитать Excel-файл, без каких либо изменений в самом файле Excel. И вот файл можно по-разному прочитать:

Первый способ:
ExcelApp = ПолучитьCOMОбъект("c:\file.xls");

Второй способ:
ExcelApp = Новый COMОбъект("Excel.Application");
ExcelApp.WorkBooks.Open("c:\file.xls", 0);


Так вот, в чем разница вообще между этими способами?
9. nomad_irk 76 19.11.20 10:06 Сейчас в теме
(7)
1. Как минимум количеством строк кода для достижения цели
2. Гибкостью программирования самого COM-объекта.
28. user1088693 19.11.20 12:32 Сейчас в теме
(9) Количества строк кода меня не особо интересует. На счет гибкости я понял, но меня интересует именно назначение, для каких случаев нужно писать "ПолучитьCOMОбъект", а для каких "Новый COMОбъект"?
34. nomad_irk 76 19.11.20 13:13 Сейчас в теме +0.25 $m
(28)Как вариант:

ПолучитьCOMОбъект() - для случаев, когда необходимо использовать уже запущенный экзмпляр ПО, обрабатывающий файлы определенного типа
Новый COMОбъект - для случаев, когда необходимо создание нового экземпляра ПО в ОЗУ машины для обработки файла определенного типа.

Так же Новый COMОбъект позволяет программировать само ПО: управлять его свойствами/методами и прочее.
user1088693; +1 Ответить
57. user1088693 20.11.20 07:36 Сейчас в теме
(34) Я правильно ли понимаю, что "Новый COMОбъект" нужен для того, чтобы туда записывать данные в Excel-файл, а "ПолучитьCOMОбъект" нужен только для чтения Excel-файла?
64. nomad_irk 76 20.11.20 10:20 Сейчас в теме
(57)нет. с помощью обоих методов можно как просто читать файл, так и изменять его.
user1088693; +1 Ответить
65. user1088693 20.11.20 10:52 Сейчас в теме
10. platonov.e 159 19.11.20 10:08 Сейчас в теме
(7) Если у вас эксель с простым текстом без формул и картинок, рекомендую вообще не использовать ком объект.
vadim.semyonov.rzn; +1 Ответить
11. nomad_irk 76 19.11.20 10:10 Сейчас в теме
(10)Оно не читает *.xls, только *.xlsx.
12. platonov.e 159 19.11.20 10:10 Сейчас в теме
13. nomad_irk 76 19.11.20 10:17 Сейчас в теме
(12)Если про ТабДок.Прочитать(*.xls), то оно ругается на не верный формат файла.
16. spacecraft 19.11.20 10:29 Сейчас в теме
(11) (13) тут не совсем так. Просто у xls есть несколько форматов. Вот совсем старый 95 (если не ошибаюсь) он не читает.
17. nomad_irk 76 19.11.20 10:44 Сейчас в теме
(16)Вот вам пример файла.
Прикрепленные файлы:
Отчет_нов.xls
18. spacecraft 19.11.20 10:47 Сейчас в теме
(17) я же уточнил, что 95 формат не читает. А именно этот и выложили.
Вот этот же лист, но в формате 97-2003. Проверьте.
Прикрепленные файлы:
Отчет_нов2.xls
20. nomad_irk 76 19.11.20 11:07 Сейчас в теме
(18) Такой формат - читает.
Но если ты не можешь повлиять на формат файла......
26. spacecraft 19.11.20 11:47 Сейчас в теме
(20) (24) можно скрипт для конвертации использовать.
Прикрепленные файлы:
conv.vbs
loop.cmd
29. user1088693 19.11.20 12:35 Сейчас в теме
(26) А чем скрипт лучше по сравнению с "ПолучитьCOMОбъект" и "Новый COMОбъект"?
33. spacecraft 19.11.20 13:09 Сейчас в теме
(29) скрипт переконвертирует xls в поддерживаемый формат для загрузки в последствии в табличный документ 1С.
А так как удобно. Мне проще работать уже с ТабДок.
user1088693; +1 Ответить
35. user1088693 19.11.20 13:16 Сейчас в теме
(33) А как вызвать этот скрипт? Что в коде 1С нужно написать?
47. nomad_irk 76 19.11.20 15:29 Сейчас в теме
(35)Да смысла в этом скрипте меньше, чем никакого.
Сразу откройте файл в самом EXCEL с помощью COM и работайте с ним.
37. SlavaKron 19.11.20 13:22 Сейчас в теме
(26) Проще уж сам экселевский ком-объект создать и сделать то же самое.
38. spacecraft 19.11.20 13:23 Сейчас в теме
(37) можно, но нативными средствами быстрее и надежнее.
А так, кому что проще.
39. SlavaKron 19.11.20 13:25 Сейчас в теме
(38) Ваш скрипт:
Const xlFrmt = -4143  ' Format Excel 2003 for Excel 2003
'Const xlFrmt = 56    ' Format Excel 2003 for Excel 2010 
with CreateObject("Excel.Application")
    .DisplayAlerts =False
    .WorkBooks.Open(WScript.Arguments(0)).SaveAs WScript.Arguments(0),xlFrmt
    .quit
end with
В чем нативность? Тот же ком-объект. Без установленного офиса работать не будет.
nomad_irk; +1 Ответить
40. spacecraft 19.11.20 13:26 Сейчас в теме
41. SlavaKron 19.11.20 13:27 Сейчас в теме
42. spacecraft 19.11.20 13:28 Сейчас в теме
(41) причем тут 1С?
vbs и Excel.
Если смущает слово нативность, замените на свое.
43. SlavaKron 19.11.20 13:29 Сейчас в теме
(42) То есть вы предлагаете интеркативно скрипт запускать? Не проще ли тогда в Экселе пересохранить?
44. spacecraft 19.11.20 13:32 Сейчас в теме
(43) в Excel тогда надо ручками заходить.
Тут же скрипт все файлы в папке переконвертирует.
Запускать не обязательно ручками. ЗапуститьПриложение можно же использовать.
46. nomad_irk 76 19.11.20 15:27 Сейчас в теме
(44)
в Excel тогда надо ручками заходить.

Зачем?

ExcelApp = Новый COMОбъект("Excel.Application");
ExcelApp.WorkBooks.Open("c:\file.xls", 0);

и не надо ничего пересохранять в какой-то другой формат EXCEL.
48. spacecraft 19.11.20 15:30 Сейчас в теме
(46) вопрос не читаем?
"Не проще ли тогда в Экселе пересохранить?"
50. nomad_irk 76 19.11.20 15:34 Сейчас в теме
(48)Вопрос изначально был: как вообще прочитать EXCEL-файл, чтобы меньше морочиться?
Ответ: читайте сразу с помощью EXCEL.
Но оратор Platonov.E намекнул, что можно и без использования COM обойтись. Оказалось, что не всегда, и для того, чтобы было всегда, вы предложили использовать некий скрипт для того, чтобы пересохранить файл в другом формате, который может быть прочитан нативно 1С с помощью ТабДок.Прочитать(*.xls).

Как выяснилось, внутри скрипта, предложенного вами, используется все тот же COMОбъккт("Excel.Application"), ну так и для чего весь это процесс "удаления гланд через задний проход"?
52. spacecraft 19.11.20 15:37 Сейчас в теме
(50) тут без комментариев. Не вижу смысла. Игнорируете прямой ответ на прямой вопрос.
54. nomad_irk 76 19.11.20 15:41 Сейчас в теме
(52)На какой вопрос? "Не проще ли тогда в Экселе пересохранить?"
Встречный вопрос: ЗАЧЕМ? для чего удалять гланды через задний проход, если можно просто тупо взять EXCEL и прочитать ЛЮБОЙ файл?
55. spacecraft 19.11.20 15:42 Сейчас в теме
(54) вы для начала с вопрос-ответ определитесь, кто что говорил.
56. nomad_irk 76 19.11.20 15:46 Сейчас в теме
(55)Я определился еще в (1)/(10)/(26), а вы?
45. nomad_irk 76 19.11.20 15:25 Сейчас в теме
(26)Т.е. из 1С использовать COMОбъект("Excel.Application") - это чушь и дичь, а вот из скрипта - это прям "тру"?
Хорошо.
51. spacecraft 19.11.20 15:35 Сейчас в теме
(45) тут несколько скользких моментов.
1. Я не говорил, что только так нужно.
2. Помимо получения соединения и коннектора дальше еще данные нужно вытаскивать так же.
3. Когда через OLE подключаемся из 1С, то много побочных эффектов возникает. Таких, как некорректное закрытие соединения. Оно может подвиснуть. Это особенно может быть заметно, когда делается много таких соединений.

Это было просто предложено как вариант, на высказывание: "Оно не читает *.xls, только *.xlsx.".
Я никого не заставляю это использовать.
53. nomad_irk 76 19.11.20 15:39 Сейчас в теме
(51)
1. Вы - нет, но вы активно поддерживаете способ чтения EXCEL-файла без использования EXCEL, даже не EXCEL, а целиком технологии COM.
2. Это уже OLE, который так же использует технологию COM для работы с собой.
3. Про OLE тут пока вообще речи не было. Было либо нативно 1С, либо EXCEL с помощью COM.
15. Attawa 19.11.20 10:20 Сейчас в теме
(11)
Формат читаемого файла, зависит от действия ПриВыбореФайла (процедура на форме) там как раз и указывается формат читаемого файла.

Лично я использую формат
ExcelApp = Новый COMОбъект("Excel.Application");
ExcelApp.WorkBooks.Open("c:\file.xls", 0);


И после обработки или исключения ExcelApp.Quit
19. user1088693 19.11.20 10:48 Сейчас в теме
(10) А чем можно воспользоваться в таком случае?
22. platonov.e 159 19.11.20 11:22 Сейчас в теме
24. user1088693 19.11.20 11:28 Сейчас в теме
(22) Вы написали: "Если у вас эксель с простым текстом без формул и картинок, рекомендую вообще не использовать ком объект"

Вы говорите, что не рекомендуете использовать COM объект для чтения Excel - файла. Вопрос, каким способом считывать тогда Excel-файл?
25. platonov.e 159 19.11.20 11:41 Сейчас в теме +0.2 $m
(24) Через табличный документ
user1088693; +1 Ответить
27. user1088693 19.11.20 12:20 Сейчас в теме
(25) Попробовал, спасибо! Но это работает только для управляемого приложения
30. platonov.e 159 19.11.20 12:35 Сейчас в теме
(27) Справка говорит обратное


ТабличныйДокумент (SpreadsheetDocument)
Прочитать (Read)
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер).
31. user1088693 19.11.20 12:42 Сейчас в теме
(30) Я так пробовал делать на обычном приложение 8.2, выдает ошибку: "Ошибка при выполнении файловой операции"

И там нет второго параметра в методе "Прочитать()"
32. platonov.e 159 19.11.20 12:53 Сейчас в теме
(31) Он появился в 8.3.4
user1088693; +1 Ответить
36. spacecraft 19.11.20 13:18 Сейчас в теме
(35) для 8.2 это бесполезно, там нет загрузки в табдок. Это нужно только для 8.3 когда сам формат не поддерживается.
user1088693; +1 Ответить
14. user623969_dusa 19.11.20 10:19 Сейчас в теме
(7) если действительно внимательно читать то можно увидеть что ПолучитьCOMОбъект
функциональнее
за счет
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора:
П = ПолучитьCOMОбъект( , "Excel.Application");
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel
...
и если знать другие языки программирование ключевое слово новый это создание объекта в памяти а не его получение
user1088693; +1 Ответить
21. user1088693 19.11.20 11:08 Сейчас в теме
(14) Можете привести пример, где лучше использовать "ПолучитьCOMОбъект", а где "Новый COMОбъект"?
8. alex_bob 246 19.11.20 10:05 Сейчас в теме
(7) Второй способ корректнее, хотя бы тем, что появляется возможность указать параметр для открытия только на чтение.

Ну и в первом и втором случае желательно делать через Попытка-Исключение.
user1088693; +1 Ответить
23. user1088693 19.11.20 11:23 Сейчас в теме
(8) Я правильно ли понимаю, что "Новый COMОбъект" нужен для того, чтобы только прочитать Excel, а "ПолучитьCOMОбъект" нужен для внесения данных в Excel-файл?
49. alex_bob 246 19.11.20 15:34 Сейчас в теме +0.25 $m
(23) Постановка вопроса не совсем правильная. "ПолучитьCOMОбъект" позволяет обращаться к довольно узкому классу COM-объектов, взаимодействующих с файлами. Кроме приложений Microsoft Office мне что-то больше ничего в голову не приходит. COM-объектов, не имеющих отношения к файлам, гораздо больше. Например ADODb или Regexp.
К таким объектам можно обратиться только через "Новый COMОбъект".
user1088693; +1 Ответить
58. user1088693 20.11.20 07:57 Сейчас в теме
(49) А ну все понял теперь эту разницу. "ПолучитьCOMОбъект" нужен для работы только с файлами, а "Новый COMОбъект" позволяет еще и взаимодействовать с другими объектами и системами (подключение к SQl-базе, Oracle и т.д.) Спасибо за проясненный ответ!
59. SlavaKron 20.11.20 08:40 Сейчас в теме
(58)
"ПолучитьCOMОбъект" нужен для работы только с файлами

Не всё так просто. Вот, например, создание объекта для работы с реестром:
СистемныйРеестр = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv");

Или объект для получения информации о локальных дисках:
	wbemFlagReturnImmediately = 16;
	wbemFlagForwardOnly = 32;

	ЛокальныйКомпьютер = ".";
	WMIАдрес  = "winmgmts:\\" + ЛокальныйКомпьютер + "\root\CIMv2";
	WMIСервис = ПолучитьCOMОбъект(WMIАдрес);
	оЭлементы = WMIСервис.ExecQuery(
		"SEL ECT * FR OM Win32_LogicalDisk",
		"WQL",
		wbemFlagReturnImmediately + wbemFlagForwardOnly);
Показать

Это в типовых конфигурациях. Как видите, никакого файла тут нет. Оба варианта, насколько я понимаю, могут быть реализованы и через Новый COMОбъект. Например, для работы с WMI средствами можно создать объект:
SWbemLocator = Новый COMОбъект("WbemScripting.SWbemLocator");
SWbemServices = SWbemLocator.ConnectServer();

Вообще практика использования ПолучитьCOMОбъект мало распространена, поэтому никто не может дать внятного ответа на ваш вопрос.
user1088693; +1 Ответить
60. user1088693 20.11.20 08:57 Сейчас в теме
(59) А какая у вас стоит платформа и какое приложение используете (управляемое или обычное)? То что у вас получилось вызвать "ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")"
61. SlavaKron 20.11.20 09:01 Сейчас в теме
(60) Только что проверил на обычном приложении – всё работает. Платформа 8.3.17, режим совместимости 8.2.16.
62. user1088693 20.11.20 09:18 Сейчас в теме
(61) Странно или я может чего то не понимаю до конца, но если я пишу:

ПолучитьCOMОбъект("WbemScripting.SWbemLocator")

то вызывается ошибка:
{Форма.Форма.Форма(28)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект)
по причине:
Ошибка получения объекта COM: Синтаксическая ошибка

А если делать через "Новый COMОбъект("WbemScripting.SWbemLocator")" - то создается нормально без ошибок
63. SlavaKron 20.11.20 09:33 Сейчас в теме
(62) Новый COMОбъект("WbemScripting.SWbemLocator") – альтернатива для ПолучитьCOMОбъект("winmgmts:\\.\root\CIMv2"), которую я привёл для того, чтобы указать на отсутствие четкого разграничения между двумя методами. Мне было бы интересно самому узнать, что такого умеет ПолучитьCOMОбъект, чего нельзя сделать с помощью Новый COMОбъект.
user1088693; +1 Ответить
66. sssss_aaaaa_2011 20.11.20 12:37 Сейчас в теме
Процитирую уже написанное в (34)
ПолучитьCOMОбъект() - для случаев, когда необходимо использовать уже запущенный экзмпляр ПО, обрабатывающий файлы определенного типа
Новый COMОбъект - для случаев, когда необходимо создание нового экземпляра ПО в ОЗУ машины для обработки файла определенного типа.
К файлам эти методы имеют очень опосредованное отношение и не надо путать тёплое с мягким.
Первый метод для подключения к уже имеющемуся/запущенному экземпляру, например Excel-я, с не важно какими отрытыми или не отрытыми файлами и получения управления этим экземпляром.
Второй создает новый экземпляр.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот