Tracer 1C




Принцип обмена данными из 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. O-Planet

    САБЖ!

    Reply
  2. support

    Жесть!

    Reply
  3. O-Planet

    (2) ??? Типа страшно стало? 🙂

    Reply
  4. hogik

    НЕ жесть!

    Reply
  5. Душелов

    А в 8-ке как с памятью?

    Reply
  6. O-Planet

    (5) Если кто-то в 8-ке воспроизведет OnSave — тому, пожалуй, надо будет что-то круче пива поставить…

    Reply
  7. jhfrek

    Именно из-за того что такое окно постоянно выскакивает после закрытия 1С, я и перестал заниматься разработкой внешних компонент. Так как никто не смог внятно объяснить что же это такое и почему так происходит, а кто знает — тот скромно молчит, упиваясь силою своего знания в магии 1С.

    Reply
  8. Abadonna

    (7) Никакой магии… Если библиотека некорректно подчищает за собой (не разрушает объекты), окошко и будет вываливаться

    Reply
  9. Abadonna

    (0) А подправленную NewAssignAndCompile_done я тебе, Планет, между дрочим высылал. Там ничего не выскакивало

    Reply
  10. O-Planet

    (9) Твой вариант я посмотрел, но ты там проблему не решаешь, а от нее уходишь. Ты там применяешь перехват Ромикса для перекодировки модуля, но ты не создаешь в памяти новый модуль, а коварно используешь старый, созданный 1С, поскольку у тебя перекодировка идёт 1 к 1 по длине. Соответственно, ничего и не выскакивает. А ты попробуй обойтись без вот этого:

    for i := 1 to Length(s2) do begin

    t[i — 1] := s2[i];

    — а сделай что-то вроде t:=@s2[1] — и выскочит таже фигня.

    Reply
  11. O-Planet

    Глюк! t[i — 1] := s2[ i ]; — не пропечаталось 🙁

    Reply
  12. O-Planet

    (7) Нет, ты не о том говоришь. ты говоришь о случае, когда забывают сделать Unassigned на переменные OleVariant, либо когда применяют дестрактор, а потом 1С его повторно вызывает. В моем же случае ошибка плавает, т.е. появляется спонтанно. Поэтому я и предполагаю, что иногда память выскакивает из адресного пространства 1С

    Reply
  13. MMF

    (0) ну я бы начал с того, что

    function TAddInObject.Done: HResult; stdcall;

    begin

    pm.UnPatch;

    FreeAndNil(pm);

    FreeAndNil(MyCompile);

    Done := S_OK;

    У тебя Init вызывается два раза (ВК экспортирует один объект), соответственно создаются два pm и два MyCompile. На второй итерации первые теряются. Возможно, поможет с багом

    Reply
  14. O-Planet

    (13) Ошибка возникает вот тут:

    if MyCompile.Test(UnitText) then

    begin

    NewUnitText:=MyCompile.Run(UnitText)+#0;

    p:=@NewUnitText[1];

    t:=StrNew(p); // !!!

    asm

    mov ecx, [ecx111];

    mov eax, t; // ТУТ!

    mov dword ptr[ecx+$54], eax;

    end;

    end;

    Когда я создаю новый кусок памяти из StrNew и отдаю его в 1С. Читал как-то, что вначале любого перехвата нужно поставить петлю, т.е. зациклить процесс, иначе может произойти, что я буду переписывать asm-код, а он параллельно начнет выполняться. раньше думал на это. Но ромикс писал, что это здесь вроде решено.

    Reply
  15. JohnyDeath

    Отличная идея! +1 ставлю не глядя.

    А нельзя ли сделать закладку в настройках 1С, где будет включаться/выключаться этот Tracer? Также можно было б туда вынести и настройку вывода: либо в окно сообщений, либо в файл с указанным путем.

    Reply
  16. O-Planet

    (14) Думал об этом и написал даже в топике. Планирую сделать, но хоцца вначале глюк побороть совместными усилиями. В asm я не тяну, а он скорее всего там.

    Reply
  17. MMF

    (15) попробуй, воспроизводится-ли баг на: http://www.onlinedisk.ru/file/30560/

    Reply
  18. MMF

    (17+) это я чето не то закинул, пардон. Не смотрите

    Reply
  19. O-Planet

    (18) Выскочила ошибка сразу, но теперь память не в ноль уходит, а куда-то еще, и это — плюс: «Инструкция по адресу … обратилась к памяти по адресу 0х0539dab0» Попробую сейчас еще перекомпилировать все…

    Reply
  20. O-Planet

    (18) так и знал… 🙂

    Reply
  21. O-Planet

    Кстати, вроде догадался я, как лаг обойти. Надо проверить. И наверняка есть более хорошее решение.

    Reply
  22. Noy

    Хорошая идея! +1

    Также поддержу JohnyDeath по поводу включения/выключения

    [/i]

    P.S. Прикольный глюк — после 10 поста все сообщения идут курсивом — суппорту на заметку.

    Reply
  23. artbear

    OnSave от Ромикса — это что? что-то не припомню

    Ссылочку можно?

    Reply
  24. artbear

    (0) ИМХО проблема в том, что 1С пытается самостоятельно удалить память, занятую под текст модуля. А так как память выделяется не 1С-ким new, а самостоятельно в Дельфи, структура памяти не совпадает и труба 🙁

    Можно попробовать использовать системный вызов типа SysGetMem

    Reply
  25. artbear

    (24+) или системный HeapAlloc — в принципе, 1С-кий new обращается к нему же.

    Reply
  26. artbear

    (24+) Или вообще вычислить адрес функции malloc в любой dll-ке (basic, seven) и вызывать именно ее для выделения памяти под текст модуля.

    Reply
  27. artbear

    (24+) Или перехватить деструктор CBLModule7 — ??1CBLModule7@@UAE@XZ — и перед выполнением оригинального деструктора обнулять поле текст модуля — dword ptr[ecx+$54] и удалять данный адрес через Дельфовский FreeMem

    В этом случае 1C-кий delete (освобождение памяти) вызываться не будет !

    Reply
  28. artbear

    (24+) Сам уже Дельфи довольно сильно подзабыл, к сожалению.

    Все на МС С++ тружусь 🙂

    Поэтому сам доработать не могу 🙁

    Reply
  29. anonimka

    Просто спасибо 🙂

    Reply
  30. O-Planet

    (26) Я из всех вариантов думал только об этом, но схватить malloc из dll не знаю, как. 🙁

    Кстати, по 24… Так понимаю, что 1С пытается освободить память под модуль не всегда в конце работы?

    Reply
  31. O-Planet

    По 27 — сложно, потому что не все модули до этого были переопределены.

    Reply
  32. artbear

    (31) Так ты же можешь в перехватчике AssignAndCompile сохранить адрес this (ecx) в каком-нибудь массиве/векторе и т.д., а в перехватчике деструктора проверить, если адрес this (ecx) есть в этом массиве, выполнять указанную обработку 🙂

    .

    У меня в 1С++ именно так и сделано для нормальной обработки/хранения модулей, также основанном на перехвате деструкторе CBLModule 🙂

    Reply
  33. artbear

    (30) Да, в 1С юзается сборка мусора на основе ссылок, поэтому объекты освобождаются не всегда сразу же.

    Reply
  34. O-Planet

    (32) Ок. Но на asm код не напишу 🙁

    Reply
  35. artbear

    (34) Полная аналогия/копия с уже имеющимся кодом для АссигнАндКомпайл 🙂 — ИМХО один в один.

    Reply
  36. O-Planet

    Что-то типа:

    asm

    mov [ecx111],ecx;

    mov eax,[ecx+54h];

    mov t,eax;

    end;

    if InAdrArray(t) then

    begin

    dispose(t);

    asm

    mov ecx, [ecx111];

    mov eax, 0;

    mov dword ptr[ecx+$54], eax;

    end

    end;

    ?

    Reply
  37. O-Planet

    А в Init —

    pm.DllNameToPatch:=’Basic.dll’;

    pm.DllNameToFind:=’seven.dll’;

    pm.FuncNameToFind:=’??1CBLModule7@@UAE@XZ’;

    pm.NewFunctionAddr:=@NewCBLModule7;

    pm.Patch;

    ?

    Reply
  38. artbear

    да, похоже на правду

    Reply
  39. artbear

    (38) было к 36

    (37) pm.DllNameToPatch:=’Basic.dll’;

    pm.DllNameToFind:=’seven.dll’;

    а почему разные длл-ки? только seven.dll нужно вроде бы.

    Reply
  40. O-Planet

    (39) Ненаю. Я взял так, как у Ромикса в OnSave. Кстати, вот на нее ссылка: http://www.x-romix.narod.ru/vk_OnSave.rar

    Reply
  41. O-Planet

    Сейчас клиенту отправлю работу и буду все это пробовать…

    Reply
  42. Abadonna

    Ну во! Не шпингале… Со спокойно душой плюсик поставлю 😉

    Reply
  43. O-Planet

    (42) Ну не знаю… По трудоемкости и набору идей оно намного менее интересно, вообще-то.

    Reply
  44. Abadonna

    (43)Это потому ка тык ромиксовскую взял почти готовую. Один фиг, мне это больше импонирует

    Reply
  45. vkr

    Помереть — не встать !!! +5 баллов !!!

    А то задолбало модули проведения отслеживать… Ж8-)))

    Reply
  46. CheBurator

    > умная трассирочка

    видимо кассирочка покоя не дает!

    +1

    Reply
  47. CheBurator

    зачетная вещь.. частенько мне ее не хватало…

    Reply
  48. jhfrek

    Интересная деталь:

    Я загрузил эту ВК в почти чистую базу.

    Там все лишь одна обработка (это программа для расчёта по оплате электроэнергии для домашней бухгалтерии) 🙂

    Дело не в этом.

    Глобальный модуль там чистый. Ну и воткнул я туда это:

    Код
    Перем Tracer1C;
    //_____________________________________
    Процедура ПриНачалеРаботыСистемы()
        ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"Tracer1C.dll");
        Tracer1C=СоздатьОбъект("AddIn.Tracer1C");
        Tracer1C.Open();
    КонецПроцедуры  
    //_____________________________________
    Процедура ПриЗавершенииРаботыСистемы()
        Tracer1C.Close();
    КонецПроцедуры
    

    Показать полностью

    dll в базу закинул.

    Но когда запускаю 1С он всегда выкидывает это окно и закрывается, то есть никаким образом нельзя протестировать ВК.

    А вот когда я это закинул в типовую ТиС — работать стало.

    Может действительно есть здесь знатоки которые доработают эту ВК до ума.

    Вешь очень полезная!!! Очень хотелось бы чтобы она работала идеально.

    Reply
  49. O-Planet

    (49) Доработают. Сейчас проверю все то, что говорили с artbear, и если оно сработает, то считай, что сделали, а если нет, то у меня есть запасной ход.

    <чуть слышно размышляя> Кстати, мож правда имеет смысл в Трассирочку переименовать? %)

    Reply
  50. jhfrek

    Трассирочка???

    Хммм…

    Назвать конечно можешь как хочешь, но думаю это будет немного попахивать маразмом. Tracer 1C — это хорошее название.

    Я уверен что и без названия вокруг этого ВК начнут ходить красивые легенды.

    Reply
  51. O-Planet

    (51) Брось. Всего лишь обычный транслятор из GK, кстати, который навернул на OnSave за пару вечеров. Собственно, и на идею-то fixin натолкнул. Я понимаю, что выглядит необычно на фоне отчетиков, но спланировать и реализовать нормальный отчет намного сложнее.

    Reply
  52. jhfrek

    Кому как наверное.

    Мне например легче написать сложный отчёт, чем это.

    Reply
  53. O-Planet

    Это и обсуждается иногда активно промеж топиков, типа, у кого длиннее: у того, кто пишет ВК или отчеты? Ты правильно сказал, что проще, потому что более знакомо. Но это не означает, что оно — сложнее. Если чел владеет методом, то ВК — проще, потому что они в основном для разрабов и восполняют отсутствие каких-либо функций оболочки. Тут задача вполне конкретна и вопрос чисто технический. Написание отчета требует знания предметной области, плюс — специфики конкретного клиента, плюс — разработать удобную реализацию, учесть возможность доработки. И на фоне всего этого ТЗ бывает достаточно расплывчатым, клиент зачастую не подозревает, что ему надо.

    Reply
  54. vip

    (54) Плюсик за:

    — попытку (т.к. ВК состоится только после тестирования и отладки);

    — за честное упоминание romix’a (с другой стороны, любая программа это умелое использование API и оберток над ними для достижения нужной цели).

    А длиннее у того, кто пишет хорошо. И не важно, что пишет.

    И среди ВК бывают перенумераторы.

    Reply
  55. slavapil

    Что приходит в функцию CString или PChar ?

    Может можно освободить строку созданную 1С и подменить на строку из Delphi которую 1С освободит сама?

    Если это CString, то могу поделиться кодом создания его в Delphi.

    Reply
  56. АЛьФ

    Плюнь на Дельфи, перепиши все на VC++ по технологии Rainbow и, возможно, будет толк.

    Reply
  57. slavapil

    (56+)

    В фунцию вроде приходит CBLModule.

    Что в нем по смещению 54h mov eax,[ecx+54h] ?

    Reply
  58. slavapil

    Не могу воспроизвести ошибку !!!???

    Внешние обработки не перехватывает 🙁

    Reply
  59. O-Planet

    Хм… Если используется готовая dll, то я там отключил функции дебаггера. По 54h лежит программный модуль, который трассирую.

    Reply
  60. slavapil

    Может так:

    function c_malloc(size: Integer): Pointer; cdecl; external ‘msvcrt.dll’ name ‘malloc’;

    procedure c_free(p: Pointer); cdecl; external ‘msvcrt.dll’ name ‘free’;

    Reply
  61. slavapil

    (60)

    Использую исходники, правда Delphi 2006 🙂

    54h это что-то в CBLModule, интересно что именно там, CString или PChar?

    Reply
  62. slavapil

    Если там CString то:

    CString = PChar;

    function c_malloc(size: Integer): Pointer; cdecl; external ‘msvcrt.dll’ name ‘malloc’;

    procedure c_free(p: Pointer); cdecl; external ‘msvcrt.dll’ name ‘free’;

    function CString_Create(capacity: integer): CString;

    var p: Pointer;

    begin

    p := c_malloc(capacity + 13);

    FillChar(p#k8SjZc9Dxk, capacity + 13, 0);

    result := Pointer(Longword(p) + 12);

    PInteger(p)#k8SjZc9Dxk := 1;

    PInteger(Longword(p) + 4)#k8SjZc9Dxk := capacity;

    PInteger(Longword(p) + 8)#k8SjZc9Dxk := capacity + 13;

    end;

    function CString_Init(cstr: CString; const s: string): CString;

    begin

    if cstr = nil then begin

    result := CString_Create(Length(s) + 1);

    end else

    if PInteger(Longint(cstr) — 8)#k8SjZc9Dxk <= Length(s) then begin

    CString_Done(cstr);

    result := CString_Create(Length(s) + 1);

    end else begin

    result := cstr;

    end;

    StrCopy(result, PChar(s));

    end;

    procedure CString_Done(var cstr: CString);

    begin

    if cstr <> nil then begin

    c_free(Pointer(Longword(cstr) — 12));

    cstr := nil;

    end;

    end;

    Reply
  63. CheBurator

    > что и без названия вокруг этого ВК начнут ходить красивые легенды.

    ..угум.. типа задолбали Опланета на инфостарте до того, что достал Опланет из-под полы свой инструмент и показал, что есть еще ягоды в ягоди..тьфу, порох в пороховницах…

    😉

    Reply
  64. O-Planet

    То, о чем говорили с artbear не сработало. Предполагаю свои кривые ручонки. Но кому интересно, выкладываю отдельно AddInObj.pas

    (61) А где с_free вызвать? Оно по ходу вызывается в 1С. Попробую сейчас с с_malloc…

    Кстати, MMF прислал сейчас dll, которая стала в 2 раза меньше размером, и по ходу не глючная 😉

    Reply
  65. O-Planet

    (64) Просто удачно совпали праздники с отсутствием у меня на их период инета и с профукованием всвязи с этим хорошего заказа, вот и отдыхаю от 1С чуть-чуть 🙂

    Reply
  66. slavapil

    (65)

    с_free вызвать для того что 1С уже хранит.

    А с_malloc для своей строки вместо t.

    Может MMF, поделится исходником?

    Reply
  67. O-Planet

    Может и поделится. Но пока молчит 🙂

    Reply
  68. O-Planet

    ЫЫЫ!!! А с c_malloc вроде все ОК РАААББОООТТАААЕЕТТТ!!!! :))))

    Reply
  69. O-Planet

    ОБНОВИЛ ФАЙЛЫ, ПРОВЕРЯЙТЕ

    Reply
  70. slavapil

    (69) Это замечательно 😉

    Но если там CString, то может слететь 🙁

    Artbear, что там CString или PChar ?

    Reply
  71. O-Planet

    (71) Вообще, я взял из того, что ты написал, всего лишь function c_malloc(size: Integer): Pointer; cdecl; external ‘msvcrt.dll’ name ‘malloc’; и заменил им StrNew 🙂 Думаю, достаточно, потому что теперь 1) гарантированно попадаю в пространство 1С 2) 1С сама отвечает за удаление. Перехватить очистку не получилось: не силен я в асме

    Reply
  72. slavapil

    А кто очистит память зарезервированную 1С?

    Reply
  73. O-Planet

    Она же. Или ты имеешь ввиду те модули, которые я переопределяю, и которые теряются? Хм… Сейчас.

    Reply
  74. CheBurator

    (69) сколько мало нужно Программеру для счастья 😉

    Reply
  75. CheBurator

    предлагается чтоб была возможность трассировку складывать не в табло сообщений а в тектсовый файли (задаваемый, например, в качестве «параметра» при инициализации ВК или в ини-файле)…

    Reply
  76. O-Planet

    Обновил.

    По поводу перспектив развития.

    ___________________________

    1. Хочу добавить возможность управлять форматом вывода объектов на уровне 1С, а именно, если в модуле имеется функция Трассирочка(Сообщение,ИмяПеременной,ЗначениеПеременной), то передавать все сообщения и объекты ей

    2. Планирую добавить в Сервис настройку, а именно:

    — вкл/откл трассировки

    — вкл/откл сообщений трассировки по входу в процедуры

    — вкл/откл сообщений трассировки по выходу из процедуры

    — вкл/откл сообщений трассировки по входу в условные операторы

    — вкл/откл сообщений трассировки по присвоенным значениям

    Вот думаю, имеет ли смысл добавить сообщения на итерациях цикла?

    Reply
  77. CheBurator

    (77) в целом — да…

    но будет ли учтено, что если в функции стоит МОЯ ДИРЕКТИВА «TRACEOFF» — то трассировать, допустим, эту процедуру/функцию (и все вложенные) — не надо…???

    + отсюда сразу же возможность учета/игнорирования МОИХ ДЕРЕКТИВ.

    + управление хочется осущетвлять извне — т.е. допустим выключена трассировка — идет.. опа «кривизна» пошла — а перезапускать накладно — извне в ини файл подсовываю управляющую дитрективу — опа трассировка включилась…

    Reply
  78. CheBurator

    + пожелание: более полно формализовать трассировочные сообщения, для облегчени я последующего парсинга

    ..

    на рис.1 — ошибка:

    >> вход в функцию ПересчетСуммыВзаиморасчетов

    << выход ИЗ ПРОЦЕДУРЫ

    Reply
  79. CheBurator

    в случае вывода значений агрегатных типов хочется иметь не просто типа

    возвращаемое значение: USD, а также и «ИД» объекта, позволяющий его быстро локализовать — ЗначениевСтрокуВнутр (???)

    Reply
  80. CheBurator

    .. или в виде

    возвращаемое значение: Петров :: Справочник.Контрагенты :: ЗначениевстрокуВнутр

    возвращаемое значение: Поступление (купля-продажа) :: Перечисление.ВидыОпераций.Закупка :: ЗначениевстрокуВнутр

    Reply
  81. CheBurator

    вообще, конечно, если доведешь до ума — это тянет на лучшую разработку/идею года.

    убедительная просьба — не кидать на полпути!!!

    Reply
  82. O-Planet

    Формат выдаваемых сообщений предлагайте. Готов рассмотреть варианты. Можно вообще предложить настраиваемый формат, типа «включить в строку ЭТО»

    >> но будет ли учтено, что если в функции стоит МОЯ ДИРЕКТИВА «TRACEOFF» — то трассировать, допустим, эту процедуру/функцию (и все вложенные) — не надо…???

    Это уже реализовано. только пиши по тексту с пробелом:

    //TRACER OFF



    //TRACER ON

    >> в ини файл подсовываю управляющую дитрективу — опа трассировка включилась

    это надо обсуждать

    Reply
  83. O-Planet

    (82) Вообще, лучшая идея года — впереди. Даже две 🙂 Ты забыл о … <в поисках Vip-а>

    Reply
  84. O-Planet

    Если разработка действительно окажется кому-то полезной, то справедливости ради стоит упомянуть fixin-а. если бы он не создал тот топик, за который, кстати, нахватал минусов, то ничего бы не было, ни моей идеи, ни дружной работы по устранению бага.

    Reply
  85. CheBurator

    > Формат выдаваемых сообщений предлагайте.

    думайте! думайте!

    должно быть легко идентифицируемо/отделяемо

    — служебная часть сообщения (вход в проц, выход, условие иначе и т.д.)

    — содержательная часть сообщения, причем чтобы понять к чему относится содержательное часть — не лезть вверх по служебным сообщениям… и т.д.

    Reply
  86. CheBurator

    на итерациях цикла — только если включать где-то принудительно, в прочих случаях типа:

    >>> вход в цикл старт=1 стоп=873

    <<< выход из цикла при старт = 530 (т.е. например сработало «прервать»)

    Reply
  87. CheBurator

    + возможно опционально задавать настройку отступов ступеньками — таким образом оттрассировав можно получить вполне себе читабельный код!

    Reply
  88. CheBurator

    ОФИЦИАЛЬНО ЗАЯВЛЯЮ СВОИ ПРАВА НА СЛОГАН

    «ОТТРАССИРОВАТЬ КАССИРОЧКУ»

    !!!

    Reply
  89. Abadonna

    Планет, если ты кроме Result:=’;Сообщить(«‘ доделаешь еще возможность (на выбор)

    pEvent.ExternalEvent(‘tracer’, КатегорияСобытия, ОписаниеСобытия); на мой взгляд будет истчо лучше 😉

    Reply
  90. O-Planet

    (90) Это получится какая-то жесть. Можно будет смело ставить клиентам и при умелом обращении, обычная трассировка превращается в планомерное убисство. Хочет впечатлительная девушка, например, открыть накладную, а накладная на ее глазах помечается на удаление, из нее пропадают строки, меняются цифры…

    Reply
  91. Abadonna

    Есть одна забавная багофича. Трассер отслеживает только код в составе MD (под это и заточен), в ситуации когда модуль подгружается из внешнего файла

    #ЗагрузитьИзФайла ExtModulesСправочникиКонтрагентыМодульЭлемента.txt, имеем:

    <<?>>//*** Traced by O-Planet

    {Справочник.Контрагенты.Форма.Модуль(1)}: Обнаружено логическое завершение исходного текста модуля

    и затык, элемент не открывается! Планет, сам поправишь? 😉

    Надо проверочку на первую строчку кода на #ЗагрузитьИзФайла

    Reply
  92. Abadonna

    +(94) Вот так, например, трабл решается:

    if MyCompile.Test(UnitText) and (Pos(‘#ЗагрузитьИзФайла’,t)=0) then

    begin

    NewUnitText:=MyCompile.Run(UnitText)+#0;

    ………………………………………..

    Reply
  93. artbear

    (71) Вообще там, конечно, CString 🙂

    Но приведенный код вроде как должен работать.

    Самый правильный вариант — родные сишные malloc и free.

    Reply
  94. Шёпот теней

    класс!!!

    нет ничего дороже идеи… думаю кто голосовал «+» должны проголосовать и за fixin-а… хотя он и имел ввиду другую трассировку (48) …

    вооо-оо-от мнение…

    Reply
  95. slavapil

    Так как там CString, стоит использовать его, пример (63).

    Планируется трассировка внешних обработок/отчетов (.ERT)?

    Reply
  96. CheBurator

    мой (79) пост — что по поводу ошибки на рис.1

    ???

    Reply
  97. O-Planet

    (79) и (129) исправлено

    Reply
  98. CheBurator

    (135) — это хорошо!

    Reply
  99. slavapil

    при подключении глТрейсер.ExtTracer() (Пропадают первые буквы):

    лСформироватьСообщениеТрассировки<<?>>(Ключ,Имя,Зн);

    {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(9)}: Процедура не обнаружена (лСформироватьСообщениеТрассировки)

    <<?>>ункция СформироватьШтрихкод(Весовой, Код)

    {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(14)}: Переменная не определена (ункция)

    Return Tracer___Ret<<?>>;

    {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(96)}: Процедура не может возвращать значения

    <<?>>КонецФункции

    {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(99)}: Ожидается ключевое слово ‘КонецПроцедуры’ (‘EndProcedure’)

    Reply

Leave a Comment

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