Обмен данными: внешняя компонента (Дельфи)<->1С #569656


#0 by Raxla
Есть внешняя компонента на Дельфи, надо передавть BMP в 1с и обратно. Не могу разобраться как это делать не с простыми данными. Сейчас всё гоняется через строка->base64->двоичные данные. Нашёлся вот такой хелп: Компонента может возвращать любые двоичные данные, например –              сформированное изображение штрих-кода. Для этого данные помещаются в поле pstrVal структуры tVariant, в strLen – размер данных, а тип устанавливается в VTYPE_BLOB.              1С:Предприятие V8 использует для них тип ДвоичныеДанные... Но в упор не понимаю как эти поля заполнить у вариант (не вижу их в описаниях, и TVaeData и OLeVariant смотрю..). Ткните носом, плиз :( А если ещё и картинка<->bmp, без двоичных данных, то будет вообще супер.
#1 by Raxla
Всё нашлось. Люди не учитесь делать компоненты по примеру TestVK, туда не включено v8napi, а искать чёрную кошку в тёмной комнате можно долго, особенно, когда её там нет. На самом деле такие проблемы решаются за пару секунд, но только не тогда, когда поисковик выдаёт ровно 0 запросов по интересующим ключевым словам, вроде V8AsBlob и по всяким другим важным штукам почти столько же инфы :(
#2 by orefkov
Ну так сделай, чтобы было не 0 ссылок, напиши, че сделал.
#3 by H A D G E H O G s
TestVK было сделано лет так за пять до v8napi
#4 by H A D G E H O G s
Если конвертация "строка" -> "base64" делается с прямыми hands.sys то все летает на 1-2-3.
#5 by Raxla
Да пока ещё ничего, пример из v8napi не взлетел, а скрестить TestVK и v8napi не получается, маловато силёнок в ООП. Там дублируется функционал. Сейчас попробую всё лишнее поудалять. Да base64 уже летает. Только вот v8napi не получается запустить, хочется всё-таки по человечески сделать. Пример из 1с-натив не подключается ни в какую, на ту строку, что в мануале вообще ругань: Может, кто-нибудь дать рабочий пример, как сделать внешнюю компоненту на v8napi? И объяснить почему не получается работать с дллкой из поставки?
#6 by vmv
внешние источники рулят если разобраться, я уже комы не юзаю да и вк почили в бозе
#7 by Raxla
На самом деле ничего там повторяющего не оказалось, в Set и GetProp подменили типы, кое где поставили  myclass_object.V8ClearVar(myclass_object.g_Value); вместо присваиванию к нулю. В итоге всё успешно откомпилилось и весело валится при старте. :-) Чё делать - не знаю.
#8 by Raxla
Да, всё-таки там весь функционал дублируется. уже терпения листать просто не хватило. Надо плясать от чистого v8napi. Только даже пример запустить не могу :(
#9 by orefkov
Через native api даже объекты не ходят, только простые типы данных, нахрена оно вам? Передавай данные через SAFEARRAY - его то дельфя поддерживает в своем OleVariant? А в 8ке он превратится в COMSafeArray.
#10 by Raxla
В принципе да, просто до сегодняшнего дня мне было совершенно не известно что v8napi и testVK используют разные технологии. поэтому продираясь сквозь эту путаницу пришлось просто рыть носом всё что ни попади, потому что было совершенно очевидно, что всё совершенно не так, как на самом деле. Да и с тормознутостью AnsiString почти двое суток шла борьба, пока не осенило в чём дело, теперь-то всё летает и можно и через base64 гонять. И да, я вот тут копаю v8napi внешние компоненты к 1С8.1 не цепляются? только в 8.2? или там как-то по хитрому надо ProgID замутить, мне что-то не очень понятно.. Если можно, примерчик по массивам (передать/получить для TestVK)? А то для меня и вариант-то три дня назад был только из теории. раньше не приходилось пользовать. Там же массивы не обычные, а вариантные?
#11 by Raxla
Ну а вообще, помимо двоичных данных, ещё админские права не будут требоваться. так что как минимум два плюса.
#12 by DmitrO
Native только с 8.2
#13 by Serginio1
А зачем тебе ВК? Простого ОЛЕ сервера недостаточно, или нужен обратный вызов? Полностью согласен с , да и base64  не слишком затратен.
#14 by Raxla
Нупример в ВК у меня используются CallBack функции для всякой работы со всякими примочками, в 1С я не знаю как это сделать. Парочка злободневных вопросов: Как из ВК написать в строку статуса изпроцедуры метода: function TMyCObj.meth4(mode: TMode): String; По AddInOSetStatusLine в инете 0 инфы и насколько мне стало понятно, вызов происходит так 1C->AddInObj->MyOmj,а вот как из MyObj вызвать что-то, хотя бы из AddInObj не вижу, а у меня весь функционал в MyObj. Грубо гвооря, пока 1С не позовёт из AddinObj ничего не вызовется, а когда заработало что-то в MyObj, то результат в 1С можно будет запихнуть лишь по окончании работы процедуры, когда управление передастся обратно в AddInObj, а мне надо в процессе исполнения процедур MyObj написать в строку статуса 1с лог. А, хотя, можно еж ссылку на объект диспатч, наверное пропихнуть? Второй момент, можно ли что подкрутить, что бы 1С видела список методов и функций ВК, то есть в конфигураторе по котрол+пробел подсказывала что есть (пусть даже придётся массив с именами в самой 1С прописать)?
#15 by H A D G E H O G s
#16 by Rie
Не совсем понял. NativeAPI используется? Тогда к чему игры с IDispatch?
#17 by Raxla
нет, уже не Native, использую TestVK. 1) Сделали свойство процедурного типа в MyObject и addinobj добивили процедуру, присваиваем всё это дело после myobjectcreate. Процедура вызвается и всё работает. Но вот установить строку статуса не получается. Делаю вызов SetStatusLine - ничего не происходит. примерчиком записи в строку статуса никто не поделится? можно через вызов метода 1С.
#18 by Rie
Ты у кого и как SetStatusLine вызываешь?
#19 by Raxla
кстати. есть ещё один плюс native1C, он компилируется в Lazarus, а вот TestVK это только Дельфи. Честно говоря ещё с Dispatch не работал и то что в AddInObject понаписано тоже для меня отчасти загадка. Мне думается. что я её вообще не вызываю, судя по коду самой СетСтатус лайн, только тогда зачем там процедура написана? procedure AddInObject.test(const stroka:string); begin end;
#20 by H A D G E H O G s
Ты юзал NativeAPI?
#21 by Raxla
Нет. после того как понял, что натив толкьо 8.2 и старше. Я в 8.1 сейчас работаю
#22 by H A D G E H O G s
Я Rie спрашиваю
#23 by Raxla
Ксатати testVK под 8.2 можно использовать? а то у меня не получилось подключить?
#24 by Rie
Получи в Init pStatusLine := pConnection as IStatusLine; затем
#25 by Rie
Только на уровне "поиграться, посмотреть что такое".
#26 by Rie
->
#27 by Rie
В толстом клиенте.
#28 by H A D G E H O G s
Не могу вернуть из компоненты longword (cardinal) беззнаковое. Преобразовывает его в integer (знаковое). уже мозг сломал. Че мне его в 1С в беззнаковое преобразовывать штоле?
#29 by H A D G E H O G s
И еще затык. Умные одноэсники отказались от com-а напрочь. рааааз - и готово. И даже safearray запретили. Так то.
#30 by Rie
Видел эту проблему. Решить не удалось. Workaround - или возвращать строку или integer в 1С преобразовывать. Кстати, осталась и ерунда с FFFFFFFF Ну это-то понятно - NativeAPI должно быть платформенно-независимой.
#31 by Rie
+ То есть, наоборот, с 80000000
#32 by H A D G E H O G s
А это что за ерунда? p.s. Я все таки решил проблему возврата толпы значений из компоненты.
#33 by H A D G E H O G s
Вернуть тупо сериализированный XDTO СписокЗначений, Массив или еще че. Ну а в Дельфе - свой объект - псевдосписок на основе TList. Пока только СписокЗначений сделал. Позже статью черкну.
#34 by Rie
Верни беззнаковое #80000000. Причём арифметические операции в 1С с ним тоже иногда хитро работают (прибавить 1, отнять 1 - выглядит весело).
#35 by H A D G E H O G s
Ну это-то понятно - NativeAPI должно быть платформенно-независимой. Ну это-то понятно. Но почему не сделать нормальную c COM-ом и dispatch-ами (если уж лениво для всех прикладных объектов интерфейсы прописывать) для нормальных пользователей 1С (виндовых) и кастрированную для всяких серверов на тумба-юмба (убунту)... Непонимаю.
#36 by Raxla
>p.s. Я все таки решил проблему возврата толпы значений из компоненты. А можно на примере? >pStatusLine := pConnection as IStatusLine; а тип у pStatusLine в объявлении - какой?
#37 by H A D G E H O G s
Можно 2 word-а вернуть - старшее и младшее и в 1С Dword=wordСтаршее*65535+wordмладшее. Если word-ы тоже гонят - вернем в 2 integer-ах. Щаст проверю.
#38 by H A D G E H O G s
Dword=wordСтаршее*65535+wordмладшее Это правильно?
#39 by Rie
*65536
#40 by Rie
По кускам-то можно. Но в данном конкретном случае хотелось функцию (в ней HANDLE возвращался для последующего использования).
#41 by Rie
IStatusLine, ясен день.
#42 by Rie
Спасибо за информацию.
#43 by H A D G E H O G s
Может поправят еще. На партнерский жаловаться?
#44 by Rie
IMHO, не стоит игра свеч. Случай редкий, обойти можно.
#45 by Raxla
Вылетает.
#46 by H A D G E H O G s
Оперилась.
#47 by Rie
Код покажи. pStatusLine - как и где описал? Где ей значение присвоил? Где использовал?
#48 by Raxla
в самом низу до s_Ok pStatusLine := pConnection as IStatusLine; в процедуре procedure AddInObject.test(const stroka:string); begin строку к вайдстринг приводил.
#49 by Rie
Странно. "Вылетает" - возможно, указатель указывает куда-нибудь в вечность. В Init - попробуй проверить, что именно присвоилось pStatusLine. И прямо в Init написать pStatusLine.SetStatusLine('Ура!'); Ещё вопрос - а откуда это всё вызывается? (в 1С).
#50 by Raxla
В инит тоже вылетает. В 1С запускается метод вк, вк запускает процедуру Test из модуля AddInObj. Но если только в инит писать, то там вообще всё изолированно ото всяких процедур. Но тоже вылетает.
#51 by Rie
Assigned(pStatusLine) - проверил? pConnection к тому моменту - не испорчен кем-нибудь? Перепиши через QueryInterface и посмотри, что он вернёт.
#52 by Raxla
-1
#53 by Rie
-1 - это хорошо. Но что вернул QueryInterface?
#54 by H A D G E H O G s
Рекомендую научиться юзать отладчик Дельфи при отладке dll-ок.
#55 by Raxla
0 вернул
#56 by Rie
То есть, S_OK... Тогда всё очень странно... И зовёшь - из обычного приложения, а не из какого-нибудь внешнего соединения? (Это я уж так, на всякий случай спрашиваю).
#57 by Raxla
Да почти девственная TestVK комонента.
#58 by Raxla
Отладчик - да, надо бы освоить, а то вот недавно СтримМемори не смог загрузить в битмап и до сих пор не знаю в чём дело, но на всё времени не хватает. Надо ещё кучу инфы прочесть по темам ВК.
#59 by Rie
Это понятно, что почти девственная. Откуда в 1С вызывается? (Что именно в TestVK написал - не знаю, а смотреть - лень. Поэтому лучше приводи код).
#60 by Raxla
ПриНачалеРаботыСистемы
#61 by Rie
Попробуй позже дёрнуть. Из какой-нибудь формы.
#62 by Raxla
Без изменений. Где бы надыбать пример рабочего кода?
#63 by Raxla
пишет, что пытаются прочесть данные по нулевому адресу
#64 by Rie
Только что взял и написал в Init FStatusLine := pConnection as IStatusLine; FStatusLine.SetStatusLine('Работает'); Вызвал по кнопке Выполнить внешней обработки - и ничего не вылетело. 1С 8.2.13.202, обычное приложение. Возможно, ошибка - где-то в другом месте?
#65 by Raxla
сейчас возьму чистую TestVK и попробую, если будет та же фигня, выложу на обменник.
#66 by Raxla
Библиотека внутри базы, при запуске скопируется в папочку бин. Сначала отрабатывает мессаджбокс, потом процедура и всё вылетает. 8.1
#67 by Raxla
Всмысле не процедура, а злополучная строка в инит. Если ошибка у меня в ДНК сильно не ругайтесь, у меня уже перегруз потихоньку начался.
#68 by H A D G E H O G s
Взял чистую и написал FStatusLine := pConnection as IStatusLine; FStatusLine.SetStatusLine('Работает'); ошибка
#69 by Rie
Посмотрел. Падает. Но дело - НЕ в StatusLine, где-то в другом месте, видать, ты с памятью нехорошо обошёлся. Выкинь TestVK. Создай с нуля чистую внешнюю компоненту. Реализуй _только_ IInitDone. Убедись, что SetStatusLine работает. А затем - добавляй потихоньку прочие возможности. И уж явно не надо отлаживать внешнюю компоненту, запихивая её в ХранилищеЗначения!
#70 by Rie
Как это - "ошибка"? "Чистая" компонента прекрасно показывает строку состояния в 8.1 (8.1.15.14).
#71 by Raxla
Ну вообще-то, она грузится ВСЕГДА с диска перед каждым запуском, просто, если она по указанному пути не находится, то она туда записывается. Это не для отладки, это для - работы, зато бонусом - авторегистрация в системе :-) Так что при отладке я запускаю батник перезаписывающий её в бин и всё работает. Более менее стабильные версии база предлагает загрузить после пересоздания константы хранилища и их можно посылать вместе с базой на тест - удобно. @echo off echo y|copy "C:Documents and Settings..DesktopTestVKDLL...Dll" "C:Program Files1cv81in....Dll" >nul
#72 by Rie
Это прекрасно. Но сначала пусть компонента заработает, а потом уже обеспечивать бонусы :-) С "чистой" компонентой пробовал? Если и с ней облом - то может, глюк конкретного релиза 1С 8.1?
#73 by Raxla
ну платформу-то я давно не обновлял. Собственно, я потому TestVK и использую, что не очень хорошо ориентируюсь в технологиях COM и OLE и что бы сделать чистый вариант мне надо посидеть пару суток у компа. Релиз платформы давно не обновлял (1С:Предприятие 8.1 (8.1.14.72)), может и её глюк. Я думаю, что проще будет пока что начать разбираться с invoke и записывать логи через саму 1С.
#74 by Rie
Не надо мучить Invoke (если я правильно тебя понял). Его внешние компоненты не используют - у них ILanguageExtender вместо IDispatch. Открой книжку "Технология внешних компонент", почитай, какой метод за что отвечает. И без извращений их реализуй. Вот и будет "чистая" внешняя компонента. А TestVK - это уже навороты  (я, к примеру, пишу ВК в несколько ином стиле; ты - придумаешь свои удобства и т.д.).
#75 by Raxla
На самом деле у меня уже кода в шаблон набито много, просто с 1С ему мало чем надо обмениваться, так что отлаживается и без платформы. Но вот сейчас уже надо двусторонний обмен и лог прямо в 1с, а не мессаджбоксами. Так что переписывать всё с нуля - не лучшая идея. Книжка есть, читал уже раза три. Оно?
#76 by Raxla
про отличия ILanguageExtender вместо IDispatch я пока не совсем понял, хотя вот это читал:
#77 by Rie
Может быть, и оно. IErrorLog - не будет ли полезен, чтобы выводить прямо в 1С? (всяко лучше, чем строка состояния). Я бы всё же предположил, что нечто в твоём коде доблестно портит память. Отсюда и ошибка.
#78 by Rie
ILanguageExtender делает примерно то же, что и IDispatch (ищет методы и свойства по имени, выполняет их), но вместо "навороченных" GetIDsOfNames и Invoke используются более простые методы. Только и всего. Поищи по форуму - была ветка насчёт того, использовать ли ILanguageExtender или IDispatch. Большей частью - трёп (каюсь, к трёпу и я руку приложил), но в конце ветки нашёлся человек (если не ошибаюсь, @Torquater ), который грамотно всё расписал.
#79 by Rie
Насчёт COM и Delphi - могу порекомендовать книгу Елманова Н.З., Трепалин С.В., Тенцер А.Е. Delphi и технология COM. - СПб.,Питер,2003 Несмотря на возраст - написана весьма прилично.
#80 by Raxla
уфф, ели нашёл в истории, ссылку дал не ту, в буки не то осело: вот это про LangueageExtender с вашим участием.
#81 by Rie
Оно. Что в этой ветке ценно - комментарии в конце.
#82 by Serginio1
Если тебе не нужна страница свойств возьми отсюда Исходник ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender. Делаешь 1 метод InitFrom1C(const pCon: IDispatch); из которого получаешь все интерфейсы и работаешь как с обычным дуальным итерфейсом.
#83 by Raxla
а можно вернуть результат не COMArray, а массив?
#84 by Serginio1
Попробуй передай из 1С массив или создай его на стороне клиента через NewObject
#85 by H A D G E H O G s
1) в модуле vk_object в класс T_vk_object добавить переменную: 2) В процедуре init добавить vk_object.pConnect:=pConnection; 3) В нужной процедуре сделать: var 1CContext,1CArray:OleVariant; begin
#86 by H A D G E H O G s
заменить 1CContext, 1CArray на _1CContext, _1CArray Сорри...
#87 by Raxla
Да, только мне не понятно, где взять pConnect, OleVariant(i1cv7).AppDispatch.Сообщить('Тест'); работает только внутри: AddInObject.Init(pConnection: IDispatch): i1cv7:=pConnection; В другой процедуре: procedure AddInObject.test(const stroka:string); уже облом, хотя
#88 by Serginio1
Я так понимаю i1cv7 это переменная объекта? Какая ошибка?
#89 by H A D G E H O G s
в модуле vk_object в класс T_vk_object добавить переменную: pConnect:IDispatch; Что непонятно написано?
#90 by Raxla
ё-маё, неужели заработало! Честно говоря, переменную типа IDispatch уже раз 20 пробовали добавлять в MyObject, сразу же после этого, первая же компиляция вешает дельфи намертво. А Ctrl+S при небольших правках по привычке - после Ctrl+f9. С чем связана эта хрень - не понятно, но если сохранить, потом откомпилировать с зависоном и снять на Alt+Ctrl+Del, то при следующем запуске дельфи (Дельфи 7 ентерпрайз) компиляция проходит успешно. Тупо, первый раз эту фазу повторили, просто невозможно было додуматься что оно прокатит..
#91 by H A D G E H O G s
Переходи на Delphi 2010 - это нечто! После delphi 6 - небо и земля!. А delphi 7 - да, глюкавый, именно поэтому я с него на 6 вернулся и сидел долго.
#92 by Steelvan
Подскажи пож. Вот я пишу для толстого клиента ActiveX для работы с графиками. А можно как-то прикрутить внешнюю компоненту для работы с тонким клиентом ? Не нашел типа реквизита формы ActiveX для тонкого. Можешь ссылку дать, если такое возможно ?
#93 by H A D G E H O G s
Тонкий клиент не работает с ActiveX (суть COM), ибо 1С 8.2, управляемое приложение - кроссбраузерное и кросссерверное. Ибо из браузером COM поддерживает только IE (вроде бы). Ибо сервер может крутиться и на Линуксе. Но почему Тонкому клиенту запретили - вот не знаю.
#94 by Steelvan
А сделать это как внешнюю компоненту через Native API возможно ? Я имею ввиду переделать ActiveX для работы с графиками под Native API и как-то прикрутить к тонкому ?
#95 by H A D G E H O G s
Не знаю, как под ТонкимКлиентом, под ТолстымКлиентом было так Процесс 1С походу перехватывал сообщения WM_PAINT для любого дочернего MDI-окна, кроме окон созданных через интерфейс IExtWndsSupport. Поэтому все мои окна, созданные через ВК-шку представляли собой белые окна. Я видеоплеер хотел сделать из 1С, без всяких ActiveX-ов :-).
#96 by Steelvan
Если закажу тебе ВК на Дельфи, сколько стоить будет ? Почасовка.
#97 by H A D G E H O G s
ICQ#: 374-881-272
#98 by Raxla
Передаю строку в 1С, она приходит с заверщающим нулём, то есть длина на еденицу больше. в результате, если сделать сообщить в 1С, вот таким образом: Сообщить('hello'); Сообщить(string1); Сообщить(string2); то на выводе будет: hello end string1+string2 Строки с нулём лепятся в одну и показываются в самом конце, сейчас делаю так: Сред(строка, 1, СтрДлина(строка)-1) не могу найти, как нормально передать.
#99 by Rie
Это не тот код, который у тебя работает. Не видно, что именно и как именно ты передаёшь. Так что... Не рассчитывай на неявное преобразование типов. Попробуй в OleVariant запихнуть непосредственно BSTR.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям