ВК NativeAPI на Delphi и FreePascal




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

99 Comments

  1. slaviksoft

    😀

    Reply
  2. slaviksoft

    меня интересует — этот модуль на delphi Вы сами писали или это от 1С?

    Reply
  3. v77

    Сами конечно. Какой смысл выкладывать модуль от 1с?

    Reply
  4. sipoju

    Извините что не в тему, но мне тяжеловато работать с Делфями 😥

    Есть ли такое же только на С++? (Borland Builder или Visual C++)

    Reply
  5. v77

    На ИТС есть документация и примеры на Си++

    Reply
  6. DrAku1a

    Возможно ли использование на FPC+Lazarus?

    И еще — было бы неплохо и для v77 аналогичный ВК-класс сделать.

    Reply
  7. v77
    DrAku1a пишет:

    Возможно ли использование ?

    И еще — было бы неплохо и для v77 аналогичный ВК-класс сделать.

    Для FPC+Lazarus надо допиливать. Сходу не заработало, но заработает.

    Для v77 можно сделать, но вроде как уже и так хватает.

    Reply
  8. i-man

    есть возможность как то передавать не простые данные в ВК, а ссылки на элементы справочников или документов и уже внутри ВК с этими элементами работать?

    если можно примерчик небольшой

    спасибо заранее

    Reply
  9. v77

    Нету такой возмоности. В NativeAPI такое не предусмотрено.

    Reply
  10. cool.vlad4

    (8) зачем? для этого 1С есть…

    Reply
  11. romix

    Проверил однако работает! Спасибо!

    Reply
  12. romix

    Компонента на основе этой с полезным функционалом, которого отчасти не хватало в 1С 8.2 http://infostart.ru/public/88060/ (запуск процесса, переключение раскладки и др.).

    Reply
  13. UncleVader

    (9) Я так понимаю что не предусмотрен возврат и ссылок на таблицу значений или на какую другую коллекцию значений?

    Reply
  14. johnrex

    Скажите, пожалуйста, возможно ли с использованием NativeApi организовать поток (Delphi), который будет независимо выполнять определенные действия, и генерить в нужных ситуациях внешнее событие в 1С 8. В моем случае нужно опрашивать весы подключенные к com порту с периодичностью хотя бы раз в секунду и если они подключены при изменении веса отсылать данные в 1С. Обработчик ожидания не устраивает, так как 1С работает однопоточно и очень сильно висит при опросе com порта.

    Reply
  15. Sergey_Murzinov

    Спасиюо, толковая работа

    Reply
  16. zag2art

    (14) точно можно

    Reply
  17. zag2art

    (9) тот же вопрос, что и в (13) ответьте пожалуйста.

    Reply
  18. v77

    (13) Да

    Reply
  19. v77

    (13) Можно передавать только простые типы данных и вернуть из ВК двоичные данные. Вроде всё пока. Остальное 1С блокирует.

    Reply
  20. mur611

    Здравствуйте,

    Пробовал по примеру писать NativeAPI компоненту, но почему то не воспринимает функции, пишет «Поле объекта не обнаружено (Hello)». Или v8napi.pas от http://infostart.ru/public/88060/ не подходит для самого простого примера. А вообще стоит задача написать внешнюю компоненту для общения с COM портом. и используя ваш пример можно написать данную ВК?

    Reply
  21. mur611

    есть конечно примеры на CPP, но времени разбирать с Visual большого нет.

    Reply
  22. v77

    (20) видимо где то чего то неправильно понаписал. У всех работает нормально, жалоб не было.

    Reply
  23. mur611

    есть вопрос. Заключается он в том, что в ВК на технологии СОМ обработка ошибок во ВК производилась функцией RaiseLastOSError и все работает ОК, а вот теперь вроде сделал на Native API, и при вызове данной функции ВК, 1Ска закрывается (вылетает). какие методы есть решения? не подскажете.

    Reply
  24. v77

    (23) mur611,

    V8.AddError(wcode: word; const source: PWideChar;

    const descr: PWideChar;

    scode: integer): boolean;

    см. документацию от 1С

    Reply
  25. igor_kav

    есть вопрос, как вернуть массив? входные параметры функции — число, строка, а вот вернуть функция должна массив или olevariant, каа быть?

    Reply
  26. Spi1y

    (25) igor_kav, только генерировать строку с внутренним представлением любой коллекции (массив, структура, список значений, и т.д.), а в 1С уже преобразуешь с помощью ЗначениеИзСтрокиВнутр(). К сожалению, я не смог найти ни одного внятного описания структуры внутреннего представления ТаблицыЗначений, а по всем остальным коллекциям формат довольно простой.

    Сам на основе данного шаблона делал компоненту для внутреннего использования, с возвратом из функции массива. Если нужно, напиши, кину пример кода.

    Reply
  27. Spi1y

    Вот как раз и пример со структурой, у массива формат еще проще:

      pwi.cbSize := SizeOf(pwi);
    if WindowHandle <> 0 then begin
    Result := GetWindowInfo(WindowHandle, pwi);
    if Result then begin
    ResultString := ‘{«#»,4238019d-7e49-4fc9-91db-b6b951d5cf8e,{4,{{«S»,»Лево»},{«N»,’;
    ResultString := ResultString + IntToStr(pwi.rcWindow.Left) + ‘}},{{«S»,»Верх»},{«N»,’;
    ResultString := ResultString + IntToStr(pwi.rcWindow.Top) + ‘}},{{«S»,»Ширина»},{«N»,’;
    ResultString := ResultString + IntToStr(pwi.rcWindow.Right — pwi.rcWindow.Left) + ‘}},{{«S»,»Высота»},{«N»,’;
    ResultString := ResultString + IntToStr(pwi.rcWindow.Bottom — pwi.rcWindow.Top) + ‘}}}}’;
    end else
    ResultString := ‘{«#»,4238019d-7e49-4fc9-91db-b6b951d5cf8e,{0}}’;
    end;
    V8SetWString(RetValue, ResultString);
    

    Показать

    Reply
  28. igor_kav

    было бы здорово готовый код глянуть. скиньте, пожалуйста, на мыло igor_kav@mail.ru

    спасибо!

    Reply
  29. igor_kav

    спасибо! пока писал коммент, Вы уже выложили.

    Reply
  30. igor_kav

    а как быть с многомерным массивом?

    Reply
  31. Spi1y

    Кхм, понятия не имею. Честно говоря, ни разу за всю практику не сталкивался с необходимостью использования многомерных массивов. Но, если размышлять логически, то сам формат представления для массива таков:

    {«#»,4238019d-7e49-4fc9-91db-b6b951d5cf8e,{КоличествоЭлементов,{ОписаниеКлюча1, ОписаниеЗначения1}, … , {ОписаниеКлючаN, ОписаниеЗначенияN}}}

    где ОписаниеКлючаN и ОписаниеЗначенияN:

    {ОписаниеТипа,Значение}

    Логично предположить, что если описание тпа подставить Массив, и а в значение — внутреннюю строку вложенного массива, то должно получиться то, что нужно.

    Но надо проверять, конечно. Попозже гляну.

    Reply
  32. Spi1y

    Извиняюсь, как говориться, поспешишь — людей насмешишь. В предыдущем сообщении спутал понятия массивы и структуры. Массив разобрал, еще проще выходит:

    {«#»,51e7a0d2-530b-11d4-b98a-008048da3034,{КоличествоЭлементов,{ОписаниеЗначения1}, … , {ОписаниеЗначенияN}}}

    И действительно, для вложенных массивов достаточно в описание значения вместо строки {ОписаниеТипа,Значение} передать строку {ОписаниеМассива}, сформированную аналогично.

    Reply
  33. igor_kav

    Spi1y, Спасибо! ОЧЕНЬ помогли!

    Reply
  34. Spi1y

    Всегда пожалуйста 🙂

    Reply
  35. igor_kav

    Пару функций удалось сделать и использовать в 1С, но написал третью функцию в dll… при попытке использования в 1с именно этой третьей функции, 1с вылетает с ошибкой «Программа 1Сv8 не работает Возникшая проблема привела к прекращению работы программы. бла-бла». Самое интересное, что для тестирования создал проект VLC на delphi, поместил в него код функции. В VLC-проекте ФУНКЦИЯ РАБОТАЕТ!

    Какие есть варианты решения?

    Reply
  36. v77

    (35) igor_kav, покажи код

    Reply
  37. igor_kav
    Reply
  38. igor_kav

    поставил исключение в процедуре _CallAsFunc и получил ошибку:

    Внешняя компонента : Invalid pointer operation.

    Ошибка! {Форма.Форма.Форма(473)}: Ошибка при вызове метода контекста (ПолучитьМоиДанные): Ошибка внешней компоненты

    Reply
  39. v77

    (38) ну вроде всё правильно. смотри в отладчике.

    Reply
  40. igor_kav

    а как отладить dll?

    Reply
  41. igor_kav

    Прочитал, что СКОРЕЕ ВСЕГО УТЕЧКА ПАМЯТИ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ STRING, но как решить ума не приложу…

    Кто сталкивался, ПОМОГИТЕ!

    Reply
  42. v77

    (41) от утечки памяти такого не бывает. такое бывает когда используешь указатель, который ни на что не указывает.

    http://www.google.ru/#hl=ru&sugexp=frgbld&gs_nf=1&cp=14&gs_id=1o&xhr=t&q=%D0%BE%D1­%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0+dll+%D0%B2+delphi&pf=p&new­window=1&sclient=psy-ab&oq=%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0+dll+%D0%B2+­&aq=&aqi=&aql=&gs_l=&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=38a5e956b804066c&biw=1366&bih=667

    Reply
  43. igor_kav

    выдает ошибку External exception C000001D на строке:

    (RIO as AllegroWebApiPortType).doGetMyData(session_handle_part, user_data, invoice_data, company_extra_data,
    company_second_address, pharmacy_data, alcohol_data, related_persons);

    Но только в DLL, в EXE все нормально работает. В чем же все-таки причина?

    Reply
  44. igor_kav

    Можно ли передать функции параметр типа ТаблицаЗначений или XDTO пакет и как его потом в delphi разобрать?

    Reply
  45. v77

    (43) причина в ошибке. надо смотреть в отладчике. вышли мне исходники, я гляну. у тебя delphi 7?

    Reply
  46. igor_kav

    (45) спасибо! 🙂 ошибку нашел! все, как всегда, было банально просто. RIO не освобождал.

    Спасибо за проделанную работу, очень нужную вещь ВК NativeAPI на Delphi создали.

    Reply
  47. v77

    (46) да наздоровье

    Reply
  48. 0xe0

    Александр, из компоненты (*в вашей реализации) есть возможность обращаться к методам интерфейса 1С?

    Reply
  49. EmpireSer

    Объясните мне — зачем нужна структура «ТV8ObjectRec» ?

    Reply
  50. vladon

    На сервере x64 не работает, к сожалению. Ковыряю-ковыряю код, не пойму, в чём дело.

    Reply
  51. v77

    Я на 64 не пробовал. Может так заработает(см. прикрепленный файл)

    Reply
  52. vladon

    (51) это из оригинальных исходников от Александра Соломатина? Нет, тоже не получается.

    Reply
  53. v77

    Ну у меня нету сервера 64. пока ничем не могу помочь.

    Reply
  54. v77

    (52) vladon, а на клиенте 64 работает?

    Reply
  55. v77

    (52) vladon, а как не работает? в чем компилировалось?

    Reply
  56. vladon

    (54) клиента 64 же не существует.

    компилировалось Delphi XE2 и Delphi XE3.

    Reply
  57. v77

    (56) vladon, ну и как не работает то. в чем это не работает проявляется?

    Reply
  58. vladon

    (57) вот здесь лежит архив со всеми исходниками: http://narod.ru/disk/61615376001.5ca45c99a6ebdc7d919aa57124f0aa7b/SocketNative.zip.html

    в каталоге 1С есть .dt-шник, это база, где в общий макет залиты dll-ки с манифестом в зипе, dll-ки откомпилены delphi xe3, в любом случае все исходники там же

    и есть обработка, которая запускает подключение компоненты на сервере

    так вот, на 32-бит сервере компонента подключается — всё нормально отрабатывает

    на 64-бит сервере при нажатии кнопки «Подключить компоненту» сервер долго-долго думает, а потом клиент вылетает с сообщением, что сервер принудительно закрыл подключение.

    в любом случае, если есть возможность, попробуйте сами.

    Reply
  59. v77

    (58) vladon, попробуй такой вариант. у меня вроде работает. на сервере не проверял(нету у меня). проверял тестовой программой, которая загружает dll и читает список методов и свойств ВК. старая твоя ВК не грузилась, теперь стала грузиться. в архиве вариант модуля v8napi.pas. отпишись заработало или нет.

    Reply
  60. v77

    файл

    Reply
  61. vladon

    (60) огромное спасибо, работает.

    Reply
  62. andrewks

    какова лицензия на исходный код? возможно ли его использование в проектах под лицензией GPL v2/3?

    Reply
  63. v77

    Да используйте где хотите.

    Reply
  64. andrewks

    (63) не сочтите за наглость, но, так сказать, во избежание возможных недоразумений, можно при следующем обновлении в программных модулях указать тип лицензии на исходный код? например, Apache 2.0 (наиболее предпочтительная и либеральная), X11, или Modified BSD (неограниченное использование). или двойную лицензию GPL v2 и GPL v3 (на выбор пользователя).

    хотим тут один небольшой проектик замутить на базе модуля для FreePascal под лицензией GPL v2, в целях экономии времени на рутину хотим использовать Ваш модуль 😉

    спасибо.

    Reply
  65. eoego1

    Мегаценная вещь, спасибо автору большое! Но возник вопрос, мне очень нужно сделать так, чтобы во время работы какой либо одной функции вызванной по nativeapi из 1С, произошла передача данных (к примеру установка свойства формы или генерация внешенего события с передачей данных в 1С). Например:

    //процедура вызываемая из 1С

    function TMyClass.SleepFunc(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer; var v8:TV8AddInDefBase): boolean;

    var

    ms: Integer;

    begin

    ms := V8AsInt(@Params[1]); // к примеру 100.000

    //тут хочу вызвать исключение в 1С и передать в него строку «Привет я пошел спать!» или как-то иначе

    sleep(ms);

    //допустим тут еще раз хочу вызвать исключение

    //или установить свойство заголовка на форме или переменной модуля 1С. «Привет я проснулся!»

    result := True; //завершается вызванная функция

    end;

    После некоторых исследований, было установлено, что к примеру если вызвать во время работы функции sleep (или любой другой) функцию, например, вызова внешнего события, то оно генерируется не в то время, где я вызываю ExternalEvent, а только по выходу из основной функции. То есть у меня никак не получается передавать в 1С, например строку промежуточного результата работы функции во время ее работы. Все уходит в 1С только по выходу из нее. Как решить подобную задачу?

    Reply
  66. andrewks

    в модуле для FPC не нашёл функцию V8SetPWideChar ( возврат в 1С строки, представленной в FPC типом PWideChar )

    дописал. может, кому, пригодится:

    function TV8UserObject.V8SetPWideChar(V: PV8Variant;
    Value: PWideChar): boolean;
    var
    L, SZ: longword;
    begin
    
    result := (Value = nil);
    if result then
    Exit;
    
    V8ClearVar(V);
    V.vt := VTYPE_PWSTR;
    L := Length(Value);
    SZ := (L + 1) * SizeOf(WideChar);
    
    result := V8MM.AllocMemory(@(V.VarEnum.vtRecWideString.pwstrVal), SZ);
    if result then
    begin
    Move(Value#k8SjZc9Dxk, V.VarEnum.vtRecWideString.pwstrVal#k8SjZc9Dxk, SZ);
    V.VarEnum.vtRecWideString.wstrLen := L;
    end;
    end;
    
    

    Показать

    Reply
  67. andrewks

    в модуле для FPC ошибка в function _GetParamDefValue, вызывающая падение в случае, если параметры по умолчанию не заданы, а 1с видит, что методу передано меньше параметров и пытается запросить параметр по умолчанию

    правильный вариант кода:

    function _GetParamDefValue(Obj: PV8ObjectRec; const lMethodNum,
    lParamNum: integer; pvarParamDefValue: PV8Variant): boolean; stdcall;
    var
    ind: integer;
    begin
    result := False;
    if Obj.RelObj1.ClassReg.MethList[lMethodNum].DefParams <> nil then
    begin
    for ind := 0 to length(Obj.RelObj1.ClassReg.MethList[lMethodNum].DefParams.Values)-1 do
    begin
    if (Obj.RelObj1.ClassReg.MethList[lMethodNum].DefParams.Values[ind].Num = lParamNum) then
    begin
    pvarParamDefValue#k8SjZc9Dxk := Obj.RelObj1.ClassReg.MethList[lMethodNum].DefParams.Values[ind].Value;
    result := True;
    end;
    end;
    end;
    end;
    
    

    Показать

    Reply
  68. v77

    (67) andrewks, Спасибо. Исправлю.

    Reply
  69. andrewks

    что-то не ясен момент: в описании технологии Native API сказано, что BLOB (Двоичные данные) могут только возвращаться из компоненты в 1С, про передачу BLOB из 1С в компоненту ничего не сказано. при попытке передать ДвоичныеДанные в параметре метода 1С ругается на неверный параметр (до компоненты даже дело не доходит).

    однако в Вашем модуле есть функция по получению BLOB V8AsBlob(). У Вас получилось передать ДвоичныеДанные в компоненту? не поделитесь рецептом?

    Reply
  70. v77

    (69) andrewks, я не помню, что пробовал. ну если не дает, то значит нельзя. А V8AsBlob() наверное на всякий случай сделал.

    Reply
  71. fixin

    А в 81 работает?

    Reply
  72. andrewks

    (71) fixin, в 8.1 нет NativeAPI

    Reply
  73. UncleVader

    Раз уж добавили поддержку Lazarus, может попробуем и под Linux скомпилить?

    Вот тут есть готовая виртуальная машина с установленным Lazarus, попробовал в нем скомпилить выложенную демку, но она не подключается в контексте сервера 1С под x64 Ubuntu. Есть мысли? Спасибо!

    Reply
  74. v77

    Мыслей нет. А что нибудь другое подключается в контексте сервера 1С под x64 Ubuntu?

    Reply
  75. andrewks

    (73) UncleVader, там же написано, что под Android

    Reply
  76. UncleVader

    (74) У меня нет к сожалению ни одной ВК под linux, поэтому трудно сказать, дал бы кто попробовать…

    (75) andrewks, ну и что, главное что стоит настроенный Lazarus и компилит, в т.ч. и приложенный тут пример ВК

    Reply
  77. andrewks

    (76) UncleVader, я к тому, что если у Вас есть доступ к серваку с убунтой х64, то, может, стоит скомпилить прямо на нём? у меня на ноуте стоит убунта, но она там х32

    Reply
  78. UncleVader

    (77) andrewks, Чтоб на нем скомпилить туда надо поставить Lazarus, а для меня это китайская грамота ((

    Во вложении скомпиленная в упомянутой (73) системе, попробуйте может у Вас подключится

    Reply
  79. UncleVader

    Поставил 64 Ubuntu, на него Lazarus, скомпилил пример — на сервере не подключается ((

    Reply
  80. Magister

    удалено

    Reply
  81. SerG_121

    Почему когда я создаю поток у меня вылетает ошибка? В чем проблема? Код в прекрепленных файлах

    Reply
  82. v77

    Ну ты в отладчике посмотри где глючит. А ProcessMessages тебе зачем? Поставь вместо ProcessMessages sleep(0) для начала.

    Reply
  83. SerG_121

    (82)Я так и со слипом пробовал бесполезно! Попробуй у себя проверить мой код.

    Выдает ошибку и вылетает 1с именно когда запускается поток ReadThread

    Reply
  84. andrewks

    (83) SerG_121, видимо, у Вас исключение вылетает. попробуйте в try/except и выводить лог, может, прояснится

    Reply
  85. v77

    (83) SerG_121, Ты создаешь объект в 1с. Выполняешь его метод ОткрытьПорт. В методе ОткрытьПорт создается поток, который использует объект. Но объект после выполнения ОткрытьПорт автоматически убивается, но в потоке к нему есть обращение в Execute. Обращение к несуществующему объекту. Наверное по этому и глючит.

    Reply
  86. SerG_121

    (85)Может подскажешь как реализовать?

    Reply
  87. v77

    А чего надо реализовать?

    Reply
  88. SerG_121

    (87)Спасибо большое все разобрался )

    Reply
  89. TamDE

    Собрал ВК в Lazarus.

    Нашел небольшой глюк: если передать в функцию ФункцияПривет2 пустые строки, то платформа «валится»

    //Рез = Об.ФункцияПривет2(«Раз»,»Два»);
    Рез = Об.ФункцияПривет2(«»,»»);
    

    Обошел путем добавления условия

    if L > 0 then
    

    перед строкой

    Move(Value[1], V.VarEnum.vtRecWideString.pwstrVal#k8SjZc9Dxk, SZ);
    

    в методе V8SetWString

    Reply
  90. Magister

    В Linux таки не работает.

    Платформа грузит .so, вызывает несколько функций и валится по SIGSEGV.

    Вот что успевает вызвать:

    [quote]

    GetClassNames

    GetClassObject

    _setMemManager

    _GetInfo

    [/quote]

    После этого падение. Пока причину понять не смог, может быть будут идеи?

    Reply
  91. v77

    (90) Magister, есть идея посмотреть в отладчике. линуксов у меня нету.

    Reply
  92. Magister

    (91) Отладчик ловит исключение, и в качестве адреса показывает нулевые адреса. Бред полный 🙂

    Ещё немного поразбирался — судя по всему причина в том, что под Linux 1С компилируется с использованием GCC, а у него виртуальная таблица методов в памяти имеет другую структуру.

    Получается что «грязный» хак, с помощью которого вообще работает эта библиотека не срабатывает, т.к. TV8ProcRec не соответствует IComponentBase.

    Пока что удалось добиться таки вызова RegisterExtensionAs добавлением парочки пустых полей с типом Pointer, но теперь другая проблема — V8MM.AllocMemory() возвращает false…

    Reply
  93. andrewks

    (89) TamDE, что-то не так в Вашем королевстве.

    1. эта функция отвечает за возвращаемые значения, а не за передаваемые

    2. L не может быть равно 0

    3. у меня падения на пустых строках нет

    Reply
  94. andrewks

    (92) Magister, а Вы на какой платформе, и на каком дистре лин тестируете?

    Reply
  95. Magister

    (94) Ubuntu 12.10 x32, 1C 8.3.2 x32 файловая.

    На Windows с тем же релизом 1С всё хорошо.

    Reply
  96. andrewks

    (95) Magister, немного наблюдений:

    в Win 1с вызывает функции в таком порядке:

    Initialization

    GetClassObject()

    _Init()

    _setMemManager()

    _SetLocale()

    _GetInfo()

    _RegisterExtensionAs()



    _Done()

    DestroyObject()

    Finalization

    в Lin:

    Initialization

    GetClassObject()

    _setMemManager()

    _GetInfo()

    далее — падение до захода в _RegisterExtensionAs()

    почему-то в линуксе обходится стороной _Init()

    Reply
  97. andrewks

    (92) Magister, похоже, проблема с менеджером памяти. только у меня при попытке вызова AllocMemory() — сразу крах. пытаюсь в _setMemManager() вызвать AllocMemory() — в винде успешно, память выделяется, в лин — сразу крах.

    что-то с описанием интерфейса, может? соглашение о вызове, думаю, тут ни при чём

    Reply
  98. babybu

    А может кто подскажет, можно ли в функцию ВК, написанную по NativeAPI, передавать массив или может структуру? И как это делать? В HasRetVal определил метод, как функцию, в GetNParams задал количество параметров данного метода — 1. Метод называется «Подключить». Если передаю скалярный параметр — все нормально (Компонента.Подключить(1)), а если пытаюсь передать массив или структуру (Компонента.Подключить(Массив)) — выдает ошибку в 1С — неверный аргумент.

    Reply
  99. rfootq

    (61)Добрый день. Владислав, можете уточнить, что именно заработало? Компонента на 64 битном приложении, компилируется, и работает в 1с, то есть подключается, и выполняет всю свою функциональность? То есть помогло применение модуля из архива SocketNative64.zip? А компилировали Lazarus_ом? Версия компилятора тоже 64, или кросс-компилятором?

    Блин, я никак не пойму, при попытке выделить память падает все… Если не сложно подскажите где что еще можно подправить, с учетом архитектуры. (Все на винде пока что)… Спасибо.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *