|
Powershell и 1С через COM | ☑ | ||
---|---|---|---|---|
0
Necessitudo
07.05.15
✎
14:33
|
Добрый день! Хочу запросом через повершел вытянуть из 1С данные. Подключаюсь через com. Соединение проходит, но не пойму как создать запрос.
Код такой $obj = New-Object -ComObject V82.ComConnector $connect = $obj.Connect('srvr=as4;ref=ut10_vin;usr="Олег";pwd="123"') $query = $connect.NewObject("Запрос") Ругается на отсутствие метода NewObject. Нагуглил , что "Для "V81.COMConnector" павершелл находит библиотеку типов, поэтому для COMConnector позднее связывание можно использовать, а для COM-соединения уже фигушки - только ручками через рефлексию..." и примеры $cats = [System.__ComObject].InvokeMember("Справочники",[System.Reflection.BindingFlags]::GetProperty,$null,$connection,$null) $nod = [System.__ComObject].InvokeMember("НастройкиОбменаДанными",[System.Reflection.BindingFlags]::GetProperty,$null,$cats,$null) $fnd = [System.__ComObject].InvokeMember("НайтиПоНаименованию",[System.Reflection.BindingFlags]::InvokeMethod,$null,$nod,$ChangeName) $ref = [System.__ComObject].InvokeMember("Ссылка",[System.Reflection.BindingFlags]::GetProperty,$null,$fnd,$null) Примеры работы, но попытки создать именно запрос ни к чему не привели. Может кто знает как решить мою проблему? |
|||
1
Necessitudo
07.05.15
✎
14:34
|
Вот такое не работает -
$cats = [System.__ComObject].InvokeMember("Новый Запрос",[System.Reflection.BindingFlags]::GetProperty,$null,$connection,$null) |
|||
2
Serginio1
07.05.15
✎
14:49
|
Извращенцы
Вообще проще использовать Внешние отчеты. Сначала отлаживаешь под отладчиком и прочими приятностями, а затем вызываешь уже по ком БД.ОткрытьФормуМодально("Отчет",ПараметрыДляОтчета,ПутьКВнешнемуОтчету); Добавлю что V77.Application является внешним сервером автоматизации, а это значит что вызов происходит из другого процесса и соответственно все данные маршалицируются и сериализуются. При этом скорость каждого вызова выполняется очень медленно. Выводя весь код в обработку он выполняется в процессе сервера, что значительно быстрее. Кроме того 1С использует в запросах принцип замыкания (использование переменных процедуры, модуля итд). Так, что используя внешние отчеты упрощается тестирование, увеличивается скорость обработки, и увеличивается гибкость для запросов. Кроме того можно вычислять и произвольный код используя шаблон |
|||
3
Necessitudo
07.05.15
✎
14:52
|
А причем тут ole? Я ж через com хочу
|
|||
4
Serginio1
07.05.15
✎
15:11
|
А в чем разница между оле и сом?
Вообщето COM это поддержка интерфейса IUnknown. OLE уже iDispatch. OLE Automation — технология компании Microsoft, позволяющая обращаться к COM-объектам из интерпретаторов скриптовых языков, таких, как VBScript (на настоящий момент поддержка обращений к OA-объектам есть в Windows-версиях всех популярных скриптовых языков). |
|||
5
Serginio1
07.05.15
✎
15:14
|
Прошу прощеня, почудилась семерка. Но для восьмерки тоже проще использовать внешние отчеты например
http://forum-mista.pro/topic.php?id=722688#19 |
|||
6
Necessitudo
07.05.15
✎
15:31
|
(5) Там как раз все как у меня. Только в C# NewObject работает, а в повершелле нет. Я как раз же переписываю решение с си шарпа на повершелл.
|
|||
7
Serginio1
07.05.15
✎
15:36
|
Я тебе дал ссылку как проще работать через внешний отчет. Там кстати не C# а VB. Внешний отчет проще отлаживать.
|
|||
8
yukon
07.05.15
✎
16:03
|
$Query = [System.__ComObject].InvokeMember("NewObject", [System.Reflection.BindingFlags]::InvokeMethod, $null, $connection, "Запрос")
[System.__ComObject].InvokeMember("Text", [System.Reflection.BindingFlags]::SetProperty, $null, $Query, "select 1") $QueryResult = [System.__ComObject].InvokeMember("Execute", [System.Reflection.BindingFlags]::InvokeMethod, $null, $Query, $null) $QueryResultIsEmpty = [System.__ComObject].InvokeMember("IsEmpty", [System.Reflection.BindingFlags]::InvokeMethod, $null, $QueryResult, $null) $QueryResultIsEmpty |
|||
9
Necessitudo
07.05.15
✎
16:27
|
(8) Вот , спасибо огромнейшее!!!!!!
|
|||
10
Serginio1
07.05.15
✎
16:28
|
мыши плакали, кололись, но продолжали жрать кактус
|
|||
11
Necessitudo
07.05.15
✎
16:29
|
(10) Я же не спорю что ты прав - но мне в данном случае хочется сделать именно так:)
|
|||
12
yukon
08.05.15
✎
08:49
|
(10) В таком виде как (8) это полный изврат. Но стоит перенести все нагромождения в отдельные функции, и код становится вполне вменяемым:
$Query = Call-COMMethod $connection NewObject "Query" Set-COMProperty $Query Text "select 1" $QueryResult = Call-COMMethod $Query Execute |
|||
13
Serginio1
08.05.15
✎
10:18
|
(12) Я это прекрасно понимаю, но даже программируя на динамиках, все равно лучше использовать внешние отчеты.
А еще лучше прямой доступ к SQL |
|||
14
yukon
08.05.15
✎
10:22
|
(13) > А еще лучше прямой доступ к SQL
Проще да, но не лучше. |
|||
15
Serginio1
08.05.15
✎
10:31
|
(14) Обоснуй
|
|||
16
yukon
08.05.15
✎
10:58
|
(14)
"проще" - зачем заморачиваться и писать нормально API для отчетов, зафигачим прямой доступ к таблицам, благо любой внешний составитель отчетов умеет подключаться к SQL. "не лучше" - начнем с нарушения лиц.соглашения, затем необходимость добавлять (и администрировать) отдельного SQL пользователя, отслеживать структуру БД (добавили поле в SQL-запрос, через год в 1С добавили ему "Удалить", а через год удалили и узнали что уже два года отчет показывает херню) и т.д. |
|||
17
MM
08.05.15
✎
11:08
|
(15) Структура может меняться в разных версиях платформы. При записи есть риск повредить данные, если не учесть составные структуры (итоги, агрегаты).
|
|||
18
Serginio1
08.05.15
✎
15:18
|
(17) Я использовал из 1С запись в регистры сведений используя Merge. Разница по скорости при работе с миллионными прайсами такая, что ...
Но в основном нужно чтение, а то что без чтения лучше организовывать через Web или HTTP сервисы |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |