Tracer 1C

Публикация № 16676

Программирование - Внешние компоненты

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

ОПИСАНИЕ

На идею создания этой ВК меня подтолкнул 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: //infostart.ru/projects/2826/rate.php?rate=1&cid=63&cp=all
artbear: //infostart.ru/projects/2826/rate.php?rate=1&cid=32&cp=all
MMF: //infostart.ru/projects/2826/rate.php?rate=1&cid=13&cp=all

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

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

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

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

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

162

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

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

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. O-Planet 6948 05.11.08 19:32 Сейчас в теме
94. Abadonna 3820 07.11.08 05:24 Сейчас в теме
Есть одна забавная багофича. Трассер отслеживает только код в составе MD (под это и заточен), в ситуации когда модуль подгружается из внешнего файла
#ЗагрузитьИзФайла ExtModules\Справочники\КонтрагентыМодульЭлемента.txt, имеем:
<<?>>//*** Traced by O-Planet
{Справочник.Контрагенты.Форма.Модуль(1)}: Обнаружено логическое завершение исходного текста модуля
и затык, элемент не открывается! Планет, сам поправишь? ;)
Надо проверочку на первую строчку кода на #ЗагрузитьИзФайла
95. Abadonna 3820 07.11.08 05:36 Сейчас в теме
+(94) Вот так, например, трабл решается:
if MyCompile.Test(UnitText) and (Pos('#ЗагрузитьИзФайла',t)=0) then
begin
NewUnitText:=MyCompile.Run(UnitText)+#0;
...............................................
2. support 4432 05.11.08 21:09 Сейчас в теме
3. O-Planet 6948 05.11.08 21:12 Сейчас в теме
(2) ??? Типа страшно стало? :)
4. hogik 428 05.11.08 21:14 Сейчас в теме
5. Душелов 3895 05.11.08 21:15 Сейчас в теме
6. O-Planet 6948 05.11.08 21:18 Сейчас в теме
(5) Если кто-то в 8-ке воспроизведет OnSave - тому, пожалуй, надо будет что-то круче пива поставить...
7. jhfrek 185 05.11.08 21:36 Сейчас в теме
Именно из-за того что такое окно постоянно выскакивает после закрытия 1С, я и перестал заниматься разработкой внешних компонент. Так как никто не смог внятно объяснить что же это такое и почему так происходит, а кто знает - тот скромно молчит, упиваясь силою своего знания в магии 1С.
8. Abadonna 3820 05.11.08 21:38 Сейчас в теме
(7) Никакой магии... Если библиотека некорректно подчищает за собой (не разрушает объекты), окошко и будет вываливаться
12. O-Planet 6948 05.11.08 22:03 Сейчас в теме
(7) Нет, ты не о том говоришь. ты говоришь о случае, когда забывают сделать Unassigned на переменные OleVariant, либо когда применяют дестрактор, а потом 1С его повторно вызывает. В моем же случае ошибка плавает, т.е. появляется спонтанно. Поэтому я и предполагаю, что иногда память выскакивает из адресного пространства 1С
9. Abadonna 3820 05.11.08 21:45 Сейчас в теме
(0) А подправленную NewAssignAndCompile_done я тебе, Планет, между дрочим высылал. Там ничего не выскакивало
10. O-Planet 6948 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] - и выскочит таже фигня.
140. slavapil 129 10.11.08 09:30 Сейчас в теме
при подключении глТрейсер.ExtTracer() (Пропадают первые буквы):

лСформироватьСообщениеТрассировки<<?>>(Ключ,Имя,Зн);
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(9)}: Процедура не обнаружена (лСформироватьСообщениеТрассировки)
<<?>>ункция СформироватьШтрихкод(Весовой, Код)
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(14)}: Переменная не определена (ункция)
Return Tracer___Ret<<?>>;
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(96)}: Процедура не может возвращать значения
<<?>>КонецФункции
{Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль(99)}: Ожидается ключевое слово 'КонецПроцедуры' ('EndProcedure')
11. O-Planet 6948 05.11.08 21:59 Сейчас в теме
Глюк! t[i - 1] := s2[ i ]; - не пропечаталось :(
13. MMF 677 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 Ответить
15. O-Planet 6948 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-код, а он параллельно начнет выполняться. раньше думал на это. Но ромикс писал, что это здесь вроде решено.
17. MMF 677 05.11.08 23:14 Сейчас в теме
(15) попробуй, воспроизводится-ли баг на: http://www.onlinedisk.ru/file/30560/
14. JohnyDeath 293 05.11.08 22:36 Сейчас в теме
Отличная идея! +1 ставлю не глядя.
А нельзя ли сделать закладку в настройках 1С, где будет включаться/выключаться этот Tracer? Также можно было б туда вынести и настройку вывода: либо в окно сообщений, либо в файл с указанным путем.
16. O-Planet 6948 05.11.08 22:38 Сейчас в теме
(14) Думал об этом и написал даже в топике. Планирую сделать, но хоцца вначале глюк побороть совместными усилиями. В asm я не тяну, а он скорее всего там.
18. MMF 677 05.11.08 23:19 Сейчас в теме
(17+) это я чето не то закинул, пардон. Не смотрите
19. O-Planet 6948 05.11.08 23:23 Сейчас в теме
(18) Выскочила ошибка сразу, но теперь память не в ноль уходит, а куда-то еще, и это - плюс: "Инструкция по адресу ... обратилась к памяти по адресу 0х0539dab0" Попробую сейчас еще перекомпилировать все...
20. O-Planet 6948 05.11.08 23:24 Сейчас в теме
21. O-Planet 6948 06.11.08 06:39 Сейчас в теме
Кстати, вроде догадался я, как лаг обойти. Надо проверить. И наверняка есть более хорошее решение.
22. Noy 1062 06.11.08 09:36 Сейчас в теме
Хорошая идея! +1
Также поддержу JohnyDeath по поводу включения/выключения
[/i]
P.S. Прикольный глюк - после 10 поста все сообщения идут курсивом - суппорту на заметку.
23. artbear 1125 06.11.08 10:17 Сейчас в теме
OnSave от Ромикса - это что? что-то не припомню
Ссылочку можно?
24. artbear 1125 06.11.08 10:40 Сейчас в теме
(0) ИМХО проблема в том, что 1С пытается самостоятельно удалить память, занятую под текст модуля. А так как память выделяется не 1С-ким new, а самостоятельно в Дельфи, структура памяти не совпадает и труба :(
Можно попробовать использовать системный вызов типа SysGetMem
25. artbear 1125 06.11.08 10:43 Сейчас в теме
(24+) или системный HeapAlloc - в принципе, 1С-кий new обращается к нему же.
26. artbear 1125 06.11.08 10:49 Сейчас в теме
(24+) Или вообще вычислить адрес функции malloc в любой dll-ке (basic, seven) и вызывать именно ее для выделения памяти под текст модуля.
30. O-Planet 6948 06.11.08 13:30 Сейчас в теме
(26) Я из всех вариантов думал только об этом, но схватить malloc из dll не знаю, как. :(
Кстати, по 24... Так понимаю, что 1С пытается освободить память под модуль не всегда в конце работы?
33. artbear 1125 06.11.08 14:28 Сейчас в теме
(30) Да, в 1С юзается сборка мусора на основе ссылок, поэтому объекты освобождаются не всегда сразу же.
27. artbear 1125 06.11.08 11:10 Сейчас в теме
(24+) Или перехватить деструктор CBLModule7 - ??1CBLModule7@@UAE@XZ - и перед выполнением оригинального деструктора обнулять поле текст модуля - dword ptr[ecx+$54] и удалять данный адрес через Дельфовский FreeMem
В этом случае 1C-кий delete (освобождение памяти) вызываться не будет !
28. artbear 1125 06.11.08 11:17 Сейчас в теме
(24+) Сам уже Дельфи довольно сильно подзабыл, к сожалению.
Все на МС С++ тружусь :)
Поэтому сам доработать не могу :(
29. anonimka 06.11.08 12:51 Сейчас в теме
31. O-Planet 6948 06.11.08 13:32 Сейчас в теме
По 27 - сложно, потому что не все модули до этого были переопределены.
32. artbear 1125 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 Ответить
34. O-Planet 6948 06.11.08 14:32 Сейчас в теме
(32) Ок. Но на asm код не напишу :(
35. artbear 1125 06.11.08 14:36 Сейчас в теме
(34) Полная аналогия/копия с уже имеющимся кодом для АссигнАндКомпайл :) - ИМХО один в один.
36. O-Planet 6948 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 6948 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 1125 06.11.08 14:47 Сейчас в теме
39. artbear 1125 06.11.08 14:55 Сейчас в теме
(38) было к 36
(37) pm.DllNameToPatch:='Basic.dll';
pm.DllNameToFind:='seven.dll';
а почему разные длл-ки? только seven.dll нужно вроде бы.
40. O-Planet 6948 06.11.08 15:15 Сейчас в теме
(39) Ненаю. Я взял так, как у Ромикса в OnSave. Кстати, вот на нее ссылка: http://www.x-romix.narod.ru/vk_OnSave.rar
41. O-Planet 6948 06.11.08 15:19 Сейчас в теме
Сейчас клиенту отправлю работу и буду все это пробовать...
42. Abadonna 3820 06.11.08 15:35 Сейчас в теме
Ну во! Не шпингале... Со спокойно душой плюсик поставлю ;)
43. O-Planet 6948 06.11.08 15:43 Сейчас в теме
(42) Ну не знаю... По трудоемкости и набору идей оно намного менее интересно, вообще-то.
44. Abadonna 3820 06.11.08 15:44 Сейчас в теме
(43)Это потому ка тык ромиксовскую взял почти готовую. Один фиг, мне это больше импонирует
45. vkr 101 06.11.08 17:19 Сейчас в теме
Помереть - не встать !!! +5 баллов !!!
А то задолбало модули проведения отслеживать... Ж8-)))
46. CheBurator 06.11.08 18:13 Сейчас в теме
> умная трассирочка
видимо кассирочка покоя не дает!
+1
47. CheBurator 06.11.08 18:14 Сейчас в теме
зачетная вещь.. частенько мне ее не хватало...
99. Шёпот теней 1737 07.11.08 09:44 Сейчас в теме
класс!!!

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

вооо-оо-от мнение...
49. jhfrek 185 06.11.08 20:42 Сейчас в теме
Интересная деталь:
Я загрузил эту ВК в почти чистую базу.
Там все лишь одна обработка (это программа для расчёта по оплате электроэнергии для домашней бухгалтерии) :-)
Дело не в этом.
Глобальный модуль там чистый. Ну и воткнул я туда это:
Код
Перем Tracer1C;
//_____________________________________
Процедура ПриНачалеРаботыСистемы()
    ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"Tracer1C.dll");
    Tracer1C=СоздатьОбъект("AddIn.Tracer1C");
    Tracer1C.Open();
КонецПроцедуры  
//_____________________________________
Процедура ПриЗавершенииРаботыСистемы()
    Tracer1C.Close();
КонецПроцедуры 
Показать полностью

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

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

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

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

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

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

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

61. slavapil 129 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';
65. O-Planet 6948 07.11.08 00:52 Сейчас в теме
То, о чем говорили с artbear не сработало. Предполагаю свои кривые ручонки. Но кому интересно, выкладываю отдельно AddInObj.pas

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

Кстати, MMF прислал сейчас dll, которая стала в 2 раза меньше размером, и по ходу не глючная ;)
67. slavapil 129 07.11.08 01:00 Сейчас в теме
(65)
с_free вызвать для того что 1С уже хранит.

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

Может MMF, поделится исходником?
63. slavapil 129 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 Ответить
103. slavapil 129 07.11.08 10:54 Сейчас в теме
Так как там CString, стоит использовать его, пример (63).

Планируется трассировка внешних обработок/отчетов (.ERT)?
64. CheBurator 07.11.08 00:49 Сейчас в теме
> что и без названия вокруг этого ВК начнут ходить красивые легенды.
..угум.. типа задолбали Опланета на инфостарте до того, что достал Опланет из-под полы свой инструмент и показал, что есть еще ягоды в ягоди..тьфу, порох в пороховницах...
;-)
66. O-Planet 6948 07.11.08 00:57 Сейчас в теме
(64) Просто удачно совпали праздники с отсутствием у меня на их период инета и с профукованием всвязи с этим хорошего заказа, вот и отдыхаю от 1С чуть-чуть :)
68. O-Planet 6948 07.11.08 01:06 Сейчас в теме
Может и поделится. Но пока молчит :)
69. O-Planet 6948 07.11.08 01:23 Сейчас в теме
ЫЫЫ!!! А с c_malloc вроде все ОК РАААББОООТТАААЕЕТТТ!!!! :))))
71. slavapil 129 07.11.08 01:48 Сейчас в теме
(69) Это замечательно ;)
Но если там CString, то может слететь :(

Artbear, что там CString или PChar ?
72. O-Planet 6948 07.11.08 01:53 Сейчас в теме
(71) Вообще, я взял из того, что ты написал, всего лишь function c_malloc(size: Integer): Pointer; cdecl; external 'msvcrt.dll' name 'malloc'; и заменил им StrNew :) Думаю, достаточно, потому что теперь 1) гарантированно попадаю в пространство 1С 2) 1С сама отвечает за удаление. Перехватить очистку не получилось: не силен я в асме
98. artbear 1125 07.11.08 08:26 Сейчас в теме
(71) Вообще там, конечно, CString :)
Но приведенный код вроде как должен работать.
Самый правильный вариант - родные сишные malloc и free.
75. CheBurator 07.11.08 02:05 Сейчас в теме
(69) сколько мало нужно Программеру для счастья ;-)
70. O-Planet 6948 07.11.08 01:47 Сейчас в теме
ОБНОВИЛ ФАЙЛЫ, ПРОВЕРЯЙТЕ
73. slavapil 129 07.11.08 02:00 Сейчас в теме
А кто очистит память зарезервированную 1С?
74. O-Planet 6948 07.11.08 02:02 Сейчас в теме
Она же. Или ты имеешь ввиду те модули, которые я переопределяю, и которые теряются? Хм... Сейчас.
76. CheBurator 07.11.08 02:15 Сейчас в теме
предлагается чтоб была возможность трассировку складывать не в табло сообщений а в тектсовый файли (задаваемый, например, в качестве "параметра" при инициализации ВК или в ини-файле)...
77. O-Planet 6948 07.11.08 02:19 Сейчас в теме
Обновил.

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

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

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

83. O-Planet 6948 07.11.08 02:43 Сейчас в теме
Формат выдаваемых сообщений предлагайте. Готов рассмотреть варианты. Можно вообще предложить настраиваемый формат, типа "включить в строку ЭТО"

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

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

>> в ини файл подсовываю управляющую дитрективу - опа трассировка включилась
это надо обсуждать
85. O-Planet 6948 07.11.08 02:48 Сейчас в теме
Если разработка действительно окажется кому-то полезной, то справедливости ради стоит упомянуть fixin-а. если бы он не создал тот топик, за который, кстати, нахватал минусов, то ничего бы не было, ни моей идеи, ни дружной работы по устранению бага.
86. CheBurator 07.11.08 03:13 Сейчас в теме
> Формат выдаваемых сообщений предлагайте.
думайте! думайте!
должно быть легко идентифицируемо/отделяемо
- служебная часть сообщения (вход в проц, выход, условие иначе и т.д.)
- содержательная часть сообщения, причем чтобы понять к чему относится содержательное часть - не лезть вверх по служебным сообщениям... и т.д.
87. CheBurator 07.11.08 03:16 Сейчас в теме
на итерациях цикла - только если включать где-то принудительно, в прочих случаях типа:
>>> вход в цикл старт=1 стоп=873
<<< выход из цикла при старт = 530 (т.е. например сработало "прервать")
88. CheBurator 07.11.08 03:32 Сейчас в теме
+ возможно опционально задавать настройку отступов ступеньками - таким образом оттрассировав можно получить вполне себе читабельный код!
89. CheBurator 07.11.08 03:33 Сейчас в теме
ОФИЦИАЛЬНО ЗАЯВЛЯЮ СВОИ ПРАВА НА СЛОГАН
"ОТТРАССИРОВАТЬ КАССИРОЧКУ"
!!!
90. Abadonna 3820 07.11.08 03:41 Сейчас в теме
Планет, если ты кроме Result:=';Сообщить("' доделаешь еще возможность (на выбор)
pEvent.ExternalEvent('tracer', КатегорияСобытия, ОписаниеСобытия); на мой взгляд будет истчо лучше ;)
91. O-Planet 6948 07.11.08 04:03 Сейчас в теме
(90) Это получится какая-то жесть. Можно будет смело ставить клиентам и при умелом обращении, обычная трассировка превращается в планомерное убисство. Хочет впечатлительная девушка, например, открыть накладную, а накладная на ее глазах помечается на удаление, из нее пропадают строки, меняются цифры...
Оставьте свое сообщение