Запуск русско-язычного кода 1С в Python

10.03.11

Интеграция - Внешние источники данных

Предлагается простой модуль Python для запуска кода 1С, содержащего кириллицу, в режиме внешнего соединения.

Язык Python, обладая богатейшей библиотекой готовых пакетов и имея довольно простой и приятный синтаксис, является удобным инструментом для автоматизации рутинных операций.

Несмотря на то, что в качестве кодировки скриптов может выступать Unicode, использование кириллицы в коде Python напрямую пока невозможно (исключение разве что консоль редактора IDLE).

Однако, кириллицу возможно использовать в коде cкриптов JavaScript и VBasic, входящих в поставку MS ScriptControl. Но возможности этих языков, на мой взгляд, скудны по сравнению с Python.

Далее предлагается простой модуль Python для запуска кода 1С, содержащего кириллицу, в режиме внешнего соединения с использованием MS ScriptControl.

Для запуска примера потребуется:

  1. Установленный 1С:Предприятие 8.1 или 8.2 (указываем в переменной ver)
  2. Интерпритатор Python
  3. Пакет pywin32
# -*- coding: utf-8 -*-

'''
py1c_wrapper.py
'''

import win32com.client

def connect_to_ib(Path,ver='82',User='',Password='',UC=''):
 '''
 Return MSScriptControl.ScriptControl object. Further code of 1C:Enterprise 8 should use
 infobase's object "ib", like

 ib.Метаданные.Версия;
 '''
 try:
 ScriptControl = win32com.client.Dispatch("MSScriptControl.ScriptControl")
 ScriptControl.Language = "javascript"
 con = '''
 var cntr = new ActiveXObject("V%s.COMConnector");
 var ib = cntr.Connect('File="%s"; Usr="%s";Pwd="%s";UC="%s"');''' % (ver, Path, User, Password,UC)
 ScriptControl.ExecuteStatement(con)
 return ScriptControl
 except Exception, val:
 print val
 return val

def Eval(code,ScriptControl):
 '''
 Evaluate and return result for one-line code (unicode) on JavaScript via MSScriptControl.
 '''
 try:
 return ScriptControl.Eval(code)
 except Exception, val:
 print val
 return val

def ExecuteStatement(code,ScriptControl):
 '''
 Execute statement (unicode) on JavaScript via MSScriptControl
 '''
 try:

 ScriptControl.ExecuteStatement(code)
 except Exception, val:
 print val


# протестируем
ver = '82'
Path = ur'D:\\bases\\clients\\clean\\accounting82'
User = u'admin'
Password = u'12345678'

sc = connect_to_ib(Path,ver,User,Password)
print u"Имя конфигурации: ", Eval(u"ib.Метаданные.Имя;",sc)
code = ur'''
function get_version(i)
{
return i.Метаданные.Версия;
}'''
ExecuteStatement(code,sc)
print u"Версия конфигурации:", Eval(u"get_version(ib)",sc)
 

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    22044    23    49    

39

Внешние источники данных Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 7.хх учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

24.04.2017    52054    104    165    

91

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

120000 руб.

19.08.2020    25924    25    1    

27

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

05.10.2022    11353    13    8    

15

Внешние источники данных Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Готовая интеграция для управляемых форм. Встраивается в вашу 1С как расширение. Реализует автоматический обмен данными между 1С (1С:Фитнес клуб и аналогов) и СКУД RusGuard, автоматизирует бизнес-процессы по созданию и учету сотрудников в СКУД. Значительно упрощает работу специалистов отдела кадров и отдела безопасности: избавляет от двойного ввода информации в 1С и СКУД.

94999 руб.

11.07.2024    1052    1    0    

3

Зарплата Внешние источники данных Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 организаций (далее Парус) в конфигурацию 1С:Зарплата и управление персоналом, ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

120000 руб.

07.06.2021    13499    2    3    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. NDM 713 16.03.11 11:26 Сейчас в теме
Python это тема!
На днях попробую воспользоваться вашим примером, спасибо за интересную тему.
2. metmetmet 82 28.11.11 13:00 Сейчас в теме
Круть! Давно хотел, да времени небыло!

Было бы еще хорошо, приведенный в статье листинг приерепить в виде готового файла.
3. cool.vlad4 2 28.11.11 13:08 Сейчас в теме
интересна обратная тема - использовать питон к 1С-е. Шикарно если в нативапи, под сервером. А использование 1С комконнектора - я думаю в любом языке примерно однотипно. Но за решение проблемы киррилицы +
4. quick 584 22.08.13 11:31 Сейчас в теме
Зачетное извращение! Получил неподдельное удовольствие читая код :)
5. zekrus 151 21.01.15 13:48 Сейчас в теме
Интересно, а кто нибудь пробовал сделать редактор кода python в 1с?
6. Vovan58 64 26.02.18 12:47 Сейчас в теме
А javascript зачем? Извратно.
7. Vovan58 64 08.03.18 12:16 Сейчас в теме
Может быть будет кому-то полезно (и чтобы самому не забыть:) ) :
import win32com.client
from datetime import date, datetime, timedelta
from json import dumps
from httplib import HTTPConnection
from urllib import urlencode

SERVER = "192.168.0.1"
URL = "/post/"
KEY="SecretKey"
days_upload=10
con_str = 'File="C:\\DB";Usr="com";Pwd="com"'

v82 = win32com.client.Dispatch("V82.COMConnector").Connect(con_str)

get = lambda obj,attr: getattr(obj, attr.encode('cp1251'))

d_start = date.today()-timedelta(days=days_upload)
d_end = date.today()

invoices = []
contractors = {}

sel = get(v82.Documents, u"СчетНаОплатуПокупателю").Select(d_start, d_end)

while sel.Next():
doc = sel.GetObject()
contr = get(doc,u"Контрагент")
if not get(contr, u'Код') in contractors:
c = {
'code': get(contr, u'Код'),
'name': get(contr, u"Наименование"),
}
contractors[c['code']] = c
dt = {
"number": doc.Number,
"date": "%s" % doc.Date,
"amount": get(doc, u"СуммаДокумента"),
"contr": get(contr, u"Код"),
"text": get(doc, u'Комментарий')
}
invoices.append(dt)

params ={"invoices": dumps(invoices), "contractors": dumps(contractors), "key":KEY}

con = HTTPConnection(SERVER)
con.request("POST", URL, urlencode(params))
r = con.getresponse()
print r.status, r.reason
f = open("response.html","w+")
f.write(r.read())
f.close()
con.close()
Показать
Оставьте свое сообщение