Рижийкод покажи, пожалуйста! :)
Люди а попробуйте через ОЛЕ достукатися до 1С - це Оле Сервер
Рижийкод покажи, пожалуйста! :)
Люди а попробуйте через ОЛЕ достукатися до 1С - це Оле Сервер
Руслан————————————————–
Здравствуйте!
Помогите, пожалуйста, разобраться в следующей проблеме.
Ответ искал в документации, Гугле; не искал только в исходниках Питона.
Извините, если плохо искал и отнимаю Ваше время.
Надеюсь, Вас не затруднит/обидит повторить/напомнить не понятую мной
какую-либо прописную истину. ;-)
ДАНО
0)
Официальная сборка Python-2.4.2 для Windows
Официальная сборка PyWin32-2.04
Неофициальная сборка ;-) WindowsXP-SP2
В sitecustomize.py вот что:
——————————————————–
#!/usr/bin/env python
# -*- coding: windows-1251 -*-
import sys
sys.setdefaultencoding('windows-1251')
——————————————————–
1)
Приходится работать с 1С-8 с помощью Python.
Работаю так:
# -*- coding: windows-1251 -*-
# Copyright (C) 2005 Kiseliov Roman
from win32com.client import Dispatch
import pythoncom
def rename_monitors(V8):
query = V8.NewObject("Query")
sql = """ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Код,
Номенклатура.Родитель.Код,
Номенклатура.Родитель.Родитель.Код
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И Номенклатура.Родитель.Родитель.Родитель.Код = 511
И (Номенклатура.Наименование ПОДОБНО "%MONITOR%" ИЛИ Номенклатура.Наименование ПОДОБНО "%Монитор%")
"""
query.Text = sql
result = query.Execute()
table = result.Unload()
total_rows = len(table)
for rownum, row in enumerate(table):
ref, code, parent_code, parent_parent_code = row
obj = ref.GetObject()
name = ' '.join(getattr(obj, u"Наименование").split())
name = name.replace("MONITOR ", " ")
second_hand = False
if "*" == name[0]:
second_hand = True
name = name[1:]
if parent_parent_code == 61861 and u"Монитор " not in name:
name = u"Монитор ЖК " + name
elif parent_parent_code == 70384 and u"Монитор " not in name:
name = u"Монитор ЭЛТ " + name
if second_hand:
name = "*" + name
setattr(obj, u"Наименование", name)
setattr(obj, u"ДлинноеНаименование", name)
obj.Write()
print "progress: %s/%s, current code: %s" % (rownum + 1, total_rows, code)
def main():
try:
try:
V8 = Dispatch("V8.Application")
V8.Connect('File="c:/infobase/";Usr="Киселев Роман"')
print V8.UserFullName()
rename_monitors(V8)
except pythoncom.com_error, (hr, msg, exc, arg):
print "V8.Application operation failed with code %d: %s" % (hr, msg)
if exc is None:
print "There is no extended error information"
else:
wcode, source, text, helpFile, helpId, scode = exc
print "The source of the error is", source
print "The error message is", text
print "More info can be found in %s (id=%d)" % (helpFile, helpId)
finally:
V8 = None
if __name__ == "__main__":
main()
Русланпри этом для аутентификации с паролем можно использовать код:
Обратите внимание на setattr/getattr для обращения к полям с русскими именами.
По другому(obj.Наименование – не противоречит грамматике, может быть только лексике)
не сумел: Питон говорит, что он видит SyntaxError
2)
Сеанс с IDLE:
——————————————————————————
Python 2.4.2 (#67, Sep 28 2005, 12:41:11) on win32
Type “copyright”, “credits” or “license()” for more information.
****************************************************************
Personal firewall software may warn about the connection IDLE
makes to its subprocess using this computer's internal loopback
interface. This connection is not visible on any external
interface and no data is sent to or received from the Internet.
****************************************************************
IDLE 1.1.2
>>> г =1
>>> г
1
>>> г + 2
3
>>> class Класс:
pass
>>> к = Класс()
>>> к
<__main__.Класс instance at 0x00B0C918>
>>> к.г = 1
>>> к.г
1
>>>
——————————————————————————–
Обратите внимание: здесь Питон не против русских имен.
ВОПРОС
Как добиться в исходнике 1) такого же эффекта, как в сеансе 2) в смысле русских имен?
Заранее спасибо!
С уважением,
Роман
con1 = c1.Connect('File="D:/distr/1N";Usr="Director";Pwd="1"')
# -*- coding: cp1251 -*-
import win32com.client
v7 = win32com.client.Dispatch("V77S.Application")
result = v7.Initialize(v7.RMTrade, "/D\\\\server\\base$\\ /nXXXXXX", "NO_SPLASH_SHOW")
if result:
print (u"Номер релиза:" + v7.Const.GetAttrib('НомерРелиза'))
sprSklad = v7.CreateObject("Reference.МестаХранения")
print (sprSklad)
sprSklad.FindByCode(23,0)
v7 = 0
File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 501, in
__getattr__
ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
pywintypes.com_error: (-2147417851, 'Ошибка на сервере.', None, None)
Номер релиза:7.70.012
<COMObject <unknown>>
Traceback (most recent call last):
File "E:\work\1c\запрос\1c.py", line 26, in <module>
sprSklad.FindByCode(23,0)
File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 501, in
__getattr__
ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
pywintypes.com_error: (-2147417851, 'Ошибка на сервере.', None, None)
AlexP74Это нормально.
<COMObject <unknown>> - это нормально?
AlexP74Такие проблемы решаются часто так:
Номер релиза печатает, а с FindByCode проблема.
akЕсли это вопрос типа “реализуемо ли это?”, то ответ однозначно _ДА_.
У кого-нибудь получилось из python получить доступ к справочникам 1С 7.7 через COM-объекты?