Имя: Пароль:
1C
1C 7.7
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) и опять же только по ЖР.
Основная теорема систематики: Новые системы плодят новые проблемы.