Имя: Пароль:
1C
 
Журналирование измененных документов 7.7 - ПОЛУЧИЛОСЬ
0 romix
 
модератор
16.10.06
04:44
Достигнут новый рубеж в тяжелом одинэсо-строении!

А именно, приделан перехват событий записи или изменения документов.

В 1С:Предприятие 7.7 нельзя "просто так" поставить перехватчик на событие записи: нет глобального перехватчика "ПриЗаписи" и "ПриПроведении", и - самое главное - вообще нет перехвата программных событий, таких как док.Записать().

Для обмена с другими базами (не обязательно 1С) надо знать: а какие же документы были изменены?

Так что я засел за SoftICE...

Вахта великого почина 1С:

Книга знаний: Лог измененных документов (программно или интерактивно)
2 nicxxx
 
16.10.06
05:52
папка BASE_SQL пуста, это подразумевает что неважно на какой платформе запускать компоненту?
3 nicxxx
 
16.10.06
05:56
круто! работает :)
давно хотелось чего-то подобного, а то делал логирование на ДБФ базе через такие дебри шо писец.
как бы теперь клиентов убедить что им надо логирование переписать :)
4 Морозов Александр
 
16.10.06
06:01
(3)болезнь?
5 SSkripagan
 
16.10.06
06:08
Ромиксу риспект. Многие разработки вызвали глубочайший интерес и неподдельное уважение к светлой голове данного человека. Данная разработка в их числе. Спасибо.
6 Подполковник
 
16.10.06
07:47
кто пробовал? реальная вещь?
7 Obed
 
16.10.06
07:54
(0) Особый респект!
(3) Превед! Когда пить будем?
8 aka Любитель XML
 
16.10.06
08:34
мда... посмотрел обработку по парсингу mlg - имхо жесть...
9 smaharbA
 
16.10.06
08:56
(0) когда логон нНТ-евый будет ?
10 GrayT
 
16.10.06
09:32
(8)Иногда лучше промолчать
11 aka Любитель XML
 
16.10.06
09:44
(10) что значит лучше промолчать? Я думал книге знаний хотя бы код нормальный будет... а там... Ну хотя бы для приличия колонки создавали не в Сформировать(), а ПриОткрытии().
12 GrayT
 
16.10.06
10:11
О каких колонках и каком Сформировать речь? (Поиск по всей конфе "Сформировать" ни чего не дал)
И где ты парсинг mlg узрел?
13 aka Любитель XML
 
16.10.06
10:13
14 GrayT
 
16.10.06
10:16
Гы. Надо было еще и по поводу УРБД пройтись, в таком разе.... тоже ссылка есть :)
15 АЛьФ
 
16.10.06
10:18
2(0) Мой тебе совет: скачай исходники 1С++, подучи немного VC++. И тебе будет НАМНОГО проще разбираться в движке 1С. Многое из того, на что ты тратишь кучу времени и сил давно уже описано в исходниках 1С++.
16 GrayT
 
16.10.06
10:25
(15)Ты как то хотел статью про Радугу написать - забил или времени нет?
Подучи... легко сказать - я тут два дня в дебрях MFC покопался - чую шарики за роликами застряли....
17 skunk
 
16.10.06
10:25
прикольные статьи... может мне тоже таких парочку написать
18 StranNik1С
 
16.10.06
10:31
Задача: перехватить момент записи дока или справочника для вызова удаленной процедуры на сторонней базе.
Возможно решить без изменения конфигурации с помощью этой компоненты?
19 АЛьФ
 
16.10.06
10:32
2(16) Времени нет.
Не надо лезть в дебри. Надо определенную задачу перед собой поставить и учить в рамках этой задачи.
20 romix
 
модератор
16.10.06
13:30
(2) Да, работает и для SQL (тестил и под ним тоже).
(5) :-)
(6) Планируется на работе ее поюзать, пока еще не вставляли.
(9) ОК, попробую. Глядишь, преимуществ у V8 не останется. :-)
(11) Хочешь - правь, там открыто...
(15) Я могу распространять свою ВК в комплекте 1С++... На чем делать мне по большому счету все равно (особенно если кто-то может подсказывать).
(18) А поподробнее можно?
21 romix
 
модератор
17.10.06
03:02
(16) Я вот думаю можно относительно легко сделать логгер вызовов MFC, если поюзать исходники (которые идут в комплекте VC). Может у кого-то уже есть готовый? Или отладчик VC все показывает?
22 spock
 
18.10.06
18:53
(21)а ты случаем decorated имена функций, которые за запись справочников отвечают, не нашел?
А то у меня из-за этого процесс стопорится :)
23 Таня
 
18.10.06
19:12
ура, мне оно тоже надо :)
спасибо (0)
24 TSerge
 
18.10.06
19:35
(0) Круто! Пригодится! Очередной респект!
25 insider
 
18.10.06
19:46
(0) отличная штука, но если не затруднит, не мог бы перехватывать непосредственное удаление программное и через "удаление помеченных объектов" - вопрос не праздный и очень нужная штука вышла бы.
ну и спасибо за твои изыскания, молодец!
26 romix
 
модератор
18.10.06
23:12
(22) Со справочниками там сложнее... Наверное можно, но явных функций наподобие WriteDocFromContext для документов я там не разглядел.

Скорее всего, при реализации обмена потребуется передавать все элементы справочников, которые повстречались в измененных документах.
27 romix
 
модератор
18.10.06
23:23
(25) Непосредственное удаление тоже перехватывается:

----------      
Объект={"O","0","0","0","0","0","        26  62193797   "}       <Объект не найден>(62193797/)
Действие=УдалениеДокументаПрограммно      
User=romix      
Comp=ROMIX      
Время=18.10.2006, 23:05:26
28 acsent
 
18.10.06
23:26
(0) Может тебе влиться в команду разработчиков 1С++?
29 insider
 
18.10.06
23:40
(27) в случае, если юзер ткнет в "удаление помеченных объектов" - тоже?

и я так понимаю, что раз есть исходники, то писать не обязательно в mlg, а с небольшой переделкой можно писать и куда-нить еще, верно?

если все так - ну тогда вообще супер, если сделаешь такое же для справочников - тогда самописную полноценную УРБД будет весьма просто написать :)
30 romix
 
модератор
18.10.06
23:44
(25) Интерактивное (если его разрешить) удаление тоже перехватывается.

Удаление помеченных объектов не регистрируется. Щас попробую посмотреть этот случай.

(28) Возможно, они реализуют этот режим у себя - инфу я там всю расписал...
Если у кого-то будут вопросы, то я часто отвисаю в аське...
31 insider
 
18.10.06
23:45
+29 насчет "объект не найден" не совсем понятно, нельзя ли сохранять старый ID удаленного объекта? ну очень хочется :)
(30) удаление помеченных вообщем-то и нужно больше всего - то, что программно ну никак не отслежу :(
32 romix
 
модератор
18.10.06
23:48
(29) А все элементы справочников же можно передавать, которые засветились в документах...

Насчет mlg не понял - я не туда пишу... А в свой лог.

Удаление помеченных щас посмотрю...
33 Aldour
 
18.10.06
23:50
(0) ЭЭХ.. Классно конечно, но на месяц пораньше бы..:( Мне не пришлось бы с триггерами на SQL возиться...
34 insider
 
18.10.06
23:51
(32) в принципе - да, справочники не особенно важны, так и делаю, т.е. передаются только те, что в документах прошли

мне показалось насчет mlg, т.е. почему-то так понял, сорри

(33) ну триггеры ты здорово сделал и имхо для скуля - самое оно, вопрос вообщем-то меня для dbf интересует, для скуля - неактуально :)
35 romix
 
модератор
19.10.06
00:25
Изловил непосредственное удаление:
BkEnd!?JustDeleteDoc@@

Ссылка на док - в первом параметре по смещению 158

Еще там осталось включение-выключение операций изловить....
36 romix
 
модератор
19.10.06
00:37
Включение и выключение проводок:

BkEnd!?OnOffProvs
Ссылка на док: dd*(esi+158h)
37 romix
 
модератор
19.10.06
00:38
Щас вставлю...
38 romix
 
модератор
19.10.06
00:40
(33) Ну да :-)
39 Злопчинский
 
19.10.06
00:40
Зашибись! то что надо! теперь всякую хрень не надо будет в код пихать..
буду смотреть подробнее - но навскидку вопрос: а можно ли значение дока писать не только в виде строки, но и как-то расшифровывать... т.е. например как получить документ из лога, если его(документа) уже в базе нет...? или я что не понял...?
40 nicxxx
 
19.10.06
01:30
(4) какая болезнь? причем тут болезнь? кто болен? просто бабла хочу срубить
(7) не пью я, ты же знаешь :)
41 romix
 
модератор
19.10.06
03:02
Добавил перехват удаления помеченных доков и перехват включения-выключения проводок.

Также я добавил методы для чтения и очистки журнала с необходимыми блокировками (см. образчик конфигурации, процедура глОбработкаОжидания).
42 romix
 
модератор
19.10.06
03:17
(39) Я предлагаю хранить в отдельной таблице (например, справочнике) идентификатор документа (ЗначениеВСтрокуВнутр) и присваивать каждому доку GUID, и там же, в отдельном поле, его хранить.

Это решит сразу несколько проблем, таких как изменение номера и/или даты документа, а также непосредственное удаление документа.

См. в Книге знаний, как сгенерировать GUID.
43 romix
 
модератор
19.10.06
03:21
44 zxcvb
 
19.10.06
03:27
(0)
Ты молодец!
Крайне полезная либа, пригодитсяв скором времени.:)
45 romix
 
модератор
19.10.06
03:28
Таблица гуидов должна иметь два индексированных поля - это позволит находить по гуиду объект и, наоборот - по объекту - гуид.

Объект можно хранить в форме ЗначениеВСтрокуВнутр.

Если не юзать гуиды, то непонятно, на какие идентификаторы ориентироваться при обмене (если юзера свободно меняют НомерДок и ДатаДок), а также непонятно, а что же посылать в другую базу, если док был непосредственно удален.
46 romix
 
модератор
19.10.06
03:29
(44) :-)
47 romix
 
модератор
19.10.06
03:53
Поправил: теперь делается закрытие log-файла при ошибке.
48 romix
 
модератор
19.10.06
05:07
Генерацию GUIDа наверное добавлю до кучи.
49 romix
 
модератор
19.10.06
20:38
Добавил генерацию GUID, а также УРБД-подобную регистрацию изменений.
50 romix
 
модератор
19.10.06
20:52
Следующим на очереди будет выгрузка измененных доков в XML...
51 VVVV
 
19.10.06
22:55
ОТлично, Роман! Спасибо и успехов!
52 VVVV
 
19.10.06
23:05
(0) "Для первого запуска компоненты требуются права администратора или привилегированного пользователя Windows." - а VKLoader нельзя использовать для загрузки?
53 romix
 
модератор
20.10.06
00:49
(18) Теперь я думаю можно - объект для чтения логов в ВК (0) можно юзать отдельно.
(52) Да, я думаю что можно. Хочу во все свои разработки воткнуть вызов VKLoader.
54 VVVV
 
20.10.06
09:22
(53) РОман - непонятки:
----------      
Объект={"O","0","0","0","0","0","        19  62193818   "}       Новый1 20
{"O","0","0","0","0","0","        19  62193818   "}
Действие=УдалениеДокумента        
Время=20.10.2006, 09:20:22      
----------      
Объект={"O","0","0","0","0","0","        19  62193818   "}       Новый1 20
{"O","0","0","0","0","0","        19  62193818   "}
Действие=УдалениеДокумента            
Время=20.10.2006, 09:20:35      
===============================
1 действие - пометка на удаление, 2-е - снятие пометки на удаление. А сообщение - одинаковое. Почему?
55 VVVV
 
20.10.06
09:26
{"O","0","0","0","0","0","        19  62193803   "}
----------      
Объект={"O","0","0","0","0","0","        19  62193803   "}       Новый1 5
{"O","0","0","0","0","0","        19  62193803   "}
Действие=ЗаписьДокументаПрограммно        
Время=20.10.2006, 09:23:48      
----------      
Объект={"O","0","0","0","0","0","        19  62193803   "}       Новый1 5
{"O","0","0","0","0","0","        19  62193803   "}
Действие=Проведение        
Время=20.10.2006, 09:23:48  
=====================================================
Действие -  реально Запись программно, откуда еще второе сообщение? Да еще о проведении?
56 romix
 
модератор
20.10.06
12:29
(54) Удаление так вызывается в действительности. Что само удаление, что его отмена - одна и та же функция... Та же картина кстати в штатной процедуре гл. модуля ПриУдаленииДокумента. Способ отличить одно событие от другого - посмотреть текущее состояние документа.
57 romix
 
модератор
20.10.06
12:31
(55) Они так вызываются в действительности... Это легко проверить, вставив в модуль проведения отладочную печать...
58 VVVV
 
20.10.06
12:35
значит, на корректное отображение событий расчитывать не приходится.
59 romix
 
модератор
20.10.06
12:41
(58) Проведение отображается корректно (в том виде, в котором оно есть).
Удаление можно смотреть по факту: удалено там или снята пометка.
60 romix
 
модератор
20.10.06
14:22
Добавил метод
   

vk_log_write_doc.РегистрацияИзменений(ЗначениеВСтрокуВнутр(ВыбТестовый),0);


Аналогично похожему методу УРБД.
Чтобы можно было перепроводить доки обработкой, и при этом не регистрировать изменения.

Метод действует только для одного документа, до его перепозиционирования.
61 romix
 
модератор
20.10.06
14:32
Добавил отключение компоненты через файл ini

Чтобы отключить перехват функций 1С, надо поместить в файл
vk_log_write_doc.ini в том же каталоге, что и vk_log_write_doc.dll
строку
Disable=1

Опрос файла ini - при старте 1С.
62 romix
 
модератор
20.10.06
18:24
Поменял алгоритм чтения лога.
Теперь для чтения лога надо поюзать:

   имяф=vk_log_write_doc.ПереименоватьЛогФайл();

Лог будет переименован, и его можно юзать по имени имяф.
Чтение внутри блокировки я убрал от греха подальше, чтобы не блокировать на долгое время других пользователей.

Для блокировки при совместном доступе я использую файл .lck
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.