#0
by Raxla
Есть внешняя компонента на Дельфи, надо передавть BMP в 1с и обратно. Не могу разобраться как это делать не с простыми данными. Сейчас всё гоняется через строка->base64->двоичные данные. Нашёлся вот такой хелп: Компонента может возвращать любые двоичные данные, например – сформированное изображение штрих-кода. Для этого данные помещаются в поле pstrVal структуры tVariant, в strLen – размер данных, а тип устанавливается в VTYPE_BLOB. 1С:Предприятие V8 использует для них тип ДвоичныеДанные... Но в упор не понимаю как эти поля заполнить у вариант (не вижу их в описаниях, и TVaeData и OLeVariant смотрю..). Ткните носом, плиз :( А если ещё и картинка<->bmp, без двоичных данных, то будет вообще супер.
#1
by Raxla
Всё нашлось. Люди не учитесь делать компоненты по примеру TestVK, туда не включено v8napi, а искать чёрную кошку в тёмной комнате можно долго, особенно, когда её там нет. На самом деле такие проблемы решаются за пару секунд, но только не тогда, когда поисковик выдаёт ровно 0 запросов по интересующим ключевым словам, вроде V8AsBlob и по всяким другим важным штукам почти столько же инфы :(
#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? И объяснить почему не получается работать с дллкой из поставки?
#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
Ну а вообще, помимо двоичных данных, ещё админские права не будут требоваться. так что как минимум два плюса.
#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С прописать)?
#17
by Raxla
нет, уже не Native, использую TestVK. 1) Сделали свойство процедурного типа в MyObject и addinobj добивили процедуру, присваиваем всё это дело после myobjectcreate. Процедура вызвается и всё работает. Но вот установить строку статуса не получается. Делаю вызов SetStatusLine - ничего не происходит. примерчиком записи в строку статуса никто не поделится? можно через вызов метода 1С.
#19
by Raxla
кстати. есть ещё один плюс native1C, он компилируется в Lazarus, а вот TestVK это только Дельфи. Честно говоря ещё с Dispatch не работал и то что в AddInObject понаписано тоже для меня отчасти загадка. Мне думается. что я её вообще не вызываю, судя по коду самой СетСтатус лайн, только тогда зачем там процедура написана? procedure AddInObject.test(const stroka:string); begin end;
#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 должно быть платформенно-независимой.
#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-ах. Щаст проверю.
#40
by Rie
По кускам-то можно. Но в данном конкретном случае хотелось функцию (в ней HANDLE возвращался для последующего использования).
#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 и посмотри, что он вернёт.
#56
by Rie
То есть, S_OK... Тогда всё очень странно... И зовёшь - из обычного приложения, а не из какого-нибудь внешнего соединения? (Это я уж так, на всякий случай спрашиваю).
#58
by Raxla
Отладчик - да, надо бы освоить, а то вот недавно СтримМемори не смог загрузить в битмап и до сих пор не знаю в чём дело, но на всё времени не хватает. Надо ещё кучу инфы прочесть по темам ВК.
#59
by Rie
Это понятно, что почти девственная. Откуда в 1С вызывается? (Что именно в TestVK написал - не знаю, а смотреть - лень. Поэтому лучше приводи код).
#64
by Rie
Только что взял и написал в Init FStatusLine := pConnection as IStatusLine; FStatusLine.SetStatusLine('Работает'); Вызвал по кнопке Выполнить внешней обработки - и ничего не вылетело. 1С 8.2.13.202, обычное приложение. Возможно, ошибка - где-то в другом месте?
#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 с вашим участием.
#82
by Serginio1
Если тебе не нужна страница свойств возьми отсюда Исходник ВК которая загружает Объект Автоматизации поддерживающий ITypeInfo и выполняет все его свойства и методы через IlanguageExtender. Делаешь 1 метод InitFrom1C(const pCon: IDispatch); из которого получаешь все интерфейсы и работаешь как с обычным дуальным итерфейсом.
#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
#87
by Raxla
Да, только мне не понятно, где взять pConnect, OleVariant(i1cv7).AppDispatch.Сообщить('Тест'); работает только внутри: AddInObject.Init(pConnection: IDispatch): i1cv7:=pConnection; В другой процедуре: procedure AddInObject.test(const stroka:string); уже облом, хотя
#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-ов :-).
#98
by Raxla
Передаю строку в 1С, она приходит с заверщающим нулём, то есть длина на еденицу больше. в результате, если сделать сообщить в 1С, вот таким образом: Сообщить('hello'); Сообщить(string1); Сообщить(string2); то на выводе будет: hello end string1+string2 Строки с нулём лепятся в одну и показываются в самом конце, сейчас делаю так: Сред(строка, 1, СтрДлина(строка)-1) не могу найти, как нормально передать.
#99
by Rie
Это не тот код, который у тебя работает. Не видно, что именно и как именно ты передаёшь. Так что... Не рассчитывай на неявное преобразование типов. Попробуй в OleVariant запихнуть непосредственно BSTR.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Обмен данными. Как настроить обмен между базами с разными метаданными?
- Универсальный обмен данными данными XML через COM с передачей параметров.
- 1С 8.1 УПП Обмен данными по 1С. ? - Обмен возможен только на одном ПК.
- 1С 8.1 УПП Обмен данными по 1С. ? - Обмен возможен только на одном ПК.
- обмен БУХ - УТ. Обмен ОбменУправлениеТорговлейБухгалтерия
- Типовой обмен данными: Не найден входящий файл обмена данными??
- Обмен работает только через обработку Универс.обмен данными XML.А как автоматом?
- COM - обмен через Универсальный обмен данными
- Обмен с помощью плана обмена и правил обмена.
- Унив. обмен данными из УТ 11 как внешняя обработка - не передает параметры
- Обмен через Универсальный обмен данными ошибка Бух3.0-Ут 11.2.
- КД 2: правила для "Универсальный обмен данными". И обмена данными, помеченными к выгрузке.
В этой группе 1С
- УТ 10.3 Печать счет фактуры
- Конвертация статей ДДС
- Макет компоновки данных в xml
- УПП настройка зарплаты РБП
- ББУ или БГУ Шаблоны текста "Назначение платежа" разделитель строк
- Как быстрее всего отключить регистрацию изменнений плана обмена
- Разделитель страниц в СКД
- v7: ВыгрузитьИтоги() не видит движения документов одного вида.
- Добавление строки в таб части документа.
- Пользователи дублируются в списке активных пользователей 1с 8
- Как из одной валюты сделать другую в УПП?
- Глючит считыватель магнитных карт
- Стал долго происходить обмен РИБ
- Задача про бЕлок
- Управление Торговлей 10.3 Отчет
- Обмен ЗУП - БП. Видны сотрудники и суммы. Как?
- Отличие конфигурация 1С 8 ББУ и 1С 8 БГУ
- Запрос 1С8 быстрый отбор
- Подскажите - как добавить разделитель в меню?
- Сумма в анализе счета не совпадает с суммой отчета по проводкам