gifts2017

Tracer 1C

Опубликовал Олег Пономаренко (O-Planet) в раздел Программирование - Внешние компоненты

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

ОПИСАНИЕ

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

Предлагаю свое решение проблемы автоматизации трассировки программных модулей на базе внешней компоненты.

Tracer автоматически формирует сообщения:

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

Все сообщения формируются динамически, в процессе работы, т.е. НЕ ТРЕБУЕТСЯ вручную вносить каких-либо изменений в программные модули справочников, документов и отчетов. Также Tracer не портит Ваши модули: внесенные изменения не сохраняются.

В качестве примера поместил в "Подробное описание" лог трассировки проведения расходной накладной из демо-базы 1С:Торговля и склад 7.7

ВЫКЛАДЫВАЮ ИСХОДНИКИ для желающих что-либо доработать под себя, поскольку тема трассировки достаточно интересна, и идей тут может быть сколько угодно: умная трассирочка таблиц значений, окно настройки и т.д. Я решил задачу лишь в общем. Платформа - Delphi 7

Кто уже понял, прототипом был взят метод, описанный в "OnSave" romix-ом. Кстати, с этим связана одна проблема, о которой я скажу чуть ниже...

УСТАНОВКА

1. Скопировать Tracer1C.dll в каталог информационной базы
2. В глобальный модуль внести небольшие изменения

// В начале модуля добавляем
Перем глТрейсер Экспорт;
...

Процедура ПриНачалеРаботыСистемы()
...
// В конце процедуры добавляем
ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"Tracer1C.dll");
  глТрейсер=СоздатьОбъект("AddIn.Tracer1C");
  глТрейсер.Open();
// Если используется внешняя обработка трассировки, то включить строку:
глТрейсер.ExtTracer();
// Если необходимо трассировать не все, а лишь те модули, где вначале стоит
//TRACER ON, то включить строку:
глТрейсер.TraceAll(0);
КонецПроцедуры  

Процедура ПриЗавершенииРаботыСистемы()
// В начале процедуры добавляем
глТрейсер.Close();
...

КонецПроцедуры  



После этого просто работайте в своей программе, а сообщения трассировки будут появляться в окне сообщений. Конечно, ни что не мешает их выводить в файл.

РЕЖИМЫ РАБОТЫ И РАСШИРЕНИЯ

Метод TraceAll позволяет управлять работой внешней компоненты. По умолчанию происходит трассировка всех модулей. После вызова глТрейсер.TraceAll(0) трассируются только те модули, первой строчкой которых стоит комментарий

//TRACER ON

Соответственно, вызов глТрейсер.TraceAll(1) возвращает режим трассировки всех модулей

Текущая реализация позволяет направлять формируемые компонентой сообщения трассировки на вход процедуры в глобальном модуле и соответственно, обрабатывать на уровне 1С. Включение метода глТрейсер.ExtTracer() говорит трейсеру о том, что в состав глобального модуля включена функция

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

Выкладываю свой пример реализации расширения трассировки, позволяющий формировать печатную таблицу сообщений трассировки, направлять вывод в файл и в окно сообщений, а также включать/отключать различные режимы трассировки. Подробное описание по использованию смотреть в модуле Трассировка.ert Разумеется, каждый может взять за основу эту обработку и сделать нечто свое, супер навороченное. С удовольствием дам ссылки на такие разработки и выложу их здесь по желанию авторов.

БЫЛА ПРОБЛЕМА, НАДЕЮСЬ РЕШИЛИ

Иногда в процессе работы выпадал из адресного пространства 1С, и платформа свертывалась, вылетая по ошибке, при попытке записать что-то в пустоту. Происходило не часто, но неприятно. Похоже, всеобщими усилиями проблему решили, но стоит потестить. По крайней мере, у меня не вылетает больше.

Особые благодарности в виде рукопожатий, пива, поцелуев при встрече (девушки) и всяческих похвал, А ТАКЖЕ плюсиков в комментах и веб-маней (особо благодарные) выражаем slavapil, artbear и MMF, без чьего участия ничего бы не получилось

Кстати, если Вы хотите поблагодарить плюсиками вышеназванных разработчиков, то можно не лазить по топику. Просто щелкаем по этим ссылкам прямо здесь:

slavapil: http://infostart.ru/projects/2826/rate.php?rate=1&cid=63&cp=all
artbear: http://infostart.ru/projects/2826/rate.php?rate=1&cid=32&cp=all
MMF: http://infostart.ru/projects/2826/rate.php?rate=1&cid=13&cp=all

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

Тема нашла продолжение здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1232197179

Купи премиум доступ - поддержи наше Сообщество!

Если Вы приобретаете премиум-аккаунт с этой страницы, то я, как автор, предоставляю Вам гарантированную скидку 10 % на все мои платные разработки, которые Вас заинтересуют...  Для приобретения премиум-аккаунта перейдите по этой С С Ы Л К Е

________________
Буду рад услышать комментарии, пожелания по доработке!

Скачать файлы

Наименование Файл Версия Размер
Внешняя компонента 769
.1225901920 71,95Kb
25.09.09
769
.1225901920 71,95Kb Скачать
Исходники Tracer 1C на Delphi 7 408
.1225902089 17,78Kb
25.09.09
408
.1225902089 17,78Kb Скачать
Мой пример реализации внешней трассировки 488
.1226279216 44,00Kb
25.09.09
488
.1226279216 44,00Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Олег Пономаренко (O-Planet) 05.11.08 19:32
2. Доржи Цыденов (support) 05.11.08 21:09
3. Олег Пономаренко (O-Planet) 05.11.08 21:12
(2) ??? Типа страшно стало? :)
4. Владимир (hogik) 05.11.08 21:14
5. Василий Демидов (Душелов) 05.11.08 21:15
6. Олег Пономаренко (O-Planet) 05.11.08 21:18
(5) Если кто-то в 8-ке воспроизведет OnSave - тому, пожалуй, надо будет что-то круче пива поставить...
7. Оракул Айметдинов (jhfrek) 05.11.08 21:36
Именно из-за того что такое окно постоянно выскакивает после закрытия 1С, я и перестал заниматься разработкой внешних компонент. Так как никто не смог внятно объяснить что же это такое и почему так происходит, а кто знает - тот скромно молчит, упиваясь силою своего знания в магии 1С.
8. Аркадий Кучер (Abadonna) 05.11.08 21:38
(7) Никакой магии... Если библиотека некорректно подчищает за собой (не разрушает объекты), окошко и будет вываливаться
9. Аркадий Кучер (Abadonna) 05.11.08 21:45
(0) А подправленную NewAssignAndCompile_done я тебе, Планет, между дрочим высылал. Там ничего не выскакивало
10. Олег Пономаренко (O-Planet) 05.11.08 21:57
(9) Твой вариант я посмотрел, но ты там проблему не решаешь, а от нее уходишь. Ты там применяешь перехват Ромикса для перекодировки модуля, но ты не создаешь в памяти новый модуль, а коварно используешь старый, созданный 1С, поскольку у тебя перекодировка идёт 1 к 1 по длине. Соответственно, ничего и не выскакивает. А ты попробуй обойтись без вот этого:

for i := 1 to Length(s2) do begin
t[i - 1] := s2[i];

- а сделай что-то вроде t:=@s2[1] - и выскочит таже фигня.
11. Олег Пономаренко (O-Planet) 05.11.08 21:59
Глюк! t[i - 1] := s2[ i ]; - не пропечаталось :(
12. Олег Пономаренко (O-Planet) 05.11.08 22:03
(7) Нет, ты не о том говоришь. ты говоришь о случае, когда забывают сделать Unassigned на переменные OleVariant, либо когда применяют дестрактор, а потом 1С его повторно вызывает. В моем же случае ошибка плавает, т.е. появляется спонтанно. Поэтому я и предполагаю, что иногда память выскакивает из адресного пространства 1С
13. Михаил Усков (MMF) 05.11.08 22:23
(0) ну я бы начал с того, что
function TAddInObject.Done: HResult; stdcall;
begin
pm.UnPatch;
FreeAndNil(pm);
FreeAndNil(MyCompile);
Done := S_OK;
У тебя Init вызывается два раза (ВК экспортирует один объект), соответственно создаются два pm и два MyCompile. На второй итерации первые теряются. Возможно, поможет с багом
nati_dom; popenko; tonyz; Shaman100M; theshadowco; talb; novator; GerinG; buzzzard; thesharkman; Valet; tjSolomon; bdimas; kolga; antz; disa_da; redcat; roger; s_alex_s; homm3; brr; ded00786; Ёпрст; Булгахтер; Fedorenko; GrayT; jhfrek; support; Omni; Pari; BorovikSV; Donat; nickVZ; vladG; Sol; Mucmepukc; +36 Ответить 1
14. Евгений Мартыненков (JohnyDeath) 05.11.08 22:36
Отличная идея! +1 ставлю не глядя.
А нельзя ли сделать закладку в настройках 1С, где будет включаться/выключаться этот Tracer? Также можно было б туда вынести и настройку вывода: либо в окно сообщений, либо в файл с указанным путем.
15. Олег Пономаренко (O-Planet) 05.11.08 22:36
(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-код, а он параллельно начнет выполняться. раньше думал на это. Но ромикс писал, что это здесь вроде решено.
16. Олег Пономаренко (O-Planet) 05.11.08 22:38
(14) Думал об этом и написал даже в топике. Планирую сделать, но хоцца вначале глюк побороть совместными усилиями. В asm я не тяну, а он скорее всего там.
17. Михаил Усков (MMF) 05.11.08 23:14
(15) попробуй, воспроизводится-ли баг на: http://www.onlinedisk.ru/file/30560/
18. Михаил Усков (MMF) 05.11.08 23:19
(17+) это я чето не то закинул, пардон. Не смотрите
19. Олег Пономаренко (O-Planet) 05.11.08 23:23
(18) Выскочила ошибка сразу, но теперь память не в ноль уходит, а куда-то еще, и это - плюс: "Инструкция по адресу ... обратилась к памяти по адресу 0х0539dab0" Попробую сейчас еще перекомпилировать все...
20. Олег Пономаренко (O-Planet) 05.11.08 23:24
21. Олег Пономаренко (O-Planet) 06.11.08 06:39
Кстати, вроде догадался я, как лаг обойти. Надо проверить. И наверняка есть более хорошее решение.
22. Алексей Плутенко (Noy) 06.11.08 09:36
Хорошая идея! +1
Также поддержу JohnyDeath по поводу включения/выключения
[/i]
P.S. Прикольный глюк - после 10 поста все сообщения идут курсивом - суппорту на заметку.
23. Артур Аюханов (artbear) 06.11.08 10:17
OnSave от Ромикса - это что? что-то не припомню
Ссылочку можно?
24. Артур Аюханов (artbear) 06.11.08 10:40
(0) ИМХО проблема в том, что 1С пытается самостоятельно удалить память, занятую под текст модуля. А так как память выделяется не 1С-ким new, а самостоятельно в Дельфи, структура памяти не совпадает и труба :(
Можно попробовать использовать системный вызов типа SysGetMem
25. Артур Аюханов (artbear) 06.11.08 10:43
(24+) или системный HeapAlloc - в принципе, 1С-кий new обращается к нему же.
26. Артур Аюханов (artbear) 06.11.08 10:49
(24+) Или вообще вычислить адрес функции malloc в любой dll-ке (basic, seven) и вызывать именно ее для выделения памяти под текст модуля.
27. Артур Аюханов (artbear) 06.11.08 11:10
(24+) Или перехватить деструктор CBLModule7 - ??1CBLModule7@@UAE@XZ - и перед выполнением оригинального деструктора обнулять поле текст модуля - dword ptr[ecx+$54] и удалять данный адрес через Дельфовский FreeMem
В этом случае 1C-кий delete (освобождение памяти) вызываться не будет !
28. Артур Аюханов (artbear) 06.11.08 11:17
(24+) Сам уже Дельфи довольно сильно подзабыл, к сожалению.
Все на МС С++ тружусь :)
Поэтому сам доработать не могу :(
29. Anonimka (anonimka) 06.11.08 12:51
30. Олег Пономаренко (O-Planet) 06.11.08 13:30
(26) Я из всех вариантов думал только об этом, но схватить malloc из dll не знаю, как. :(
Кстати, по 24... Так понимаю, что 1С пытается освободить память под модуль не всегда в конце работы?
31. Олег Пономаренко (O-Planet) 06.11.08 13:32
По 27 - сложно, потому что не все модули до этого были переопределены.
32. Артур Аюханов (artbear) 06.11.08 14:26
(31) Так ты же можешь в перехватчике AssignAndCompile сохранить адрес this (ecx) в каком-нибудь массиве/векторе и т.д., а в перехватчике деструктора проверить, если адрес this (ecx) есть в этом массиве, выполнять указанную обработку :)
.
У меня в 1С++ именно так и сделано для нормальной обработки/хранения модулей, также основанном на перехвате деструкторе CBLModule :)
nati_dom; Alkore; AMUDAT1; zemochka; Shaman100M; talb; vasiliy_b; novator; buzzzard; thesharkman; tjSolomon; kolga; antz; vitaliy.ermolenko; disa_da; redcat; roger; -=Лысый=-; s_alex_s; homm3; Fenixs; brr; sergiosinicin; ADirks; Jers; ded00786; Булгахтер; lero@riz; Fedorenko; GrayT; jhfrek; support; Pari; Donat; vladG; Sol; Mucmepukc; slavapil; +38 Ответить 1
33. Артур Аюханов (artbear) 06.11.08 14:28
(30) Да, в 1С юзается сборка мусора на основе ссылок, поэтому объекты освобождаются не всегда сразу же.
34. Олег Пономаренко (O-Planet) 06.11.08 14:32
(32) Ок. Но на asm код не напишу :(
35. Артур Аюханов (artbear) 06.11.08 14:36
(34) Полная аналогия/копия с уже имеющимся кодом для АссигнАндКомпайл :) - ИМХО один в один.
36. Олег Пономаренко (O-Planet) 06.11.08 14:40
Что-то типа:
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;

?
37. Олег Пономаренко (O-Planet) 06.11.08 14:47
А в Init -

pm.DllNameToPatch:='Basic.dll';
pm.DllNameToFind:='seven.dll';
pm.FuncNameToFind:='??1CBLModule7@@UAE@XZ';
pm.NewFunctionAddr:=@NewCBLModule7;
pm.Patch;

?
38. Артур Аюханов (artbear) 06.11.08 14:47
39. Артур Аюханов (artbear) 06.11.08 14:55
(38) было к 36
(37) pm.DllNameToPatch:='Basic.dll';
pm.DllNameToFind:='seven.dll';
а почему разные длл-ки? только seven.dll нужно вроде бы.
40. Олег Пономаренко (O-Planet) 06.11.08 15:15
(39) Ненаю. Я взял так, как у Ромикса в OnSave. Кстати, вот на нее ссылка: http://www.x-romix.narod.ru/vk_OnSave.rar
41. Олег Пономаренко (O-Planet) 06.11.08 15:19
Сейчас клиенту отправлю работу и буду все это пробовать...
42. Аркадий Кучер (Abadonna) 06.11.08 15:35
Ну во! Не шпингале... Со спокойно душой плюсик поставлю ;)
43. Олег Пономаренко (O-Planet) 06.11.08 15:43
(42) Ну не знаю... По трудоемкости и набору идей оно намного менее интересно, вообще-то.
44. Аркадий Кучер (Abadonna) 06.11.08 15:44
(43)Это потому ка тык ромиксовскую взял почти готовую. Один фиг, мне это больше импонирует
45. vkr (vkr) 06.11.08 17:19
Помереть - не встать !!! +5 баллов !!!
А то задолбало модули проведения отслеживать... Ж8-)))
46. Сhe Burashka (CheBurator) 06.11.08 18:13
> умная трассирочка
видимо кассирочка покоя не дает!
+1
47. Сhe Burashka (CheBurator) 06.11.08 18:14
зачетная вещь.. частенько мне ее не хватало...
49. Оракул Айметдинов (jhfrek) 06.11.08 20:42
Интересная деталь:
Я загрузил эту ВК в почти чистую базу.
Там все лишь одна обработка (это программа для расчёта по оплате электроэнергии для домашней бухгалтерии) :-)
Дело не в этом.
Глобальный модуль там чистый. Ну и воткнул я туда это:
Код
Перем Tracer1C;
//_____________________________________
Процедура ПриНачалеРаботыСистемы()
    ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"Tracer1C.dll");
    Tracer1C=СоздатьОбъект("AddIn.Tracer1C");
    Tracer1C.Open();
КонецПроцедуры  
//_____________________________________
Процедура ПриЗавершенииРаботыСистемы()
    Tracer1C.Close();
КонецПроцедуры 
Показать полностью

dll в базу закинул.
Но когда запускаю 1С он всегда выкидывает это окно и закрывается, то есть никаким образом нельзя протестировать ВК.
А вот когда я это закинул в типовую ТиС - работать стало.
Может действительно есть здесь знатоки которые доработают эту ВК до ума.
Вешь очень полезная!!! Очень хотелось бы чтобы она работала идеально.
50. Олег Пономаренко (O-Planet) 06.11.08 21:22
(49) Доработают. Сейчас проверю все то, что говорили с artbear, и если оно сработает, то считай, что сделали, а если нет, то у меня есть запасной ход.

<чуть слышно размышляя> Кстати, мож правда имеет смысл в Трассирочку переименовать? %)
51. Оракул Айметдинов (jhfrek) 06.11.08 21:52
Трассирочка???
Хммм...
Назвать конечно можешь как хочешь, но думаю это будет немного попахивать маразмом. Tracer 1C - это хорошее название.
Я уверен что и без названия вокруг этого ВК начнут ходить красивые легенды.
52. Олег Пономаренко (O-Planet) 06.11.08 21:58
(51) Брось. Всего лишь обычный транслятор из GK, кстати, который навернул на OnSave за пару вечеров. Собственно, и на идею-то fixin натолкнул. Я понимаю, что выглядит необычно на фоне отчетиков, но спланировать и реализовать нормальный отчет намного сложнее.
53. Оракул Айметдинов (jhfrek) 06.11.08 22:02
Кому как наверное.
Мне например легче написать сложный отчёт, чем это.
54. Олег Пономаренко (O-Planet) 06.11.08 22:30
Это и обсуждается иногда активно промеж топиков, типа, у кого длиннее: у того, кто пишет ВК или отчеты? Ты правильно сказал, что проще, потому что более знакомо. Но это не означает, что оно - сложнее. Если чел владеет методом, то ВК - проще, потому что они в основном для разрабов и восполняют отсутствие каких-либо функций оболочки. Тут задача вполне конкретна и вопрос чисто технический. Написание отчета требует знания предметной области, плюс - специфики конкретного клиента, плюс - разработать удобную реализацию, учесть возможность доработки. И на фоне всего этого ТЗ бывает достаточно расплывчатым, клиент зачастую не подозревает, что ему надо.
55. vip (vip) 06.11.08 22:53
(54) Плюсик за:
- попытку (т.к. ВК состоится только после тестирования и отладки);
- за честное упоминание romix'a (с другой стороны, любая программа это умелое использование API и оберток над ними для достижения нужной цели).

А длиннее у того, кто пишет хорошо. И не важно, что пишет.
И среди ВК бывают перенумераторы.
56. Вячеслав (slavapil) 06.11.08 23:01
Что приходит в функцию CString или PChar ?

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

Если это CString, то могу поделиться кодом создания его в Delphi.
57. АЛьФ (АЛьФ) 06.11.08 23:03
Плюнь на Дельфи, перепиши все на VC++ по технологии Rainbow и, возможно, будет толк.
58. Вячеслав (slavapil) 06.11.08 23:27
(56+)
В фунцию вроде приходит CBLModule.
Что в нем по смещению 54h mov eax,[ecx+54h] ?
59. Вячеслав (slavapil) 07.11.08 00:17
Не могу воспроизвести ошибку !!!???

Внешние обработки не перехватывает :(
60. Олег Пономаренко (O-Planet) 07.11.08 00:22
Хм... Если используется готовая dll, то я там отключил функции дебаггера. По 54h лежит программный модуль, который трассирую.
61. Вячеслав (slavapil) 07.11.08 00:32
Может так:

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

procedure c_free(p: Pointer); cdecl; external 'msvcrt.dll' name 'free';
62. Вячеслав (slavapil) 07.11.08 00:36
(60)
Использую исходники, правда Delphi 2006 :)

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

63. Вячеслав (slavapil) 07.11.08 00:44
Если там 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^, capacity + 13, 0);
result := Pointer(Longword(p) + 12);
PInteger(p)^ := 1;
PInteger(Longword(p) + 4)^ := capacity;
PInteger(Longword(p) + 8)^ := 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)^ <= 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;
nati_dom; guns1800; AMUDAT1; tonyz; Shaman100M; talb; fos; vasiliy_b; meser; kav; Americanz; novator; buzzzard; thesharkman; das; Valet; tjSolomon; bdimas; andrey64; kolga; antz; Parodist; Smaue; disa_da; aikosyapr; redcat; vadver; roger; s_alex_s; homm3; brr; sergiosinicin; anton905; ded00786; Sigrlami; ss; Булгахтер; lero@riz; Fedorenko; GrayT; jhfrek; support; Pari; Donat; dancer; qwak; NoMax; vladG; Mucmepukc; IamAlexy; O-Planet; +51 Ответить 1
64. Сhe Burashka (CheBurator) 07.11.08 00:49
> что и без названия вокруг этого ВК начнут ходить красивые легенды.
..угум.. типа задолбали Опланета на инфостарте до того, что достал Опланет из-под полы свой инструмент и показал, что есть еще ягоды в ягоди..тьфу, порох в пороховницах...
;-)
65. Олег Пономаренко (O-Planet) 07.11.08 00:52
То, о чем говорили с artbear не сработало. Предполагаю свои кривые ручонки. Но кому интересно, выкладываю отдельно AddInObj.pas

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

Кстати, MMF прислал сейчас dll, которая стала в 2 раза меньше размером, и по ходу не глючная ;)
66. Олег Пономаренко (O-Planet) 07.11.08 00:57
(64) Просто удачно совпали праздники с отсутствием у меня на их период инета и с профукованием всвязи с этим хорошего заказа, вот и отдыхаю от 1С чуть-чуть :)
67. Вячеслав (slavapil) 07.11.08 01:00
(65)
с_free вызвать для того что 1С уже хранит.

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

Может MMF, поделится исходником?
68. Олег Пономаренко (O-Planet) 07.11.08 01:06
Может и поделится. Но пока молчит :)
69. Олег Пономаренко (O-Planet) 07.11.08 01:23
ЫЫЫ!!! А с c_malloc вроде все ОК РАААББОООТТАААЕЕТТТ!!!! :))))
70. Олег Пономаренко (O-Planet) 07.11.08 01:47
ОБНОВИЛ ФАЙЛЫ, ПРОВЕРЯЙТЕ
71. Вячеслав (slavapil) 07.11.08 01:48
(69) Это замечательно ;)
Но если там CString, то может слететь :(

Artbear, что там CString или PChar ?
72. Олег Пономаренко (O-Planet) 07.11.08 01:53
(71) Вообще, я взял из того, что ты написал, всего лишь function c_malloc(size: Integer): Pointer; cdecl; external 'msvcrt.dll' name 'malloc'; и заменил им StrNew :) Думаю, достаточно, потому что теперь 1) гарантированно попадаю в пространство 1С 2) 1С сама отвечает за удаление. Перехватить очистку не получилось: не силен я в асме
73. Вячеслав (slavapil) 07.11.08 02:00
А кто очистит память зарезервированную 1С?
74. Олег Пономаренко (O-Planet) 07.11.08 02:02
Она же. Или ты имеешь ввиду те модули, которые я переопределяю, и которые теряются? Хм... Сейчас.
75. Сhe Burashka (CheBurator) 07.11.08 02:05
(69) сколько мало нужно Программеру для счастья ;-)
76. Сhe Burashka (CheBurator) 07.11.08 02:15
предлагается чтоб была возможность трассировку складывать не в табло сообщений а в тектсовый файли (задаваемый, например, в качестве "параметра" при инициализации ВК или в ини-файле)...
77. Олег Пономаренко (O-Planet) 07.11.08 02:19
Обновил.

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

2. Планирую добавить в Сервис настройку, а именно:
- вкл/откл трассировки
- вкл/откл сообщений трассировки по входу в процедуры
- вкл/откл сообщений трассировки по выходу из процедуры
- вкл/откл сообщений трассировки по входу в условные операторы
- вкл/откл сообщений трассировки по присвоенным значениям

Вот думаю, имеет ли смысл добавить сообщения на итерациях цикла?
78. Сhe Burashka (CheBurator) 07.11.08 02:30
(77) в целом - да...
но будет ли учтено, что если в функции стоит МОЯ ДИРЕКТИВА "TRACEOFF" - то трассировать, допустим, эту процедуру/функцию (и все вложенные) - не надо...???
+ отсюда сразу же возможность учета/игнорирования МОИХ ДЕРЕКТИВ.
+ управление хочется осущетвлять извне - т.е. допустим выключена трассировка - идет.. опа "кривизна" пошла - а перезапускать накладно - извне в ини файл подсовываю управляющую дитрективу - опа трассировка включилась...
79. Сhe Burashka (CheBurator) 07.11.08 02:34
+ пожелание: более полно формализовать трассировочные сообщения, для облегчени я последующего парсинга
..
на рис.1 - ошибка:
>> вход в функцию ПересчетСуммыВзаиморасчетов
<< выход ИЗ ПРОЦЕДУРЫ
80. Сhe Burashka (CheBurator) 07.11.08 02:37
в случае вывода значений агрегатных типов хочется иметь не просто типа
возвращаемое значение: USD, а также и "ИД" объекта, позволяющий его быстро локализовать - ЗначениевСтрокуВнутр (???)
81. Сhe Burashka (CheBurator) 07.11.08 02:41
.. или в виде
возвращаемое значение: Петров :: Справочник.Контрагенты :: ЗначениевстрокуВнутр
возвращаемое значение: Поступление (купля-продажа) :: Перечисление.ВидыОпераций.Закупка :: ЗначениевстрокуВнутр
82. Сhe Burashka (CheBurator) 07.11.08 02:41
вообще, конечно, если доведешь до ума - это тянет на лучшую разработку/идею года.
убедительная просьба - не кидать на полпути!!!
83. Олег Пономаренко (O-Planet) 07.11.08 02:43
Формат выдаваемых сообщений предлагайте. Готов рассмотреть варианты. Можно вообще предложить настраиваемый формат, типа "включить в строку ЭТО"

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

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

>> в ини файл подсовываю управляющую дитрективу - опа трассировка включилась
это надо обсуждать
84. Олег Пономаренко (O-Planet) 07.11.08 02:45
(82) Вообще, лучшая идея года - впереди. Даже две :) Ты забыл о ... <в поисках Vip-а>

85. Олег Пономаренко (O-Planet) 07.11.08 02:48
Если разработка действительно окажется кому-то полезной, то справедливости ради стоит упомянуть fixin-а. если бы он не создал тот топик, за который, кстати, нахватал минусов, то ничего бы не было, ни моей идеи, ни дружной работы по устранению бага.
86. Сhe Burashka (CheBurator) 07.11.08 03:13
> Формат выдаваемых сообщений предлагайте.
думайте! думайте!
должно быть легко идентифицируемо/отделяемо
- служебная часть сообщения (вход в проц, выход, условие иначе и т.д.)
- содержательная часть сообщения, причем чтобы понять к чему относится содержательное часть - не лезть вверх по служебным сообщениям... и т.д.
87. Сhe Burashka (CheBurator) 07.11.08 03:16
на итерациях цикла - только если включать где-то принудительно, в прочих случаях типа:
>>> вход в цикл старт=1 стоп=873
<<< выход из цикла при старт = 530 (т.е. например сработало "прервать")
88. Сhe Burashka (CheBurator) 07.11.08 03:32
+ возможно опционально задавать настройку отступов ступеньками - таким образом оттрассировав можно получить вполне себе читабельный код!
89. Сhe Burashka (CheBurator) 07.11.08 03:33
ОФИЦИАЛЬНО ЗАЯВЛЯЮ СВОИ ПРАВА НА СЛОГАН
"ОТТРАССИРОВАТЬ КАССИРОЧКУ"
!!!
90. Аркадий Кучер (Abadonna) 07.11.08 03:41
Планет, если ты кроме Result:=';Сообщить("' доделаешь еще возможность (на выбор)
pEvent.ExternalEvent('tracer', КатегорияСобытия, ОписаниеСобытия); на мой взгляд будет истчо лучше ;)
91. Олег Пономаренко (O-Planet) 07.11.08 04:03
(90) Это получится какая-то жесть. Можно будет смело ставить клиентам и при умелом обращении, обычная трассировка превращается в планомерное убисство. Хочет впечатлительная девушка, например, открыть накладную, а накладная на ее глазах помечается на удаление, из нее пропадают строки, меняются цифры...
92. Аркадий Кучер (Abadonna) 07.11.08 05:04
(91) Ну ты ж для проггеров пишешь, а кто кроме них обработает событие как надо? А вот по событиям можно лог, например, вести и т.п. Запустил прогу вечером, а утром спокойно в файле посмотрел чаво она там
93. Олег Пономаренко (O-Planet) 07.11.08 05:13
(92) Мож когда дойдем. Если кто сделает и выложит - не расстроюсь, код ведь открыт. Все по порядку. Обсуждали с Чебуратором возможность писать к этому плагины. Вот это и ждите на днях.
94. Аркадий Кучер (Abadonna) 07.11.08 05:24
Есть одна забавная багофича. Трассер отслеживает только код в составе MD (под это и заточен), в ситуации когда модуль подгружается из внешнего файла
#ЗагрузитьИзФайла ExtModules\Справочники\КонтрагентыМодульЭлемента.txt, имеем:
<<?>>//*** Traced by O-Planet
{Справочник.Контрагенты.Форма.Модуль(1)}: Обнаружено логическое завершение исходного текста модуля
и затык, элемент не открывается! Планет, сам поправишь? ;)
Надо проверочку на первую строчку кода на #ЗагрузитьИзФайла
95. Аркадий Кучер (Abadonna) 07.11.08 05:36
+(94) Вот так, например, трабл решается:
if MyCompile.Test(UnitText) and (Pos('#ЗагрузитьИзФайла',t)=0) then
begin
NewUnitText:=MyCompile.Run(UnitText)+#0;
...............................................
96. Олег Пономаренко (O-Planet) 07.11.08 07:02
Про ЗагрузитьИзФайла я думал в ключе побеждения глюка с вылетом. Если бы не победили, то ставил бы его вместо кода, не создавая нового модуля, а трассировку кидал бы в temp. Поправлю, ибо нефиг загружать. Но можно оттрасировать и из файла ;)
97. Аркадий Кучер (Abadonna) 07.11.08 07:12
(96)>ибо нефиг загружать.
А вот тут ты не прав ;) Я абсолютно точно знаю документы, которые мне ОЧЕНЬ часто приходится переделывать (например ЗаявкаПокупателя, Реализация). Выгонять каждый раз 60 юзверей для внесения иногда копеечных изменений - не мой подход. А тут подправил модуль на лету - и готово. Задержка (если и есть) при загрузке текста модуля настолько микроскопическая, что я даже и обсуждать тему быстродействия в данном ключе не хочу.
98. Артур Аюханов (artbear) 07.11.08 08:26
(71) Вообще там, конечно, CString :)
Но приведенный код вроде как должен работать.
Самый правильный вариант - родные сишные malloc и free.
99. Александр Шишкин (Шёпот теней) 07.11.08 09:44
класс!!!

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

вооо-оо-от мнение...
100. Евгений Мартыненков (JohnyDeath) 07.11.08 09:53
Можно ещё добавить _GetPerfomanceCounter() перед каждым сообщением.
Можно сделать, чтобы вызывалась ОбработкаВнешнегоСобытия(...)
Или сделать формат like "журнал регистрации 1С" - для него уже сделан поставщик данных для ТП ;)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа