OLE и 1С Поможет кто?
Select messages from
# through # FAQ
[/[Print]\]

-> Программирование в БЭСТ-4

#1: OLE и 1С Поможет кто? Author: GVALocation: Gaponenko PostPosted: 28 Sep 2005 20:07
    —
В Фоксе импортирую документы в 1с примерно по такой схеме:
V77 = CREATEOBJECT('V1CEnterprise.Application')
tt = V77.Initialize(V77.RMTrade, '/D' +lcBaza+' /NЭкспортер /P', 'NO_SPLASH_SHOW')
Tovar = V77.EvalExpr('CreateObject("Справочник.номенклатура")')
или
DOC = goV77.CreateObject("Документ.ПоступлениеТМЦ")

обратите внимание на "." как разделитель свойств объекта.

Аналогичный код в Harbor вызывает ошибку компиляции "." - недопустимый символ.

По примеру из Helpa вызова EXEL заменяю "." на ":", но тогда 1с не воспринимает команд.
А на V77:CreateObject("Справочник.номенклатура") вообще вываливается из модуля SCLAD.
Как правильно записать обращение к свойствам объекта?


Last edited by GVA on 05 Oct 2005 18:08; edited 2 times in total

#2:  Author: nordkLocation: Горбунов Константин PostPosted: 28 Sep 2005 20:24
    —
с 1С не экспериментировал
Нужно использовать ":" - это так
Попробуйте
V77:EvalExpr('CreateObject(Hb_OemToAnsi("Справочник.номенклатура"))')

Скажите результат плз

#3: Harbor на OEM Author: GVALocation: Gaponenko PostPosted: 28 Sep 2005 23:49
    —
Идея совершенно правильная. По крайней мере
ll:=V77:Initialize(goV77:RMTrade, '/D' +lcBaza+HB_oemtoansi(' /NЭкспортер /P'), 'NO_SPLASH_SHOW')
теперь отрабатывает корректно.
А вот вызов справочников и документов никак пока не дается. Буду экспериментировать дальше.
В описаловках к OEM обмену везде фигурирует как ключевая фраза:
"все вызовы осуществляйте в английской нотации"
Так что осталось либо нащупать где ставить конвертацию, либо переписать вызовы именно не по русски, чтобы в принципе снять проблему.

#4: Строка? Author: GVALocation: Gaponenko PostPosted: 29 Sep 2005 02:17
    —
Понятно что метод CreateObject() вызывается, но в качестве параметра у него символьная строка причем записанная в ANSI. Но я никак не могу методом "инженерного тыка" нащупать правильный вариант.

#5:  Author: Балуев МаксимLocation: Балуев PostPosted: 29 Sep 2005 17:26
    —
Писал я как-то печать ценников в 1с (до FastReport). Может поможет разобраться.

Code:

Function PrnCennik()
Private oApp, nCol, nRow, oTabl, sStr, oInputField, oSection
DbPush("aZebra",,"Ins")
aZebra->(DbGoTop())
If aZebra->(!Eof())
  TRY
    oApp := CreateObject("V77.Application")
  CATCH
    Alert("Программа 1С не доступена!")
    DbPop()
    Return
  END
 
  oApp:Initialize(oApp:RmTrade,"/D" + OemToAnsi(aPars[2]) + " /M","")
  nCol := 3
  nRow := 0
  sStr := OemToAnsi("CreateObject("+Chr(34)+"Таблица"+Chr(34)+")")
  oTabl := oApp:EvalExpr(sStr)
  oTabl:SourceTable(OemToAnsi(aPars[1]))

  Do While aZebra->(!Eof())
    nCol := If(nCol > 1, 0, nCol + 1)
    nRow := If(nCol = 0, nRow + 1, nRow)
    If nRow > 7
      oTabl:NewPage()
      nRow := 1
    EndIf

    oSection := oTabl:GetSection(OemToAnsi("Ценник|Верт_Секция"))
    oInputField := oSection:Area("R2C1:R2C4")
    oInputField:Text := OemToAnsi(AllTrim(mlabel->Name))
    oInputField := oSection:Area("R3C2")
    oInputField:Text := OemToAnsi(AllTrim(mlabel->Marka))
    oInputField := oSection:Area("R3C4")
    oInputField:Text := Round(mlabel->Koef1,3)
    oInputField := oSection:Area("R4C1:R4C4")
    oInputField:Text := OemToAnsi("Цена "+AllTrim(Str(mPrice->SumOutr,19,2))+" руб.")

    If nCol = 0
      oTabl:PutSection(oSection)
    Else
      oTabl:AttachSection(oSection)
    EndIf

    aZebra->(Reclock())
    aZebra->Ins := .F.
    aZebra->(f_DbUnLock())
    aZebra->(DbSkip())
  EndDo

  oTabl:Print(0)

EndIf
DbPop()
Return

#6: Help, me! Author: GVALocation: Gaponenko PostPosted: 29 Sep 2005 17:28
    —
Ну "не выходит каменный цветок"
Никак не могу запустить метод CreateObject("объектметаданных")
Даже ограниченный Try оператор в лучшем случае переходит на Catch
Но зачастую просто вываливается из модуля, осавляя незакрытым 1С.

#7:  Author: GVALocation: Gaponenko PostPosted: 29 Sep 2005 17:32
    —
Балуев Максим wrote:
Писал я как-то печать ценников в 1с (до sStr := OemToAnsi("CreateObject("+Chr(34)+"Таблица"+Chr(34)+")")
oTabl := oApp:EvalExpr(sStr)
oTabl:SourceTable(OemToAnsi(aPars[1]))

oSection := oTabl:GetSection(OemToAnsi("Ценник|Верт_Секция"))
[/quote]


Спасибо! Наверно это решение - насчет строки со спецсимволами. В полной мере отпишу вечером, но если у вас сработало хоть раз, значит ситуация решаема.

#8: Бесполезно Author: GVALocation: Gaponenko PostPosted: 30 Sep 2005 12:47
    —
Руки опускаются. Придется по старинке все выписывать из фокса, а из HARBOR ? или даже Fileeval? как это и делал раньше запускать готовый exe- шник.

Затык именно на запуске Tovar:=oapp:CreateObject("Справочник.Товары").
Внимание! При записи именно в таком виде оператор обрамленный Try CATCH вываливает напрочь модуль SKLAD, как выполнивший недопустимую операцию. Запись в виде Tovar:=oapp:EvalExpr('CreateObject("Справочник.Товары")') по крайней мере хоть корректно попадает на веточку CATCH. В приведенном операторе комбинации из одиночных, двойных кавычек и Chr(34) ни коим образом не меняют ситуацию, потому как в итоге приводятся к одному виду, если следить за переменной из отладчика.
А игры с выворачиванием символьных строк через HB_OEMTOANSI() тоже ни к чему. Если например писать в FAR и менять в нужном месте кодировку по F8, то все отрабатывает корректно. Проверял например на операторе ll:=goV77:Initialize(goV77:RMTrade,"/DC:\DARAM /NÝêñïîðòåð /P", "NO_SPLASH_SHOW") - здесь " Ýêñïîðòåð " это "Экспортер" в другой кодировк

#9:  Author: nordkLocation: Горбунов Константин PostPosted: 30 Sep 2005 17:21
    —
Ваши вопросы связаны с объектами 1С.
С майкрософт-объектами ошибок не видим, 1С счаз заниматься возможности нет - извините плз. Думаю найти можно было бы путь решения, пока некогда

#10: Все правильно. Author: GVALocation: Gaponenko PostPosted: 30 Sep 2005 17:39
    —
Да действительно с Exel, Word и т.п. проблем и не было. Сказать что все дело в 1С тоже не совсем правильно. Я же в самом начале написал, что из VFP или даже из того же EXEL все вызывается на ура. Проблема кажется с передачей параметров и форматом символьной строки.
Значит закрываем тему до лучших времен. Но если у кого еще будут наводки буду рад.

#11: Есть вариант Author: GVALocation: Gaponenko PostPosted: 01 Oct 2005 00:27
    —
Тему действительно закрываем. У меня отработал вариант:
sStr :='CreateObject('+chr(34)+Oemtoansi("Справочник.Номенклатура")+chr(34)+')'

#12: Re: Есть вариант Author: Титов АлександрLocation: Титов Александр Александрович PostPosted: 01 Oct 2005 10:11
    —
GVA wrote:
Тему действительно закрываем. У меня отработал вариант:
sStr :='CreateObject('+chr(34)+Oemtoansi("Справочник.Номенклатура")+chr(34)+')'

Работа в БЭСТе с объектами 1С - это круто!!!
Респек

#13: Какая разница, куда и откуда. Author: GVALocation: Gaponenko PostPosted: 03 Oct 2005 00:51
    —
А что прикажете делать, у меня два филиала сидят на 1С. Отгрузки ежедневно штук по 20 накладных, да в каждой до полсотни позиций.
Не перебивать же ручками. Выкручивался запуском Exe из под фокса, да вот "затянулся" попробовать без костылей напрямую. Может и доковыряю чисто из спортивного интереса.
А вот Максим - это молодец!
-Писал я как-то печать ценников в 1с (до FastReport).-
Красивый ход - использовать 1С для формирования Win бланков, зашел, напечатал, ушел

#14: Осталось совсем немного! Author: GVALocation: Gaponenko PostPosted: 05 Oct 2005 18:17
    —
Работает практически все.
Остался один но важный шаг. Не отрабатывает метод NEW().
Ни для справочников ни для документов.
Ковырял в нотациях Tovar:New() Doc:New() Doc:new(1) Doc:New(0) Doc:new(Nil) doc:EvalExpr('New()')
По готовому документу спокойно работают все методы. В том числе и создание новой строки GoDoc:NewLine(), причем если параметры не обязательны, то и не пишу ничего лишнего.

Здесь надоедаю именно потому, что все эти методы без проблем отрабатывают из VFP, Exel, Delphi. В чем затык из под HARBOUR не могу нащупать.

#15: Стандартные методы Ole класса Author: GVALocation: Gaponenko PostPosted: 06 Oct 2005 00:14
    —
Если в отладчике посмотреть на созданный объект например справочник Tovar он представляется как "V77s.Application:EvalExpr" класс. Со стандартным перечнем методов куда входят например Set, Get, Invoke, и New именно он похоже и инициализируется вместо метода V77 класса.
В 1с это можно было бы записать как Tovar.Новый(). Значит вопрос -как же все таки вызвать метод.

#16:  Author: nordkLocation: Горбунов Константин PostPosted: 06 Oct 2005 11:19
    —
Может будет полезна такая инфа
В Excel пишется так, например
oAS.Range("A1:D2").Merge
а в харборе - так
oAS:Range("A1:D2"):Merge()

#17: Теперь похоже все. Author: GVALocation: Gaponenko PostPosted: 06 Oct 2005 18:27
    —
Все! Пробился!
Только через Invoke. Здесь важна запятая. В итоге конкретный пример выглядит как:
sStr :='CreateObject('+chr(34)+Oemtoansi("Документ.ПоступлениеТМЦ")+chr(34)+')'
goDOC := goV77:EvalExpr(sstr)
!!! goDoc:invoke('New',)

Для последователей - методы, которым не обязательно параметры допустимо, наверно и корректнее, набирать вообще без скобок, например goDoc:CurrentDocument() как goDoc:CurrentDocument
GoDoc:NewLine() как GoDoc:NewLine

#18:  Author: DmitrySolomatovLocation: Solomatov PostPosted: 23 Dec 2005 07:37
    —
Просто неча использовать в 1С русские операторы есть же English language user

#19: Если бы было просто :( Author: GVALocation: Gaponenko PostPosted: 24 Dec 2005 17:08
    —
DmitrySolomatov wrote:
Просто неча использовать в 1С русские операторы есть же English language user


В том то и дело что не просто. Безусловно опробовались и английские синонимы ( в примерах кстати проглядывается), тут все таки специфика интерфейсов.
Хотя за напоминание о языках спасибо. Наверняка кто либо из последователей наткнется и на эти грабли.

#20:  Author: AleksTissenLocation: Aleks Tissen PostPosted: 09 Jun 2007 10:33
    —
Code:

oApp := CreateObject("V77.Application")

oApp:Initialize(oApp:RMTrade, '/D' +HB_OemToAnsi('e:\Aleks\1c_base\veresk\gate\ /NExchange /P1'), 'NO_SPLASH_SHOW')

sStr :='CreateObject('+chr(34)+Oemtoansi("Справочник.Фирмы")+chr(34)+')'
Firma := oApp:EvalExpr(sStr)
Firma:FindByCode("00001")

sStr :='CreateObject('+chr(34)+Oemtoansi("Документ.ПоступлениеТМЦ")+chr(34)+')'

oDocP := oApp:EvalExpr(sStr)

oDocP:invoke('New',)

oDocP:invoke('SetAttrib('+chr(34)+OemToAnsi("Фирма")+chr(34)+',),'+Firma:invoke('Currentltem',))


На последней команде вывалиается
Подскажите как над

#21:  Author: AleksTissenLocation: Aleks Tissen PostPosted: 09 Jun 2007 10:51
    —
Code:
oDocP:invoke('SetAttrib('+chr(34)+OemToAnsi("Фирма")+chr(34)+','+Firma:Currentltem()+')',)


и так не хоче

#22:  Author: nordkLocation: Горбунов Константин PostPosted: 09 Jun 2007 12:52
    —
Скажите пожалуйста а Вы отладчиком пользуетесь ?
Попробуйте поискать решение в окне отладчика
?firma:invoke() что возвращает наприме

#23:  Author: AleksTissenLocation: Aleks Tissen PostPosted: 09 Jun 2007 13:05
    —
?Firma:invoke() возвращает неверный аргумент.

не отрабатывает oFirm:=Firma:Currentltem

#24:  Author: AleksTissenLocation: Aleks Tissen PostPosted: 09 Jun 2007 13:17
    —
Извиняюсь

Отработало oDocP:SetAttrib(OemToAnsi("Фирма"),Firma:CurrentItem())

#25:  Author: nordkLocation: Горбунов Константин PostPosted: 13 Jun 2007 14:52
    —
разобрались с вопросом ?



-> Программирование в БЭСТ-4


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group