Нужен пример работы с 1С 8.0 на Delphi по COM или OLE #314858


#0 by inimeg
Прочитал соответствующий топик v8: V8.COMConnector и Delphi Все здорово но что это за интерфейс IV81COMConnector? Как мне его подключить? Откуда взять? И еще вопрос. Попробовал реализовать через V8.Application (Automation). Автор пишет что проблема с русскими именами пропала. А у меня както она на месте. Все теже "Метод Справочники не поддерживается объектом автоматизации". Что я делаю не так? Где чего не подключил-включил? Работаю на Delphi2005+1C v8.1 (v8.0 таже проблема) Заранее благодарен за любую полезную информацию на эту тему. А то с 8 всего 3 дня как познакомились в отличии от 7. И отношения никак не наладятся ;)
#1 by shachneff
Дай ссылку на тему, где я написал, что проблема решена... Не могу сам найти
#2 by shachneff
Сам с собой поговорю...
#3 by shachneff
Использовал Delphi 6, 1C v8.0.18
#4 by inimeg
У меня такое подозрение что в Delphi2005 что-то с OLE изменили. Работают только английские аналоги методов 1C да и то не все а через 1...ж(
#5 by Кураж
Может быть найдешь для себя что-то полезное:
#6 by inimeg
Кураж -  Спасибо. Это я уже читал. Про Эмуляцию EvalExpr там хорошо написано. Но вот с остальным... Беда в том что я пока вобще не могу так настроить соединение с 1С чтобы мог использовать конструкции языка на русском. ж( shachneff - А ты не мог бы поделится каркасом приложения? Интересует как ты до интерфейса IV81COMConnector достучался. Может быть у меня в этом проблема?
#7 by shachneff
Я тогда решал задачу автоматического запуска обработок... Давно это было, а потом появились регламентные задания и все дельфевые приложения канули в лету... Но если не срочно, то я могу попробовать дома повторить подвиг...
#8 by inimeg
shachneff - буду признателен за помошь. Срок исполнения как всегда вчера, но я пока всеравно ковыряюсь безуспешно, так что буду ждать. Если озарение прийдет раньше отпишусь.
#9 by Hadgehogs
Ну все же написано про COMConnector в Что конкретно не получается?
#10 by laview
А может быть кто нибудь скажет, что лучше Delphi или Visual Studio? 1C советует все делать на Visual Studio, а я в институте Delphi изучал. Он мне понятнее. В чем между ними разница с точки зрения создания Web приложений для 1С?
#11 by Hadgehogs
ну все, счаст начнется...
#12 by Salvador Limones
Как можно сравнивать Delphi и Visual Studio?
#13 by shachneff
Вот мой код, который был в примере, но поправленный под 8.1. uses var end. Обрати внимание на 2 последних модуля в секции uses. Так же необходимо импортировать в проект модуль V81_TLB (Project - Import Type Library. Встать на "1CV81 COM Connector". Нажать Create Unit. Для того, чтобы это получилось, на компе должна быть установлена 1С 8.1
#14 by laview
А готовые шаблоны (которые вместе с web расширением) v8webApplication и v8webService в Delphi тоже можно использовать?
#15 by inimeg
Hadgehogs-  соединится получается. Соединение есть. А вот конструкции типа s1C8_ole.Справочники выдают ошибку. Вот что конкретно не работает. shachneff-  Вот ведь...Project - Import Type Library нету такого пункта в Delphi2005 ж(
#16 by inimeg
Так... Новые сведения с полей. Вобщем как подключить  V81_TLB в Delphi2005 разобрался. Новый Com Object Delphi 32 и там в качестве родителя выбираем IV8COMConnector. Теперь беда другая. На этой строке ShowMessage(MainObject.Метаданные.Справочники.Банки.Комментарий); Выдает окно Method 'P   P  C oPг'PoPSPSC<P  ' not supported by automation object. Такое впечатление что русские наименования после компиляции не подходят под кодировку с которой работает 1С. Есть соображения на этот счет?
#17 by shachneff
Набей русские строки руками, а не копируй из форума.
#18 by shachneff
Плюс я натравил Дельфю на типовую Управление Торговлей. У тебя таких метаданных может не быть!.
#19 by inimeg
shachneff метаданные точно есть. Типовая Бухгалтерия. В отладчике пишет Project SDIAPP.exe raised exception class EOleError with message 'Method 'Meтaдaнныe' not supported by automation object'. А вот в рантайме выводит
#20 by inimeg
shachneff метаданные точно есть. Типовая Бухгалтерия. В отладчике пишет Project SDIAPP.exe raised exception class EOleError with message 'Method 'Meтaдaнныe' not supported by automation object'. А вот в рантайме выводит Method 'P   P  C oPг'PoPSPSC<P  ' not supported by automation object. Если меняю Meтaдaнныe на синони Metadata то пишет тоже самое но для Справочники Если их меняю на Catalogs то ругается на Банки и т.д. Нашол в настройках проекта пункт code page. Может с ним поиграться?
#21 by shachneff
Ну поиграйся с преобразованием строки в кодировку UTF-8, а затем эту строку выполни...
#22 by shachneff
да... 1С работает с UTF-8
#23 by inimeg
Вроде как 1С работает с кодировкой UTF-8 Я прав? А числовое представление этой кодировки что-то найти не могу. В code page можно только числовое значение ввести.
#24 by inimeg
shachneff ж) Опередил. Погоди, а как можно строку типа ShowMessage(MainObject.Метаданные.Справочники.Банки.Комментарий); Задать в UTF-8 ? этож посути команда... блин.. что-то я туплю ж(
#25 by Балабес
стабильно работает только запуск через командную строку
#26 by БиньковскийВиталий
поставь Delphi v7
#27 by inimeg
БиньковскийВиталий- ;) Если бы все было так просто ж) Это не решение. Балабес - это к чему?
#28 by inimeg
Числовое представление нашол 65001. Поменял. Не помогло. Поменял кодировку у pas. Не помогло. Не представляю куда теперь двигаться дальше. Срочно нужна помошь ж)
#29 by shachneff
Специально ради тебя дома скачаю Дельфю 2005 и покажу, как решить твою проблему. Решу виртуально, поэтому стребую виртуальное пиво.
#30 by inimeg
shachneff - не вопрос ж) Я даже реального согласен поставить с доставкой ж)
#31 by БиньковскийВиталий
Ситуация у тя сложная, если верно, в 2005 текст юникоде. Есть сложный путь, как то делал. Нужно подменить делфевый механизм диспетчеризации типа Variant. у меня в результате было примерно так (коммент из реализации) (не пинайте, писалось хрен знает когда) {--------------------- Mpc-интерпретация вызовов IDispatch --------------------} { количество параметров - не менее одного имя функции или процедуры (любое, Ini есть Variant - переменная) - последний параметр (чаще единственный):    при вызове как функции - значение по умолчанию,    возвращается если параметр не сохранялся ранее.    всегда необходим по крайней мене для опознавания типа искомого значения.    Важное замечание:        При передаче float - абсолютных значений        (пример MayLastRadius := Ini.MayLastRadius(3.14))        количество знаков должно быть более 4        (MayLastRadius := Ini.MayLastRadius(3.14000), иначе будет        производиться поиск Currency - значения, при сохранении        параметр также будет записан как Currency, и при последуюжем чтении        будет ошибка. При этом MayLastRadius := Ini.MayLastRadius(6.28 / 2)        будет нормально распознан как поиск Double - значения.        Это не относится к параметрам по ссылке:        var    при вызове как процедуры -  сохраняемое знаачение. предпоследний параметр:    при количестве параметров более двух -    уточнение имени параметра, удобен при сохранении в цикле.    тип может быть любым, логичен Integer или string.    при уточнении ключа (параметров более двух) и отсутствии    необходимости уточнения имени параметра передать пустую строку    при количестве параметров равным двух -    уточнение ключа. можно вызвать FullNameComponent:        запись при количестве параметров более двух - все до предпоследнего рассматриваются как уточнение ключа относительно базового (Kernel.MainKey) все приводятся к string, допустима передача к примеру счетчика цикла. последний из них может не заканчиваться ''. передаваемые параметры могут иметь тип Variant, но тогда должны быть инициализированны(иметь тип), иначе будет сгенерированно исключение. исключение будет сгенерированно также при отсутствии параметров (см. выше) var begin    (шииирина и высота формы) begin    (шииирина и высота формы)        (удаляем старый состав и ширину колонок)    (сохраняем новый состав и ширину колонок)    for i := 0 to HeaderSections.Count - 1 do }
#32 by inimeg
БиньковскийВиталий - преклдоняю колено перед вашей выкладкой, но.... К чему она? Ничего не понятн, ровным счетом ничего. Можно более доступным языком?
#33 by БиньковскийВиталий
никто не говорил что реализация тривиална. когда вы обращаетесь к полям вариантной переменной, делфи вызывает функцию диспетчеризации. в вашем случае - MainObject.Метаданные. при старте её адрес лежит в VarDispProc. я её подменяю при инициализации модуля: моя реализация MpcVarDispInvoke var    SaveVarDispProc: Pointer; {указатель на оригинальную функцию диспетчеризации OLE} procedure MpcVarDispInvoke(Result: PVariant; const Instance: Variant;        case ArgType of            varStrArg:                if ByRef then Result := PString(Params^)^            else Result := PString(Params)^;            varOleStr:                if ByRef then Result := PWideString(Params^)^    else Result := PWideString(Params)^;            varBoolean:                if ByRef then Result := PBool(Params^)^                else Result := PBool(Params)^;            varByte, varSmallint, varInteger:                if ByRef then Result := PInteger(Params^)^        else Result := PInteger(Params)^;            varSingle:                if ByRef then Result := PSingle(Params^)^            else Result := PSingle(Params)^;            varDouble:                if ByRef then Result := PDouble(Params^)^            else Result := PDouble(Params)^;            varDate:                if ByRef then Result := PDateTime(Params^)^        else Result := PDateTime(Params)^;            varCurrency:                if ByRef then Result := PCurrency(Params^)^        else Result := PCurrency(Params)^;            varVariant:                if ByRef then Result := PVariant(Params^)^        else Result := PVariant(Params)^;            else                raise Exception.CreateFmt('Invalid DataType - %d', [ArgType]);            if ArgCount < 1 then                raise Exception.Create('Not enough actual parameters');                if i = ArgCount - 1 then                if ByRef then                if Reg.OpenKey(Key, False) and Reg.ValueExists(NameProp) then                case ArgType of
#34 by БиньковскийВиталий
моя реализация пишет/читает в реестр, в вашей нужно заменить одну кодировку на другую
#35 by БиньковскийВиталий
пройди отладчиком (в assm!) при работе с вариантной переменной, там видно как компилятор подставляет вызов "родной процедуры", изучи её сырцы, куда параметры он сует. из этого видно:
#36 by inimeg
БиньковскийВиталий - спасибо. Попробую вчитаться. Буду иметь в виду этот вариант решения, хотя он мне и кажется сложным. Всеравно спасибо за помошь.
#37 by БиньковскийВиталий
и все-же, в чем сложность паралельно с 2005 D7 поставить?
#38 by inimeg
БиньковскийВиталий - теоретически сложности нет. Прийдется конечно вынести весь функционал работы с 1С из приложения написаного на 2005 в службу и направлять команды синхронизации уже ей скажем по TCP протоколу. Просто хотелось без лишних усложнений, но видимо не получится. Сейчас попробую конечно еще все это проверить на 2007 может там прокатит.
#39 by inimeg
Решение найдено. Для того что бы компилятор Delphi корректно компилировал структуры типа ole1Cv8.Метаданные.Справочники , в понятной для 1Сv8.1 кодировке необходимо у файла проекта выставить кодировку UTF8. Тоесть не у проекта а у самого пасника. ж) Как всегда все оказалось проще чем казалось на первый взгляд. Спасибо всем за помошь в поиске решения.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям