Вызов функций 1С с помощью Com-соединения
Всем привет, пишу программу на яп python, очень нужно вызвать процедуру 1С с помощью com-соединения. Нужно написать что то на подобие вот такого (да, данные строки относятся именно к запросу, взял как пример):
Нужно вызвать процедуру, которая экспортная и с внешним соединением. Помогите пожалуйста
name1 = getattr(v83.ОбновлениеИнформационнойБазыСлужебный,u"ЗаписатьПодтверждениеЛегальностиПолученияОбновлений")
q = "ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()"
query = v83.NewObject("Query", q)
X = name1.Execute().Choose()
Нужно вызвать процедуру, которая экспортная и с внешним соединением. Помогите пожалуйста
По теме из базы знаний
Найденные решения
(5)
win32com.client.Dispatch("V83.COMConnector") --вот это коннектор к базам данных, Ком-объект может подключаться к разным БД, аналогия с подключением к разным SQL серверам через один драйвер.
Поключение = коннектор.Connect(строка подключения) - возвращает нам уже целевой объект работы с конкретной БД, указанной в строке подключения. Этот объект содержит все методы и данные этой БД.
Подлючение.Имя_чего_то_там - здесь то, что идет после точки будет анализироваться каким то менеджером имен глобального контекста - все объекты, доступные в глобальном контексте исполнения в среде 1СПредприятия. Как то - все общие модули, все менеджеры прикладных объектов и т.д. Т.е. у этого менеджера есть таблица соответствий имени и объекта, облсуживающего это имя. Объекты общих модулей доступны непосредственно в глобальном контексте по своему имени, а следовательно через Подключение.ИмяМоегоМодуля
Дальше у объектов общих модулей извне доступны только экспортные методы. Т.е. через Подключение.ИмяМоегоМодуля.ИмяМоегоМетода()
Тут грамматический вопрос - как компилятор Пайтона будет компилировать конструкцию метода написанного в его коде на код, принимаемый для анализа v83? Т.к. в общем случае у объектов 1С могут быть и данные и методы с одним и тем же именем и различаются они по наличию или отсутсвию () в конце.
Т.е. МойОбъект.МоиДанные - это реквизит, а МойОбъект.МоиДанные() - это метод.
давайте рассчитывать что пайтон придерживается таких же грамматических правил, тогда () в конце метода обязательно.
Далее ЗаписатьПодтверждениеЛегальностиПолученияОбновлений() - это процедура - она не возвращает ничего, поэтому вряд ли надо пытаться получить результат этого выполнения, но да, может сгенерировать исключение которое передаст на обработку объекту v83, а вот как уже с этим исключением коннектора будет дальше взаимодействовать пайтон, не знаю.
Если что пишите в личку, разберемся.
win32com.client.Dispatch("V83.COMConnector") --вот это коннектор к базам данных, Ком-объект может подключаться к разным БД, аналогия с подключением к разным SQL серверам через один драйвер.
Поключение = коннектор.Connect(строка подключения) - возвращает нам уже целевой объект работы с конкретной БД, указанной в строке подключения. Этот объект содержит все методы и данные этой БД.
Подлючение.Имя_чего_то_там - здесь то, что идет после точки будет анализироваться каким то менеджером имен глобального контекста - все объекты, доступные в глобальном контексте исполнения в среде 1СПредприятия. Как то - все общие модули, все менеджеры прикладных объектов и т.д. Т.е. у этого менеджера есть таблица соответствий имени и объекта, облсуживающего это имя. Объекты общих модулей доступны непосредственно в глобальном контексте по своему имени, а следовательно через Подключение.ИмяМоегоМодуля
Дальше у объектов общих модулей извне доступны только экспортные методы. Т.е. через Подключение.ИмяМоегоМодуля.ИмяМоегоМетода()
Тут грамматический вопрос - как компилятор Пайтона будет компилировать конструкцию метода написанного в его коде на код, принимаемый для анализа v83? Т.к. в общем случае у объектов 1С могут быть и данные и методы с одним и тем же именем и различаются они по наличию или отсутсвию () в конце.
Т.е. МойОбъект.МоиДанные - это реквизит, а МойОбъект.МоиДанные() - это метод.
давайте рассчитывать что пайтон придерживается таких же грамматических правил, тогда () в конце метода обязательно.
Далее ЗаписатьПодтверждениеЛегальностиПолученияОбновлений() - это процедура - она не возвращает ничего, поэтому вряд ли надо пытаться получить результат этого выполнения, но да, может сгенерировать исключение которое передаст на обработку объекту v83, а вот как уже с этим исключением коннектора будет дальше взаимодействовать пайтон, не знаю.
Если что пишите в личку, разберемся.
(1) знаете, что самое интересное? Принципиально то все работает.
Создал расширение с общим модулем мод1 и там процедуру Мод2(), в которой вызывается:
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()
В коде python:
И все отработало.
Единственное предположение, это длина наименования модуля и/или процедуры. Возможно просто отсекается и из-за этого не находится.
Создал расширение с общим модулем мод1 и там процедуру Мод2(), в которой вызывается:
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()
В коде python:
import pythoncom
import win32com.client as win32
con_str = f'{place};Usr={Usr}'
pythoncom.CoInitialize()
V83 = win32.Dispatch("V83.COMConnector").Connect(con_str)
V83.мод1.Mod2()
ПоказатьИ все отработало.
Единственное предположение, это длина наименования модуля и/или процедуры. Возможно просто отсекается и из-за этого не находится.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(17)
Некоторые написанные строки, просто попытки добиться нужного результата
Некоторые написанные строки, просто попытки добиться нужного результата
con_str = f'{place};Usr={Usr};Pwd={Pwd};'
out = {}
global v83
v83 = None
# pythoncom.CoInitialize()
v83 = win32com.client.Dispatch("V83.COMConnector")
v83.Connect(con_str)
try:
try:
print(v83.ТекущаяДата)
v83.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()
Modul = v83.Метаданные
Model = Modul.ОбщиеМодули
name1 = getattr(v83.ОбновлениеИнформационнойБазыСлужебный, u"ЗаписатьПодтверждениеЛегальностиПолученияОбновлений")
q = "ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()"
query = v83.NewObject("Query", q)
X = name1.Execute
except Exception as e:
print(e)
pass
name = getattr(v83.ОбщегоНазначенияКлиентСервер, u"ИмяCOMСоединителя")
name1 = getattr(v83.ОбновлениеИнформационнойБазыСлужебный, u"ЗаписатьПодтверждениеЛегальностиПолученияОбновлений")
# getattr(v83.ОбновлениеИнформационнойБазы, u"ОбщегоНазначенияКлиентСервер.ВыполнитьОбновлениеИнформационнойБазы()")
# getattr(v83.ОбновлениеИнформационнойБазыСлужебный, u"ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()")
v83 = None
except Exception as e:
pass
Показать
(18) накидали все что могли?
#coding=cp1251
import pythoncom
import win32com.client
con_str = f'{place};Usr={Usr};Pwd={Pwd};'
pythoncom.CoInitialize()
V83 = win32com.client.Dispatch("V83.COMConnector").Connect(con_str)
v83module = getattr(V83, u"ОбновлениеИнформационнойБазыСлужебный")
v83method = getattr(v83module, u"ЗаписатьПодтверждениеЛегальностиПолученияОбновлений")
v83method()
Показать
(19)
К сожалению, данный код также выдал ошибку "TypeError("'NoneType' object is not callable")". Ошибка происходит на строке "v83method()"
pythoncom.CoInitialize()
V83 = win32com.client.Dispatch("V83.COMConnector").Connect(con_str)
v83module = getattr(V83, u"ОбновлениеИнформационнойБазыСлужебный")
v83method = getattr(v83module, u"ЗаписатьПодтверждениеЛегальностиПолученияОбновлений")
v83method()
V83 = win32com.client.Dispatch("V83.COMConnector").Connect(con_str)
v83module = getattr(V83, u"ОбновлениеИнформационнойБазыСлужебный")
v83method = getattr(v83module, u"ЗаписатьПодтверждениеЛегальностиПолученияОбновлений")
v83method()
К сожалению, данный код также выдал ошибку "TypeError("'NoneType' object is not callable")". Ошибка происходит на строке "v83method()"
(25) Вопрос не в кодировке, если сделаете запрос к атрибуту - все проходит. крашится на запросе к методу ком-объекта. Ощущение что у ком-объекта не существует методов, доступных конструкцией .ИмяМетода(аргументы). Ощущение, что их надо доставать другой грамматической конструкцией Ну, такая гипотеза.
А реквизиты достаются через Ком.МойРеквизит нормально
А реквизиты достаются через Ком.МойРеквизит нормально
(30)
Вот например подсчёт активных пользователей в системе и оно корректно работает.
Вот например подсчёт активных пользователей в системе и оно корректно работает.
con_str = f'{place};Usr={Usr};Pwd={Pwd};'
out = {}
global v83
v83 = None
pythoncom.CoInitialize()
try:
v83 = win32com.client.Dispatch("V83.COMConnector").Connect(con_str)
Users = v83.GetInfoBaseConnections()
CountUsr = Users.Count()
countses = 0
logs.Text("Информация об активных пользователях:" + "\n")
for i in range(CountUsr):
SesNum = getattr(Users[i], "SessionNumber").__int__()
if SesNum > 0:
countses += 1
PCUs = getattr(Users[i], "User")
logs.Text("Имя пользователя: " + getattr(PCUs, "Name"))
logs.Text("Номер соединения: " + SesNum.__str__())
logs.Text("Приложение: " + getattr(Users[i], "ApplicationName").__str__())
Показать
(35)да я просто преположил, что вызов модулей происходит по другому, каким то методом Ком-объекта самого питона.
Т.е. допустим ком-объект в питоне это объект прежде всего в питоне и он возможно наследует методы объектов родителей питона и там что топодобное есть....
.Execute() это была импровизация)
Т.е. допустим ком-объект в питоне это объект прежде всего в питоне и он возможно наследует методы объектов родителей питона и там что топодобное есть....
.Execute() это была импровизация)
(37)зафиксируем. Методы самого v83.AnyMethod() - доступны такой конструкцией
Атрибуты v83.AnyAttribute.AnyAttribute - тоже
методы v83.AnyAttribute.Method() - этой грамматической конструкцией вызывают ошибку, но не вызывают если v83.AnyAttribute.Method - но и не возвращают ничего.
Атрибуты v83.AnyAttribute.AnyAttribute - тоже
методы v83.AnyAttribute.Method() - этой грамматической конструкцией вызывают ошибку, но не вызывают если v83.AnyAttribute.Method - но и не возвращают ничего.
(1) знаете, что самое интересное? Принципиально то все работает.
Создал расширение с общим модулем мод1 и там процедуру Мод2(), в которой вызывается:
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()
В коде python:
И все отработало.
Единственное предположение, это длина наименования модуля и/или процедуры. Возможно просто отсекается и из-за этого не находится.
Создал расширение с общим модулем мод1 и там процедуру Мод2(), в которой вызывается:
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()
В коде python:
import pythoncom
import win32com.client as win32
con_str = f'{place};Usr={Usr}'
pythoncom.CoInitialize()
V83 = win32.Dispatch("V83.COMConnector").Connect(con_str)
V83.мод1.Mod2()
ПоказатьИ все отработало.
Единственное предположение, это длина наименования модуля и/или процедуры. Возможно просто отсекается и из-за этого не находится.
(44)
Мы тоже пришли к некоторым выводам. По итогу создал пустую базу и там создал модуль и в нём процедуру. Результат таков, из питона кириллицей модуль вызывается, а вот метод уже нет. Метод вызывается только латиницей, а там символов уж точно не так много))))
Дак, а процедура у Вас Мод2 или Mod2. В коде латиница вы написали кириллицу.
Мы тоже пришли к некоторым выводам. По итогу создал пустую базу и там создал модуль и в нём процедуру. Результат таков, из питона кириллицей модуль вызывается, а вот метод уже нет. Метод вызывается только латиницей, а там символов уж точно не так много))))
Дак, а процедура у Вас Мод2 или Mod2. В коде латиница вы написали кириллицу.
(46)
Проблема в том, что данный скрипт должен работать автоматически с большим количеством баз и для каждой делать расширение, оно того не стоит. Я уже думал про внешнюю обработку, но там тоже не всё так просто, так как при открытие внешней обработки вылезает предупреждение безопасности, которое может отключить только пользователь, но никак не скрипт. Так что увы, внешняя обработка точно не подойдёт, да и расширение скорее всего также
Проблема в том, что данный скрипт должен работать автоматически с большим количеством баз и для каждой делать расширение, оно того не стоит. Я уже думал про внешнюю обработку, но там тоже не всё так просто, так как при открытие внешней обработки вылезает предупреждение безопасности, которое может отключить только пользователь, но никак не скрипт. Так что увы, внешняя обработка точно не подойдёт, да и расширение скорее всего также
(48)
Это вопрос к уровню доступа пользователей. А скрипт будет заходить под разными пользователями в разных ИБ. Данные настройка пользователей жёстко регламентированы и просто так разрешить выключить эту галочку для внешней обработки вряд ли кто-то позволит, увы. Остаётся довольствоваться тем, что есть, увы)
Это вопрос к уровню доступа пользователей. А скрипт будет заходить под разными пользователями в разных ИБ. Данные настройка пользователей жёстко регламентированы и просто так разрешить выключить эту галочку для внешней обработки вряд ли кто-то позволит, увы. Остаётся довольствоваться тем, что есть, увы)
(47) заменить python на что-то другое не вариант?
К примеру, на OneScript.
Там все должно отрабатывать правильно.
И код простой:
К примеру, на OneScript.
Там все должно отрабатывать правильно.
И код простой:
Соединитель = Новый COMОбъект("V83.COMConnector");
Соединение = Соединитель.connect(con_str);
Соединение.ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений();
За вызов функций общих модулей уж точно не объект "Query" отвечает, у него в конструктор поступает текст своего языка запросов 1С.
Не знаю что у вас за объект v83, но допустим это подключение и тогда ваш код будет примерно таким:
Не знаю что у вас за объект v83, но допустим это подключение и тогда ваш код будет примерно таким:
v83.ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений();
(2)
Спасибо большое за помощь!
Да, V83 это коннектор. При выполнении вашего кода ошибка "TypeError("'NoneType' object is not callable")"
Ну и как я писал выше, предоставленный код в вопросе это просто пример)
v83.ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений();
Спасибо большое за помощь!
Да, V83 это коннектор. При выполнении вашего кода ошибка "TypeError("'NoneType' object is not callable")"
Ну и как я писал выше, предоставленный код в вопросе это просто пример)
(4)
Ого, в таком случае, это многое меняет.
Не могли бы помочь, что именно исправить и как, что бы оно работало, получается, просто убрать Connect(con_str)?
е по
Ого, в таком случае, это многое меняет.
con_str = f'{place};Usr={Usr};Pwd={Pwd};'
out = {}
global v83
v83 = None
# pythoncom.CoInitialize()
v83 = win32com.client.Dispatch("V83.COMConnector").Connect(con_str)
try:
try:
n = v83.ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений
Modul = v83.Метаданные
Model = Modul.ОбщиеМодули
name1 = getattr(v83.ОбновлениеИнформационнойБазыСлужебный,u"ЗаписатьПодтверждениеЛегальностиПолученияОбновлений")
q = "ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()"
query = v83(Model, q)
X = n.Execute()
except Exception as e:
ПоказатьНе могли бы помочь, что именно исправить и как, что бы оно работало, получается, просто убрать Connect(con_str)?
(5)Сам я так то штукатур и пайтон первый раз вижу, но в общем давай попробуем:
con_str = f'{place};Usr={Usr};Pwd={Pwd};'
out = {}
global v83
v83 = None
# pythoncom.CoInitialize()
v83 = win32com.client.Dispatch("V83.COMConnector").Connect(con_str)
try:
v83.ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()
except Exception as e:
Показать
(5)
win32com.client.Dispatch("V83.COMConnector") --вот это коннектор к базам данных, Ком-объект может подключаться к разным БД, аналогия с подключением к разным SQL серверам через один драйвер.
Поключение = коннектор.Connect(строка подключения) - возвращает нам уже целевой объект работы с конкретной БД, указанной в строке подключения. Этот объект содержит все методы и данные этой БД.
Подлючение.Имя_чего_то_там - здесь то, что идет после точки будет анализироваться каким то менеджером имен глобального контекста - все объекты, доступные в глобальном контексте исполнения в среде 1СПредприятия. Как то - все общие модули, все менеджеры прикладных объектов и т.д. Т.е. у этого менеджера есть таблица соответствий имени и объекта, облсуживающего это имя. Объекты общих модулей доступны непосредственно в глобальном контексте по своему имени, а следовательно через Подключение.ИмяМоегоМодуля
Дальше у объектов общих модулей извне доступны только экспортные методы. Т.е. через Подключение.ИмяМоегоМодуля.ИмяМоегоМетода()
Тут грамматический вопрос - как компилятор Пайтона будет компилировать конструкцию метода написанного в его коде на код, принимаемый для анализа v83? Т.к. в общем случае у объектов 1С могут быть и данные и методы с одним и тем же именем и различаются они по наличию или отсутсвию () в конце.
Т.е. МойОбъект.МоиДанные - это реквизит, а МойОбъект.МоиДанные() - это метод.
давайте рассчитывать что пайтон придерживается таких же грамматических правил, тогда () в конце метода обязательно.
Далее ЗаписатьПодтверждениеЛегальностиПолученияОбновлений() - это процедура - она не возвращает ничего, поэтому вряд ли надо пытаться получить результат этого выполнения, но да, может сгенерировать исключение которое передаст на обработку объекту v83, а вот как уже с этим исключением коннектора будет дальше взаимодействовать пайтон, не знаю.
Если что пишите в личку, разберемся.
win32com.client.Dispatch("V83.COMConnector") --вот это коннектор к базам данных, Ком-объект может подключаться к разным БД, аналогия с подключением к разным SQL серверам через один драйвер.
Поключение = коннектор.Connect(строка подключения) - возвращает нам уже целевой объект работы с конкретной БД, указанной в строке подключения. Этот объект содержит все методы и данные этой БД.
Подлючение.Имя_чего_то_там - здесь то, что идет после точки будет анализироваться каким то менеджером имен глобального контекста - все объекты, доступные в глобальном контексте исполнения в среде 1СПредприятия. Как то - все общие модули, все менеджеры прикладных объектов и т.д. Т.е. у этого менеджера есть таблица соответствий имени и объекта, облсуживающего это имя. Объекты общих модулей доступны непосредственно в глобальном контексте по своему имени, а следовательно через Подключение.ИмяМоегоМодуля
Дальше у объектов общих модулей извне доступны только экспортные методы. Т.е. через Подключение.ИмяМоегоМодуля.ИмяМоегоМетода()
Тут грамматический вопрос - как компилятор Пайтона будет компилировать конструкцию метода написанного в его коде на код, принимаемый для анализа v83? Т.к. в общем случае у объектов 1С могут быть и данные и методы с одним и тем же именем и различаются они по наличию или отсутсвию () в конце.
Т.е. МойОбъект.МоиДанные - это реквизит, а МойОбъект.МоиДанные() - это метод.
давайте рассчитывать что пайтон придерживается таких же грамматических правил, тогда () в конце метода обязательно.
Далее ЗаписатьПодтверждениеЛегальностиПолученияОбновлений() - это процедура - она не возвращает ничего, поэтому вряд ли надо пытаться получить результат этого выполнения, но да, может сгенерировать исключение которое передаст на обработку объекту v83, а вот как уже с этим исключением коннектора будет дальше взаимодействовать пайтон, не знаю.
Если что пишите в личку, разберемся.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот