|   |   | 
| 
 | 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 сервисы | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |