Найти - Пользователи
Полная версия: импорт данных в программу на питоне из 1С
Начало » Автоматизация бизнеса » импорт данных в программу на питоне из 1С
1 2 3
pythonwin
Рижий
Люди а попробуйте через ОЛЕ достукатися до 1С - це Оле Сервер
код покажи, пожалуйста! :)
pythonwin
нашел в майл-рассылках
Руслан
Здравствуйте!

Помогите, пожалуйста, разобраться в следующей проблеме.

Ответ искал в документации, Гугле; не искал только в исходниках Питона.

Извините, если плохо искал и отнимаю Ваше время.
Надеюсь, Вас не затруднит/обидит повторить/напомнить не понятую мной
какую-либо прописную истину. ;-)

ДАНО

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"')
pythonwin
взято из http://itconnection.ru/pipermail/zopyrus/2005-November/081074.html
автор == Roman V. Kiseliov
AlexP74
Попытался я вникнуть в тему…
Но не могу решить одну проблему. Вот пример кода:

# -*- 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)
Хотя аналогичный код на делфи работает без проблем.
Lexander
Кодировка?
Попробуйте использовать англоязычные названия атрибутов для проверки.
AlexP74
Номер релиза печатает, а с FindByCode проблема. Ещё не могу понять, <COMObject <unknown>> - это нормально?

Номер релиза: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)
Lexander
AlexP74
<COMObject <unknown>> - это нормально?
Это нормально.
Например,
const = v7.Const
print(“const is:” + str(const))
тоже выведет <COMObject <unknown>>. Но при этом сработает код
ver = const.GetAttrib('НомерРелиза')
print(“ver is:”+ver)

А вот по поводу остального идей пока нет.
DcDr
AlexP74
Номер релиза печатает, а с FindByCode проблема.
Такие проблемы решаются часто так:

В глобальный модуль 1С добавляется функция “Функция FindForPython() Экспорт”, которая возвращает нужный Вам элемент справочника.
Через тот же вызов “НайтиПоКоду” (FindByCode). Разумеется, функция объявлена как “эспортируемая”.

Разница в том, что “СправочникТакойТо.НайтиПоКоду(”Какой-то код“) вызывается внутри самой 1С, а не через OLE/COM.

А через OLE/COM из внешнего приложения (в данном случае на Python написанного) вызывается вышеописанная глобальная функция 1С ”FindForPython()". Нередко делают несколько таких функций, что позволяет даже без передачи параметров обойтись (не всегда конечно возможно)
ak
У кого-нибудь получилось из python получить доступ к справочникам 1С 7.7 через COM-объекты?
pavlosh
ak
У кого-нибудь получилось из python получить доступ к справочникам 1С 7.7 через COM-объекты?
Если это вопрос типа “реализуемо ли это?”, то ответ однозначно _ДА_.
Мы это делали, но (предугадывая просьбовопрос :) ) поделиться know-how не смогу, так как парня (который непосредственно делал) у меня давно сманили, а в “боевой” код системы это не вошло (это был эксперимент).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB