Tracer 1C
104Внешнии компоненты
Описание
Внешняя компонента для 1С: Бухгалтерия 7.7, 1С: Торговля и склад 7.7, 1С: Зарплата и кадры 7.7
ОПИСАНИЕ
На идею создания этой ВК меня подтолкнул 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.o-planet-1c.narod.ru
Скриншоты
Скачать
| Наименование | Размер | Скачиваний 1323 |
Доступ |
| Внешняя компонента | 71 kb | 455 | Зарегистрированные |
| Исходники Tracer 1C на Delphi 7 | 17 kb | 330 | Все |
| Мой пример реализации внешней трассировки | 44 kb | 332 | Все |
Оценка сообщества
|
Плюсы (+104):
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , |
Добавить плюс Добавить минус
Комментарии (186)
(5) Если кто-то в 8-ке воспроизведет OnSave - тому, пожалуй, надо будет что-то круче пива поставить...
Именно из-за того что такое окно постоянно выскакивает после закрытия 1С, я и перестал заниматься разработкой внешних компонент. Так как никто не смог внятно объяснить что же это такое и почему так происходит, а кто знает - тот скромно молчит, упиваясь силою своего знания в магии 1С.
(7) Никакой магии... Если библиотека некорректно подчищает за собой (не разрушает объекты), окошко и будет вываливаться
(0) А подправленную NewAssignAndCompile_done я тебе, Планет, между дрочим высылал. Там ничего не выскакивало
(9) Твой вариант я посмотрел, но ты там проблему не решаешь, а от нее уходишь. Ты там применяешь перехват Ромикса для перекодировки модуля, но ты не создаешь в памяти новый модуль, а коварно используешь старый, созданный 1С, поскольку у тебя перекодировка идёт 1 к 1 по длине. Соответственно, ничего и не выскакивает. А ты попробуй обойтись без вот этого:
for i := 1 to Length(s2) do begin
t[i - 1] := s2;
- а сделай что-то вроде t:=@s2[1] - и выскочит таже фигня.
(7) Нет, ты не о том говоришь. ты говоришь о случае, когда забывают сделать Unassigned на переменные OleVariant, либо когда применяют дестрактор, а потом 1С его повторно вызывает. В моем же случае ошибка плавает, т.е. появляется спонтанно. Поэтому я и предполагаю, что иногда память выскакивает из адресного пространства 1С
(0) ну я бы начал с того, что
function TAddInObject.Done: HResult; stdcall;
begin
pm.UnPatch;
FreeAndNil(pm);
FreeAndNil(MyCompile);
Done := S_OK;
У тебя Init вызывается два раза (ВК экспортирует один объект), соответственно создаются два pm и два MyCompile. На второй итерации первые теряются. Возможно, поможет с багом
Отличная идея! +1 ставлю не глядя.
А нельзя ли сделать закладку в настройках 1С, где будет включаться/выключаться этот Tracer? Также можно было б туда вынести и настройку вывода: либо в окно сообщений, либо в файл с указанным путем.
(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-код, а он параллельно начнет выполняться. раньше думал на это. Но ромикс писал, что это здесь вроде решено.
(14) Думал об этом и написал даже в топике. Планирую сделать, но хоцца вначале глюк побороть совместными усилиями. В asm я не тяну, а он скорее всего там.
(15) попробуй, воспроизводится-ли баг на: http://www.onlinedisk.ru/file/30560/
(18) Выскочила ошибка сразу, но теперь память не в ноль уходит, а куда-то еще, и это - плюс: "Инструкция по адресу ... обратилась к памяти по адресу 0х0539dab0" Попробую сейчас еще перекомпилировать все...



САБЖ!