Что нового

Кириллица при общении с 1С через COM

Smarty

Новичок
Сообщения
11
Репутация
0
Пытаюсь обратиться к файловой базе 1С через COMConnector. Каким макаром передать название справочника в кириллице? AutoIt ругается...
Код:
$My1C = ObjCreate("V82.COMConnector")
$v8 = $My1C.Connect("File=""C:\path";Usr=""Username"";Pwd=""Password""")

$catalogs = $v8.Catalogs
$Materials = $catalogs.Номенклатура
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Может как-то так
Код:
$Materials = $catalogs&".Номенклатура"

Но я не уверен; это лишь предположение
 
Автор
S

Smarty

Новичок
Сообщения
11
Репутация
0
Yuriy, в таком виде AutoIt не ругается, но ничего не делает (не обращается к свойству "Номенклатура"). Проверка показывает, что $v8 по-прежнему указывает на СправочникиМенеджер, а не на СправочникМенеджер.Номенклатура.

Есть ещё идеи или пример работающего кода? Неужели никто не пробовал общаться с 1С через V82.COMConnector?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Ну а такое предположение?
Код:
$Materials = $catalogs.&"Номенклатура"

Или такое
Код:
$Nom = "Номенклатура"
$Materials = $catalogs.&$Nom


P/S
Вот эта строка смущает
Код:
$v8 = $My1C.Connect("File=""C:\path";Usr=""Username"";Pwd=""Password""")

Видишь зеленым выделено. В AutoIt это как комментарий.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Да, лучше конечно как нибудь так.
Код:
$sConnect='File="C:\path";Usr="Username";Pwd="Password"'
$v8 = $My1C.Connect($sConnect)

If Not @error And IsObj($v8) Then
	;;;;
	
	
Else
	Exit
	
EndIf


Если у Catalogs есть свойство имени (например name) то можно перечислить все имена в поисках Номенклатура - если найдется - можно продолжить рабоать с этим объектом.
 
Автор
S

Smarty

Новичок
Сообщения
11
Репутация
0
Насчёт строки в соединении, приношу извинения. Вручную правил, удаляя имя и пароль, внёс ошибку. В рабочем коде всё правильно. Соединение с базой устанавливается, вижу его в "Активных пользователях".

Варианты с ".&" не проходят по синтаксису:

D:\1C\AutoIt\Scripts\test.au3 (5) : ==> Missing separator character after keyword.:
$catalogs = $v8.Catalogs.&nom
$catalogs = $v8.Catalogs.&nom^ ERROR

Перебор справочников возможен, но выглядит это совершенно криво. Получается, что нужно перебирать справочники, документы, регистры... в общем, все-все-все объекты конфигурации! Бред... нужно обращаться к объекту по имени (которое, чёрт его побери, в кириллице)!
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А так?
Код:
$v8.Catalogs("Номенклатура")
 
Автор
S

Smarty

Новичок
Сообщения
11
Репутация
0
Этот вариант пробовал вторым. Первым был Catalogs["Номенклатура"] (так понимает сама 1С). Не катит:

Код:
D:\1C\AutoIt\Scripts\test.au3 (5) : ==> The requested action with this object has failed.:
$catalogs = $v8.Catalogs("?????????")
$catalogs = $v8.Catalogs("?????????")^ ERROR
>Exit code: 1    Time: 1.421
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Может обновитесь до последней beta.
Например работа с киррилицей не вызывает проблем в Excel
Такой код работает без ошибок:
Код:
#include <Excel.au3>
Local $oExcel = _ExcelBookNew()
$oExcel.Sheets("Лист1").Name="Проверка"

У вас сработает пример?
 
Автор
S

Smarty

Новичок
Сообщения
11
Репутация
0
С Excel всё работает. Разница между работой с объектами Excel и 1С состоит в том, что у Excel названия всех объектов, их свойств и методов - в латинице. Кириллица в Вашем примере встречается в аргументах метода, и это тоже не вызывает проблем.

С 1С ситуация другая. Есть объект Справочники, у него - алиас Catalogs. К нему добираемся без проблем. Дальше - справочники конфигурации, с русскими именами (которые выглядят, как свойства объекта). Вот я и ищу способ добраться до свойств и методов с русскими именами. Алиасов у них нет; как назвали объект в конфигурации, так к нему и нужно обращаться.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Smarty
У вас, к сожалению, ничего не получится. Эта DLL работает только в среде 1С.
---------------------------------
Smarty [?]
Я весьма успешно пользуюсь V82.COMConnector из-под Excel VBA
Ok, погорячился :scratch:

Smarty
Проверьте
Код:
$My1C = ObjCreate("V82.COMConnector")
$v8 = $My1C.Connect("File=C:\path;Usr=Username;Pwd=Password")

$catalogs = $v8.Catalogs
ConsoleWrite(IsObj($catalogs) & @CR) ; True ?
 
Автор
S

Smarty

Новичок
Сообщения
11
Репутация
0
У вас, к сожалению, ничего не получится. Эта DLL работает только в среде 1С.
Я весьма успешно пользуюсь V82.COMConnector из-под Excel VBA. В Сети немало материалов на эту тему. Вот, например.

Мне кажется, речь идёт исключительно о неспособности парсера AutoIt разбирать "русские" названия свойств и методов (или мою неспособность заставить его это делать).

Есть ли в AutoIt альтернативные способы обращения к свойствам и методам объектов, или только object.property, object.method() ?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Попробуйте так:
Код:
$My1C = ObjCreate("V82.COMConnector")
$v8 = $My1C.Connect("File=""C:\path""; Usr =""Username"";Pwd=""Password""")

$catalogs = $v8.Catalogs
$Materials = Execute('$catalogs.Номенклатура')

Но, в начале создайте новый документ в SciTE и смените кодировку с ANSI на UTF-8, потом вставьте код и попробуйте.
 
Автор
S

Smarty

Новичок
Сообщения
11
Репутация
0
Не помогло :( Execute возвращает пустую строку, в @error единичка.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Как я понял, Autoit вам нужен из-за GUI.
Тогда можно попробовать такой вариант
Можно написать функции на VBS (function.vbs), потом прочитать файл и вызывать функции из Autoit, передавая им параметры, а с результатом работать уже в Autoit :smile:


Добавлено:
Сообщение автоматически объединено:

Кстати попробуйте ещё такой вариант, правда не уверен что он будет успешным, но проблема именно в том, что Autoit не понимает киррилические атрибуты.
Код:
#include <Encoding.au3>
$My1C = ObjCreate("V82.COMConnector")
$v8 = $My1C.Connect("File=""C:\path""; Usr =""Username"";Pwd=""Password""")

$catalogs = $v8.Catalogs
$sNomen = _Encoding_CyrillicTo1251('Номенклатура')
$Materials = $catalogs.$sNomen
 
Автор
S

Smarty

Новичок
Сообщения
11
Репутация
0
Редкой силы порнография :( Скорее уж зафайлить bugreport и ждать лучших времён... Парсер подправить не так уж и сложно, IMHO.
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
А обращаться через какой-нибудь объект типа метаданные не пробовали? Чтобы была конструкция

Код:
catalogs("Товары").fields("Номенклатура").value


Чтобы имя реквизита, шло как параметр?
 
Автор
S

Smarty

Новичок
Сообщения
11
Репутация
0
Такая штука обламывается уже на этапе Catalogs("Товары"). У 1С есть глобальный объект Catalogs, у него свойства - имена справочников. Поэтому Catalogs.Товары, и никак иначе!
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
А что в 1с8 метаданных нет?


Добавлено:
Сообщение автоматически объединено:


Что-то типа:

http://1cprofi.com/content/view/4/40/

Код:
Реквизит = Метаданные.Справочник("ТМЦ").Реквизит("Артикул").Выбран(); 
Если Реквизит = 1 Тогда
   Сообщить("У справочника есть такой реквизит");
Иначе
   Сообщить("У справочника нет такого реквизита");
Конецесли;

Только на английском...
 
Верх