Имя: Пароль:
1C
1C 7.7
v7: Обращение по OLE из питона
, ,
0 KoBapeH
 
06.12.17
15:05
Вопрос к мэтрам некромантии: нужно из питона обратиться к справочнику бухгалтерии. Проблема возникает на стадии открытия выборки ВыбратьЭлементы(), либо SelectItems(). В питон возвращается следующая ошибка: "(-2147417851, 'Ошибка на сервере.', None, None)". Такую же ошибку возвращает метод ЗначениеИзСтрокиВнутр() - ValueFromStringInternal(). При этом сам объект справочника создаётся, да и по документам выборка отрабатывает нормально. Из самой 7.7 аналогичный код отрабатывает без проблем.
Насколько я понимаю, это проблема ActiveX, с которым так же работает и Excel. Никто с подобной проблемой не сталкивался, а если сталкивался, то есть ли возможность как-то это исправить? ОС - 7, 64 битная. Платформа 7.7 - 27 релиз. В реестре всё прописано, из-под админа 7.7 запускалась.
1 HawkEye
 
06.12.17
15:19
(0) пробуй SelectItems(1)
2 KoBapeH
 
06.12.17
15:21
Пробовал уже режим ему указывать. И с 0 и с 1 - результат один.
3 MadDAD
 
06.12.17
15:27
(2) А если через EvalExpr()? Чему равен объект справочника?
4 MadDAD
 
06.12.17
15:30
Еще вариант - может с кодировками беда? в 1С нужно строки  передавать в кодировке Win1251
5 asady
 
06.12.17
16:04
(0)
http://python.su/forum/topic/303/lofi/?page=2

посмотри туда
6 KoBapeH
 
06.12.17
17:03
(5) Да, проблема та же. Пробовал _FlagAsMethod, ноль реакции.
Если что, вот код


import win32com.client
# import comtypes.client

ole77 = None
try:
    # ole77 = comtypes.client.CreateObject("V77.Application")
    ole77 = win32com.client.Dispatch("V77.Application")
    comConnStr = "/d\"E:\\Base\\BUH NEW\\\" /n\"ad\""
    ole77.Initialize(ole77.RMTrade, comConnStr, "NO_SPLASH_SHOW")
except Exception as err:
    print("Не удалось подключиться к базе. Ошибка: " + err.__str__())

if ole77:
    ref_name = 'Справочник.Номенклатура'
    print("Выборка " + ref_name)
    try:
        refer = ole77.CreateObject(ref_name)
        # ole77._FlagAsMethod('SelectItems')
        refer.SelectItems(0)
        while refer.GetItem() == 1:
            string1 = ole77.ValueToStringInternal(refer)
            print("Получено -" + string1)
            new = ole77.ValueFromStringInternal(string1,)
            string2 = new.Наименование
            print("Вернул -" + string2)
    except Exception as err:
        print("Не удалось выбрать справочники. Ошибка: " + err.__str__())

    print("Получение объекта из строки")
    try:
        str_ole = "{\"B\",\"0\",\"0\",\"156\",\"0\",\"0\",\"3355\"}"
        objectDoc = ole77.ValueFromStringInternal(str_ole)
        print('Успех')
    except Exception as err:
        print("Не удалось получить объект из строки. Ошибка: " + err.__str__())
ole77 = None
7 KoBapeH
 
06.12.17
17:04
(3) Поподробнее можно. Что именно требуется?
8 Ёпрст
 
06.12.17
17:06
(6) соединение то хоть установлено ?
9 KoBapeH
 
06.12.17
17:06
(4) Так ведь режим для выборки не обязательный. Там ничего не передаётся. И если бы была проблема с кодировкой, то выборка по документам бы не работала.
10 Ёпрст
 
06.12.17
17:07
и хз за синтаксис питона, а чего не в двойных кавычках в
CreateObject пихаешь ?
11 KoBapeH
 
06.12.17
17:08
(8) Да, конечно. (10) Да там без разницы.
12 Ёпрст
 
06.12.17
17:08
почему не так, например ?
ref_name = "Справочник.Номенклатура"
13 Ёпрст
 
06.12.17
17:09
покажи код для документа, который работает у тебя
14 Ёпрст
 
06.12.17
17:10
ну и в базе, есть вообще, Справочник.Номенклатура хоть ?
Может та, Справочник.Товар ?
15 Сияющий в темноте
 
06.12.17
20:56
строки по OLE идут в юникоде,поэтому,работать должно,но непонятно,что питон может делать с переменными,семерка очень капризная
можно попробовать из питона создать VbScript,а уже из него лезть в 1с
16 MadDAD
 
07.12.17
08:56
(7) Что покажет

refer = ole77.EvalExpr('СоздатьОбъект("Справочник.Номенклатура")')