bdd2

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 % на все мои платные разработки, которые Вас заинтересуют...  Для приобретения премиум-аккаунта перейдите по этой С С Ы Л К Е

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

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

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

См. также

Добавить вознаграждение
Комментарии
1. Олег Пономаренко (O-Planet) 6635 05.11.08 19:32 Сейчас в теме
2. Доржи Цыденов (support) 4369 05.11.08 21:09 Сейчас в теме
3. Олег Пономаренко (O-Planet) 6635 05.11.08 21:12 Сейчас в теме
(2) ??? Типа страшно стало? :)
4. Владимир (hogik) 415 05.11.08 21:14 Сейчас в теме
5. Василий Демидов (Душелов) 3764 05.11.08 21:15 Сейчас в теме
6. Олег Пономаренко (O-Planet) 6635 05.11.08 21:18 Сейчас в теме
(5) Если кто-то в 8-ке воспроизведет OnSave - тому, пожалуй, надо будет что-то круче пива поставить...
7. Оракул Айметдинов (jhfrek) 165 05.11.08 21:36 Сейчас в теме
Именно из-за того что такое окно постоянно выскакивает после закрытия 1С, я и перестал заниматься разработкой внешних компонент. Так как никто не смог внятно объяснить что же это такое и почему так происходит, а кто знает - тот скромно молчит, упиваясь силою своего знания в магии 1С.
8. Аркадий Кучер (Abadonna) 3648 05.11.08 21:38 Сейчас в теме
(7) Никакой магии... Если библиотека некорректно подчищает за собой (не разрушает объекты), окошко и будет вываливаться
9. Аркадий Кучер (Abadonna) 3648 05.11.08 21:45 Сейчас в теме
(0) А подправленную NewAssignAndCompile_done я тебе, Планет, между дрочим высылал. Там ничего не выскакивало
10. Олег Пономаренко (O-Planet) 6635 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) 6635 05.11.08 21:59 Сейчас в теме
Глюк! t[i - 1] := s2[ i ]; - не пропечаталось :(
12. Олег Пономаренко (O-Planet) 6635 05.11.08 22:03 Сейчас в теме
(7) Нет, ты не о том говоришь. ты говоришь о случае, когда забывают сделать Unassigned на переменные OleVariant, либо когда применяют дестрактор, а потом 1С его повторно вызывает. В моем же случае ошибка плавает, т.е. появляется спонтанно. Поэтому я и предполагаю, что иногда память выскакивает из адресного пространства 1С
13. Михаил Усков (MMF) 656 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) 291 05.11.08 22:36 Сейчас в теме
Отличная идея! +1 ставлю не глядя.
А нельзя ли сделать закладку в настройках 1С, где будет включаться/выключаться этот Tracer? Также можно было б туда вынести и настройку вывода: либо в окно сообщений, либо в файл с указанным путем.
15. Олег Пономаренко (O-Planet) 6635 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) 6635 05.11.08 22:38 Сейчас в теме
(14) Думал об этом и написал даже в топике. Планирую сделать, но хоцца вначале глюк побороть совместными усилиями. В asm я не тяну, а он скорее всего там.
17. Михаил Усков (MMF) 656 05.11.08 23:14 Сейчас в теме
(15) попробуй, воспроизводится-ли баг на: http://www.onlinedisk.ru/file/30560/
18. Михаил Усков (MMF) 656 05.11.08 23:19 Сейчас в теме
(17+) это я чето не то закинул, пардон. Не смотрите
19. Олег Пономаренко (O-Planet) 6635 05.11.08 23:23 Сейчас в теме
(18) Выскочила ошибка сразу, но теперь память не в ноль уходит, а куда-то еще, и это - плюс: "Инструкция по адресу ... обратилась к памяти по адресу 0х0539dab0" Попробую сейчас еще перекомпилировать все...
20. Олег Пономаренко (O-Planet) 6635 05.11.08 23:24 Сейчас в теме
21. Олег Пономаренко (O-Planet) 6635 06.11.08 06:39 Сейчас в теме
Кстати, вроде догадался я, как лаг обойти. Надо проверить. И наверняка есть более хорошее решение.
22. Алексей Плутенко (Noy) 1053 06.11.08 09:36 Сейчас в теме
Хорошая идея! +1
Также поддержу JohnyDeath по поводу включения/выключения
[/i]
P.S. Прикольный глюк - после 10 поста все сообщения идут курсивом - суппорту на заметку.
23. Артур Аюханов (artbear) 841 06.11.08 10:17 Сейчас в теме
OnSave от Ромикса - это что? что-то не припомню
Ссылочку можно?
24. Артур Аюханов (artbear) 841 06.11.08 10:40 Сейчас в теме
(0) ИМХО проблема в том, что 1С пытается самостоятельно удалить память, занятую под текст модуля. А так как память выделяется не 1С-ким new, а самостоятельно в Дельфи, структура памяти не совпадает и труба :(
Можно попробовать использовать системный вызов типа SysGetMem
25. Артур Аюханов (artbear) 841 06.11.08 10:43 Сейчас в теме
(24+) или системный HeapAlloc - в принципе, 1С-кий new обращается к нему же.
26. Артур Аюханов (artbear) 841 06.11.08 10:49 Сейчас в теме
(24+) Или вообще вычислить адрес функции malloc в любой dll-ке (basic, seven) и вызывать именно ее для выделения памяти под текст модуля.
27. Артур Аюханов (artbear) 841 06.11.08 11:10 Сейчас в теме
(24+) Или перехватить деструктор CBLModule7 - ??1CBLModule7@@UAE@XZ - и перед выполнением оригинального деструктора обнулять поле текст модуля - dword ptr[ecx+$54] и удалять данный адрес через Дельфовский FreeMem
В этом случае 1C-кий delete (освобождение памяти) вызываться не будет !
28. Артур Аюханов (artbear) 841 06.11.08 11:17 Сейчас в теме
(24+) Сам уже Дельфи довольно сильно подзабыл, к сожалению.
Все на МС С++ тружусь :)
Поэтому сам доработать не могу :(
29. Anonimka (anonimka) 06.11.08 12:51 Сейчас в теме
30. Олег Пономаренко (O-Planet) 6635 06.11.08 13:30 Сейчас в теме
(26) Я из всех вариантов думал только об этом, но схватить malloc из dll не знаю, как. :(
Кстати, по 24... Так понимаю, что 1С пытается освободить память под модуль не всегда в конце работы?
31. Олег Пономаренко (O-Planet) 6635 06.11.08 13:32 Сейчас в теме
По 27 - сложно, потому что не все модули до этого были переопределены.
32. Артур Аюханов (artbear) 841 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) 841 06.11.08 14:28 Сейчас в теме
(30) Да, в 1С юзается сборка мусора на основе ссылок, поэтому объекты освобождаются не всегда сразу же.
34. Олег Пономаренко (O-Planet) 6635 06.11.08 14:32 Сейчас в теме
(32) Ок. Но на asm код не напишу :(
35. Артур Аюханов (artbear) 841 06.11.08 14:36 Сейчас в теме
(34) Полная аналогия/копия с уже имеющимся кодом для АссигнАндКомпайл :) - ИМХО один в один.
36. Олег Пономаренко (O-Planet) 6635 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) 6635 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) 841 06.11.08 14:47 Сейчас в теме
39. Артур Аюханов (artbear) 841 06.11.08 14:55 Сейчас в теме
(38) было к 36
(37) pm.DllNameToPatch:='Basic.dll';
pm.DllNameToFind:='seven.dll';
а почему разные длл-ки? только seven.dll нужно вроде бы.
40. Олег Пономаренко (O-Planet) 6635 06.11.08 15:15 Сейчас в теме
(39) Ненаю. Я взял так, как у Ромикса в OnSave. Кстати, вот на нее ссылка: http://www.x-romix.narod.ru/vk_OnSave.rar
41. Олег Пономаренко (O-Planet) 6635 06.11.08 15:19 Сейчас в теме
Сейчас клиенту отправлю работу и буду все это пробовать...
42. Аркадий Кучер (Abadonna) 3648 06.11.08 15:35 Сейчас в теме
Ну во! Не шпингале... Со спокойно душой плюсик поставлю ;)
43. Олег Пономаренко (O-Planet) 6635 06.11.08 15:43 Сейчас в теме
(42) Ну не знаю... По трудоемкости и набору идей оно намного менее интересно, вообще-то.
44. Аркадий Кучер (Abadonna) 3648 06.11.08 15:44 Сейчас в теме
(43)Это потому ка тык ромиксовскую взял почти готовую. Один фиг, мне это больше импонирует
45. vkr (vkr) 102 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) 165 06.11.08 20:42 Сейчас в теме
Интересная деталь:
Я загрузил эту ВК в почти чистую базу.
Там все лишь одна обработка (это программа для расчёта по оплате электроэнергии для домашней бухгалтерии) :-)
Дело не в этом.
Глобальный модуль там чистый. Ну и воткнул я туда это:
Код
Перем Tracer1C;
//_____________________________________
Процедура ПриНачалеРаботыСистемы()
    ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"Tracer1C.dll");
    Tracer1C=СоздатьОбъект("AddIn.Tracer1C");
    Tracer1C.Open();
КонецПроцедуры  
//_____________________________________
Процедура ПриЗавершенииРаботыСистемы()
    Tracer1C.Close();
КонецПроцедуры 
Показать полностью

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

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

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

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

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

Внешние обработки не перехватывает :(
60. Олег Пономаренко (O-Planet) 6635 07.11.08 00:22 Сейчас в теме
Хм... Если используется готовая dll, то я там отключил функции дебаггера. По 54h лежит программный модуль, который трассирую.
61. Вячеслав (slavapil) 126 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) 126 07.11.08 00:36 Сейчас в теме
(60)
Использую исходники, правда Delphi 2006 :)

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

63. Вячеслав (slavapil) 126 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) 6635 07.11.08 00:52 Сейчас в теме
То, о чем говорили с artbear не сработало. Предполагаю свои кривые ручонки. Но кому интересно, выкладываю отдельно AddInObj.pas

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

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

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

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

Artbear, что там CString или PChar ?
72. Олег Пономаренко (O-Planet) 6635 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) 126 07.11.08 02:00 Сейчас в теме
А кто очистит память зарезервированную 1С?
74. Олег Пономаренко (O-Planet) 6635 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) 6635 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) 6635 07.11.08 02:43 Сейчас в теме
Формат выдаваемых сообщений предлагайте. Готов рассмотреть варианты. Можно вообще предложить настраиваемый формат, типа "включить в строку ЭТО"

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

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

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

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

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

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