Tracer 1C

04.08.09

Разработка - Разработка внешних компонент

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

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

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

ОПИСАНИЕ

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

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

См. также

HTTP сервер 1С 7.7 + HTTP асинхронный клиент: внешние компоненты для 1С 7.7

Разработка внешних компонент WEB-интеграция Платформа 1С v7.7 Конфигурации 1cv7 Платные (руб)

Компонента HttpSrv7 позволяет создавать веб-сервисы в среде 1С 7.7 и даже, используя файлы HTML, несложные веб-сайты. С помощью нее можно обеспечить доступ к данным 1С 7.7 из браузера. Дополнительно используя компоненту HTTP_Async или синхронный клиент HTTP для 1С 7.7 (публикация № 1152364) можно наладить обмен данными между удаленными информационными базами. С помощью компоненты HTTP_Async можно параллельно посылать много запросов к сайтам, веб-сервисам (в т.ч. к HttpSrv7), а затем обрабатывать данные по мере их поступления.

2000 руб.

27.05.2022    7766    19    13    

31

Компонента ExchangeStruc (Структура Обмена). Прямой обмен данными между потоками, сессиями и окнами.

Разработка внешних компонент Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 Платформа 1С v8.1 Россия Платные (руб)

Аддон "Структура Обмена" (ExchangeStruc) - это компонента, которая обеспечивает доступ к разделяемым процессом структурам, аналогичным структурам 1С. Обеспечивает прозрачную передачу данных примитивных типов, в том числе Двоичных данных, в режиме Реального времени между разными контекстами (формами) или потоками одного процесса. В перспективе функционал будет расширен для обмена между процессами, даже разных версий платформ. Совместим с версиями Windows рабочих станций и серверов, с платформами 1С разных версий и релизов в режиме Native начиная с 8.2, и в режиме COM начиная с версий 7.7. По скорости чтения и записи лишь немногим уступает стандартной структуре 1С. НОВОЕ: Добавлен функционал регистрации компоненты COM в качестве OLE Auto (COMОбъект) для поддержки её работы в серверах старых версий 1С: 8.0 и 8.1, где работа с компонентами исключена. Теперь можно коммуникацию с Фоновыми заданиями на этих версиях проводить.

7200 руб.

19.04.2023    4784    1    0    

3

Выбор из большого списка (для 1С 7.7)

Разработка внешних компонент Платформа 1С v7.7 Платные (руб)

Компонента для выбора значения из больших списков значений.

1200 руб.

02.12.2021    5768    2    19    

4

Форма для ввода количества товаров

Разработка внешних компонент Оптовая торговля Платформа 1С v7.7 Конфигурации 1cv7 Управленческий учет Платные (руб)

Расширяем уровень взаимодействия c пользователем с помощью новых возможностей - форма для ввода количества для перемещений и форма ввода количества с упаковками и штуками.

1200 руб.

08.09.2021    7384    0    2    

1

Внешняя компонента для преобразования файлов из/в кодировку Base64 в 1С 7.7

Разработка внешних компонент Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Эта внешняя компонента Base64.dll предназначена для платформы 1С версии 7.7. Используется для преобразования файлов из/в кодировку Base64 из встроенного языка 1С Предприятие. Компонента тестировалась на базе конфигурации Бухгалтерский учет для Казахстана, редакции 7.70.257.

10 стартмани

06.04.2021    9427    14    softmaker    12    

5

Криптография: внешняя компонента для 1С 7.7

Разработка внешних компонент Защита ПО и шифрование Платформа 1С v7.7 Абонемент ($m)

Цифровые подписи, шифрование, просмотр сертификатов ключей ЭЦП, работа с различными криптопровайдерами (в т.ч. КриптоПРО ГОСТ 2012) в 1С 7.7.

1 стартмани

08.06.2020    9034    27    mdbruyfn    10    

9

Протокол UDP: внешняя компонента для 1С 7.7

Разработка внешних компонент Платформа 1С v7.7 Абонемент ($m)

Обмен сообщениями и небольшими файлами по протоколу UDP с 1С и внешними приложениями в локальной сети или сети VPN.

1 стартмани

23.05.2020    7308    5    mdbruyfn    0    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Может MMF, поделится исходником?
63. slavapil 132 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; Velostrannik; support; Pari; Donat; dancer; qwak; NoMax; vladG; Mucmepukc; IamAlexy; O-Planet; +51 Ответить
103. slavapil 132 07.11.08 10:54 Сейчас в теме
Так как там CString, стоит использовать его, пример (63).

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

Artbear, что там CString или PChar ?
72. O-Planet 6431 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 1447 07.11.08 08:26 Сейчас в теме
(71) Вообще там, конечно, CString :)
Но приведенный код вроде как должен работать.
Самый правильный вариант - родные сишные malloc и free.
75. CheBurator 3119 07.11.08 02:05 Сейчас в теме
(69) сколько мало нужно Программеру для счастья ;-)
70. O-Planet 6431 07.11.08 01:47 Сейчас в теме
ОБНОВИЛ ФАЙЛЫ, ПРОВЕРЯЙТЕ
73. slavapil 132 07.11.08 02:00 Сейчас в теме
А кто очистит память зарезервированную 1С?
74. O-Planet 6431 07.11.08 02:02 Сейчас в теме
Она же. Или ты имеешь ввиду те модули, которые я переопределяю, и которые теряются? Хм... Сейчас.
76. CheBurator 3119 07.11.08 02:15 Сейчас в теме
предлагается чтоб была возможность трассировку складывать не в табло сообщений а в тектсовый файли (задаваемый, например, в качестве "параметра" при инициализации ВК или в ини-файле)...
77. O-Planet 6431 07.11.08 02:19 Сейчас в теме
Обновил.

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

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

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

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

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

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

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