Имя: Пароль:
1C
1С v8
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 сервисы