![]() |
|
v7: Как программно узнать реальную дату создания документа? | ☑ | ||
---|---|---|---|---|
0
sysadminlk
11.03.14
✎
13:02
|
Как программно узнать реальную дату создания документа?
У меня все не проведенные документы переносятся на текущую дату. Проблема: В журналах накопилось слишком много документов даже с прошлых годов, но так как дата у всех текущая пометить на удаление старые пока не понятно как. Написал обработку, пытаюсь вытащить данные из журнала регистрации, но в журнале более 60 000 000 строк. Работать с ним крайне не удобно долго. Какие варианты программного получения реальной даты знаете вы? |
|||
1
sysadminlk
11.03.14
✎
13:03
|
Обработка:
ИмяФайла="D:\Klon1cv7.mlg"; fso=СоздатьОбъект("Scripting.FileSystemObject"); file=fso.OpenTextFile(ИмяФайла, 1, 0, 0); //Открываем файл в режиме "только чтение" стрНачДата=ДатаВСтроку(НачДата); стрКонДата=ДатаВСтроку(КонДата); Пока file.AtEndOfStream=0 Цикл //Читаем следующую строку файла сч=сч+1; стр=file.ReadLine(); стрДата=Лев(стр,8); Если сч%10000=0 Тогда Состояние(""+Лев(стр,17)+" ===> "+сч+""); КонецЕсли; стр = СтрЗаменить(стр,";",РазделительСтрок); Текст = СоздатьОбъект("Текст"); Текст.ДобавитьСтроку(стр); Размер = Текст.КоличествоСтрок(); йДата =?(Размер>0,СтрокаВДату(Текст.ПолучитьСтроку(1)),""); йВремя =?(Размер>1,Текст.ПолучитьСтроку(2),""); йПользователь =?(Размер>2,Текст.ПолучитьСтроку(3),""); йГде =?(Размер>3,Текст.ПолучитьСтроку(4),""); йДействие =?(Размер>4,Текст.ПолучитьСтроку(5),""); йСобытие =?(Размер>5,Текст.ПолучитьСтроку(6),""); йДопКод =?(Размер>6,Текст.ПолучитьСтроку(7),""); йОписание =?(Размер>7,Текст.ПолучитьСтроку(8),""); йИД =?(Размер>8,Текст.ПолучитьСтроку(9),""); йПредставление =?(Размер>9,Текст.ПолучитьСтроку(10),""); Если йДействие <> "Docs" Тогда Продолжить; КонецЕсли; йОбъект =ОбъектПоСтроке(йИД); Если ПустоеЗначение(йОбъект) = 0 Тогда сс=""; кк=""; Если ф_тз.НайтиЗначение(йОбъект,сс,кк) = 0 Тогда ф_тз.НоваяСтрока(); ф_тз.Дата =йДата; ф_тз.Объект =йОбъект; КонецЕсли; КонецЕсли; КонецЦикла; Сообщить(ТекущееВремя()); КонецПроцедуры |
|||
2
Torquader
11.03.14
✎
13:04
|
Не все операции пишутся в mlg, особенно, если документ создавался обработкой.
|
|||
3
sysadminlk
11.03.14
✎
13:05
|
(2) это я заметил, но в MLG можно ловить первое его движение. например когда его первый раз кто-то открыл.
|
|||
4
sysadminlk
11.03.14
✎
13:06
|
Мой .mlg файл весит около 700Мб
|
|||
5
Mikeware
11.03.14
✎
13:07
|
как правило, докумет с меньшим идом создан чуть раньше, чем с чуть бОльшим идом
|
|||
6
Mikeware
11.03.14
✎
13:08
|
(1) открой для себя ПоставщикДанныхЖурналаРегистрации
|
|||
7
sysadminlk
11.03.14
✎
13:09
|
(5) как тогда узнать ид документа?
|
|||
8
Mikeware
11.03.14
✎
13:10
|
(7) йИД ?
|
|||
9
varelchik
11.03.14
✎
13:14
|
Синтаксис: ЗначениеВСтрокуБД(ОбъектХранимыйВБД)
Параметры: ОбъектХранимыйВБД - тип: Перечисление, Справочник, Документ, Календарь, ВидРасчета, Счет, ВидСубконто, ПланСчетов. Объект для преобразования. Возвращает: тип: Строка. Результат преобразования. Описание: преобразует ссылочный объект в строку (внутренний идентификатор данных) [ID(6)][Sign(3)] = 9 символов. |
|||
10
ДенисЧ
11.03.14
✎
13:16
|
Подготовиться заранее и добавиьт реквизит ДатаСоздания
|
|||
11
varelchik
11.03.14
✎
13:16
|
Это метод OdbcRecordSet.
|
|||
12
varelchik
11.03.14
✎
13:17
|
Хотя я так думаю это тебе мало чем поможет.
|
|||
13
varelchik
11.03.14
✎
13:18
|
(10) опять же это тоже будет мало.
Все равно надо будет в программном создании это же прописывать. |
|||
14
Torquader
11.03.14
✎
13:19
|
(5) Ид присваивается при записи документа, а не при создании, если документ был создан, а потом провисел открытым несколько дней и только после этого был сохранён, то дату создания можно будет узнать только из журнала регистрации.
|
|||
15
Mikeware
11.03.14
✎
13:21
|
(14) а если докумет был создан со "свободным" идом, то тогда.... а еще... а еще....
(10) в сиквеле можно триггер повесить... |
|||
16
varelchik
11.03.14
✎
13:23
|
(15) а вот это верно.
|
|||
17
varelchik
11.03.14
✎
13:23
|
что да то да.
|
|||
18
ДенисЧ
11.03.14
✎
13:25
|
(15) Вариантов заполнения много. Главное - хранить.
|
|||
19
Torquader
11.03.14
✎
13:27
|
SQL позволяет делать чудеса - это всем известно.
(18) Ну, если её не хранить, то как она появится ? |
|||
20
ДенисЧ
11.03.14
✎
13:30
|
(19) как-как...
А что, у тебя лицензия на telepat.dll закончилась? |
|||
21
Torquader
11.03.14
✎
13:33
|
(20) Ты ещё скажи, что можно лог транзакций sql-сервера перелопатить, чтобы узнать, что там происходило.
|
|||
22
ДенисЧ
11.03.14
✎
13:34
|
(21) Заметьте, не я это предложил (с)
|
|||
23
Torquader
11.03.14
✎
13:36
|
(22) Ну, SQL-сервер - не женщина, в трудный момент не подведёт.
|
|||
24
ДенисЧ
11.03.14
✎
13:37
|
(23) хм... А если той женщ^W^W серверу логи порезали?
|
|||
25
Torquader
11.03.14
✎
13:38
|
(24) Пусть отвечает тот, кто порезал.
Может быть, автор захочет узнать, кто создал документ от 2001 года, так ему тогда проще к гадалке сходить. |
|||
26
Mikeware
11.03.14
✎
13:43
|
(25) ему пора вскрывать второй конверт....
ну, или брать лист формата А4 и начинать писать заявление.... |
|||
27
Mikeware
11.03.14
✎
13:44
|
(19) можно в конце дня фиксировать в отдельном справочнике/табличке последний ИД, например :-)
|
|||
28
Ujcnm99
11.03.14
✎
13:44
|
Я обычно делаю что нибудь вроде
Если 0+Прав(ЗначениеВСтрокуВнутр(Док), 11) < N1 Тогда Если 0+Прав(ЗначениеВСтрокуВнутр(Док), 11) > N2 Тогда (насчет 11 или сколько там должно быть не знаю - просто пример) |
|||
29
sysadminlk
11.03.14
✎
13:46
|
Кто-нибудь юзал Journal.dll ?
стоит попробовать? |
|||
30
Mikeware
11.03.14
✎
13:47
|
(28) "обычно делаю, но не знаю" - зачет.... :-)
|
|||
31
Ujcnm99
11.03.14
✎
13:55
|
(28) Не знаю насколько корректно вообще использовать такие методы, но я его использовал на не очень больших объемах, и перепроверял данные перед записью.
|
|||
32
DrZombi
гуру
11.03.14
✎
13:57
|
(0) Ни как, если ты только этого не хранишь в БД специально.
Можно использовать два реквизита, ДАТА и Строка. В дату пишешь текущею дату, в строку текущее время :) |
|||
33
DrZombi
гуру
11.03.14
✎
13:58
|
+(32) Поднимать историю из ЖР лучше не стоит, через год и более, обычно практикуется архивирования журнала, ибо при определенных размерах, этот файлик нагибает БД :)
|
|||
34
Mikeware
11.03.14
✎
14:02
|
(32) достаточно использовать один реквизит - число.
|
|||
35
varelchik
11.03.14
✎
14:20
|
(23) а зачем строка то?
sql хранит нормально дату как датавремя. |
|||
36
varelchik
11.03.14
✎
14:21
|
пишим триггером туда getdate().
|
|||
37
Mikeware
11.03.14
✎
14:28
|
(35) а если файловая? :-)
|
|||
38
Torquader
11.03.14
✎
14:33
|
(37) Если файловая и никто не позаботился о перехвате записи (такое, кстати, возможно), то никак.
|
|||
39
Mikeware
11.03.14
✎
14:35
|
(38) ну почему же? ежевечерне заполнять незаполненные даты текущей :-) правда, будешь иметь только дату.
|
|||
40
Torquader
11.03.14
✎
14:38
|
(39) МОжно и УРБД подключить, тогда система сама будет "присылать" созданные документы.
|
|||
41
Mikeware
11.03.14
✎
14:57
|
(40) ТКВ!
|
|||
42
varelchik
11.03.14
✎
15:52
|
(40) опять же это ЖурналРегистрации
|
|||
43
varelchik
11.03.14
✎
15:53
|
и то в случае если миграция Все.
|
|||
44
varelchik
11.03.14
✎
15:57
|
+(43) и опять же только по ЖР.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |