Имя: Пароль:
1C
1С v8
Журнал регистрации на sqlite
,
0 cw014
 
12.10.15
10:27
День добрый, коллеги! Есть вопрос по сабжу. Данный журнал вытащить получилось, впринципе все устраивает, но есть одно !НО!. В нем есть поле "data", в нем хранится информация, но эта информация в "кракозябрах" (псевдуникод от 1С). Так вот вопрос. Можно ли в запросе к sqlite указать какую-нибудь конструкцию, что бы преобразовать это поле в читаемое? (Именно в запросе, кодом 1С не предлогать) И если такого нельзя сделать - есть ли возможность внедрить пользовательскую функцию в sqlite? (через php это сделать можно, но PHP обработчика на сервере нет и не будет)
Заранее спасибо!
1 cw014
 
12.10.15
10:38
АП
2 SiAl-chel
 
12.10.15
10:42
(0)
1. "не предлАгать"
2. Что за журнал регистрации? От базы 1С? Как он попал в sqlite? Может стоит в механизм импорта журнала регистрации что-то подправить?
3 Живой Ископаемый
 
12.10.15
10:43
2(2) Последние релизы 1С ведут ЖР в СКЛлайт, уважаемый Рип ван Винкль
4 cw014
 
12.10.15
10:45
(2) 1) Простите за мой французский, исправлюсь
2) +(3)
5 cw014
 
12.10.15
10:45
Всё обсудили? Вопросов посторонних если больше нету, хотелось бы услышать ваши предложения
6 Aleksey
 
12.10.15
10:48
залить в скуль и оттуда читать
7 Гёдза
 
12.10.15
10:49
Обязательно преобразовывать прям в скл? в постобработке никак нельзя?
8 Aleksey
 
12.10.15
10:49
9 Гёдза
 
12.10.15
10:50
Но 1с не рекомендует на высоконагруженных системах такой формат
10 Aleksey
 
12.10.15
10:50
(7) можно

Обращаю внимание на параметр в строке подключения "BigInt=1", только так, поле хранящее дату будет возвращать корректный результат. Кстати, дата хранится как целое число. Например, если дата равна 635453673444260, то чтобы перевести в привычный тип Дата, нужно сделать так:

ОбычнаяДата = '00010101000000' + 635453673444260/10000; //03.09.2014 18:55:44
(с) http://catalog.mista.ru/public/302977/
11 cw014
 
12.10.15
10:53
(8) Читал, ответа на вопрос не получил
(6) Как вариант, но неохота временную таблицу создавать и туда пост-обработкой пихать

Суть такова - 1 раз в день журнал регистрации выкидывается в MSSQL уже преобразованный (корректные строки, даты вместо чисел). После этого журнал регистрации очищается. Задача такая: совместить данные MSSQL и SQLITE (через внешние источники данных), то есть поля должны быть идентичными.

P.S. Не по теме немного. Можно прямо в запросе сделать:
SELECT
  CASE
    WHEN date = 0
      THEN '0001-01-01 00:00:00'
    ELSE
      datetime(date/10000-62135578800,'unixepoch')
    END as date
FROM
  EventLog
12 cw014
 
12.10.15
10:54
+(10) Таким образом получается дата UTC, ее еще нужно в МестноеВремя(???) конвертировать
13 cw014
 
12.10.15
11:20
UP
14 Aleksey
 
12.10.15
11:25
(13) что UP?

Строка соединения какая?
ПараметрыСоединения.СтрокаСоединения = "DRIVER=SQLite3 ODBC Driver;Database=" + ФайлЖурналаРегистрации + ";BigInt=1;";

BigInt = 1 прописывал? Что он возвращает в этом случае?
15 cw014
 
12.10.15
11:26
(14) Друг сердешный... При чем тут BigInt и СТРОКИ???
16 cw014
 
12.10.15
11:27
BigInt влияет на даты. С датами я решил вопрос. Надо решить вопрос со СТРОКАМИ UNICODE в UNICODE (как 1С любит делать)
17 cw014
 
12.10.15
11:27
То есть сконверировать в удобочитаемый вид "Авто"
18 cw014
 
12.10.15
11:33
От отчаяния уже такую конструкцию пробовал:
select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(data,'С‘', 'ё'),'РЃ', 'Ё'),'Рґ', 'д'),'РҐ', 'Х'),'С€', 'ш'),'Рџ', 'П'),'Рў', 'Т'),'Рќ', 'Н'),'Рћ', 'О'),'Рњ', 'М'),'Рљ', 'К'),'Рј', 'м'),'Сї', 'п'),'Рі', 'г'),'Рѕ', 'о'),'Рє', 'к'),'Сѓ', 'у'),'Рђ', 'А'),'Рё', 'и'),'Р»', 'л'),'Р·', 'з'),'Р¶', 'ж'),'Рµ', 'е'),'Р±', 'б'),'Р°', 'а'),'Р®', 'Ю'),'Р­', 'Э'),'Р¬', 'Ь'),'Р«', 'Ы'),'Р©', 'Щ'),'Р§', 'Ч'),'Р¦', 'Ц'),'Р¤', 'Ф'),'Р ', 'Р'),'Р?', 'И'),'СЏ', 'я'),'РЎ', 'C'),'СЌ', 'э'),'СЋ', 'ю'),'СЊ', 'ь'),'СЉ', 'ъ'),'РЈ', 'У'),'РЇ', 'Я'),'РІ', 'в'),'РЅ', 'н'),'РЄ', 'Ъ'),'СЃ', 'с'),'СЂ', 'р'),'РЁ', 'Ш'),'Р?', 'Й'),'Р№', 'й'),'Р›', 'Л'),'С‹', 'ы'),'С‰', 'щ'),'С…', 'х'),'Р•', 'Е'),'С‡', 'ч'),'С†', 'ц'),'С„', 'ф'),'Р”', 'Д'),'Р“', 'Г'),'С‚', 'т'),'Р’', 'В'),'Р‘', 'Б'),'Р—', 'З'),'Р–', 'Ж') as data from eventlog
19 cw014
 
12.10.15
11:34
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): parser stack overflow (1)
20 Живой Ископаемый
 
12.10.15
11:35
Ты применил шаблон проектирования "декоратор"!  :)
21 cw014
 
12.10.15
11:35
(20) Ыыыыыы
22 cw014
 
12.10.15
11:51
Вверх!
23 Гёдза
 
12.10.15
11:55
ну явно твой драйвер не умеет утф
24 cw014
 
12.10.15
11:57
(23) Спасибо, кэп. Не в драйвере дело а в кривом хранении 1Ской своих данных
25 oleg_km
 
12.10.15
12:02
(24) Странно, у меня sqlitebrowser все открылось
26 Гёдза
 
12.10.15
12:04
(24) Ты уверен?
27 cw014
 
12.10.15
13:55
(25) Отлично, что в поле data у тебя
(26) Не совсем, однако механизмов у ODBC я не нашел. Если подскажешь - респект тебе
28 Живой Ископаемый
 
12.10.15
14:12
(27) А как ты вообще читаешь ЖР? У меня через ОДБС при помощи Внешних Источников Данных так и не вышло.... было сказано что файл или не база данных вовсе или заэкнрипчен
29 oleg_km
 
12.10.15
14:13
(27)

Ну вот:

1179:b872ca30957d86c64807bf83bf442104 - это похоже ссылка

Или вот:

"ServerSysLog" - то я сам писал

А, вот что-то записалось непонятное:

"СерверныеСервисы._ЗапуститьМонитор"

При этом в комментарии все нормально:

{Обработка.окПроцессУдаленный.МодульОбъекта(152)}: Вызов службы SrvAGP. System.ArgumentException: Process with an Id of 7660 is not running.
   at System.Diagnostics.Process.GetProcessById(Int32 processId)
   at SrvAGP.RequestCmdGetExec.ExecCmd(ResponseCmd oResp)
   at SrvAGP.ExecQuery.HandleQuery()

Ну т.е. в comment все пишется нормально, а в data что-то с уникодом. Может два раза нужно преобразовать?
30 cw014
 
12.10.15
14:27
(27) Я про это и говорил. Во все поля пишется нормально, кроме поля data
31 cw014
 
12.10.15
14:29
(28) Копируй из папки куда нибудь файлы lgd, lgd-shm и lgd-wal. 1С открывает их на RW - ODBC уже не может открыть их, так как они заняты 1Синой
32 Живой Ископаемый
 
12.10.15
14:31
хм... Ну я так и сделал, что ж я по-твоему совсем того...
драйвер брал отсюда:
http://www.ch-werner.de/sqliteodbc/
33 oleg_km
 
12.10.15
14:48
(32) sqlitebrowser открыл файл прямо на ходу, без копирования. Может там нужно флажок монопольный доступ где-нибудь снять
34 cw014
 
12.10.15
15:08
(32) Какой драйвер брал?
35 cw014
 
12.10.15
15:09
(33) Может быть, я не могу открыть через "ReadOnly". Возможно сам драйвер не поддерживает
36 Живой Ископаемый
 
12.10.15
15:23
2(34) Все-таки в итоге получилось, коггда завел через Источники ОДБЦ файловый ДСН, указал Драфвер для 3 СКЛЛайт, потом из полученного файла ДСН скопировал текст, и вставил его как строку подключения для Внешнего Источника Данных, разделив строки ";".
В конфигураторе увидел все таблицы, кинул таблицу EventLog  в качестве источника ДинамическогоСписка на УФ, и в режиме предприятия не увидел ни строчки. :(
Потерял пока интерес, и закрыл все... Может позже.
37 cw014
 
12.10.15
15:41
(36) Радует, что у тебя что-то получилось. А теперь может кто-нибудь подсказать по моему вопросу?
38 Живой Ископаемый
 
12.10.15
16:18
39 Живой Ископаемый
 
12.10.15
16:23
Могу сказать строку подключения, если интересно
40 Провинциальный 1сник
 
12.10.15
16:57
А почему бы не хранить журнал регистрации в самой базе, используя СУБД базы? Что мешает, непонятно..
Возможно некоторые события должны логироваться и без связи с базой - пусть, но их на несколько порядков меньше, чем событий, связанных базой.
41 Aleksey
 
12.10.15
18:37
(40) из-за блокировки ИМХО
42 Провинциальный 1сник
 
12.10.15
19:09
(41) Ну так база не целиком блокируется. А при добавлении строки события блокировка таблицы журнала регистрации не обязательна. Думаю, это (хранение ЖР вне базы) - тяжкое наследство файлового формата базы, которое по какой-то непонятной причины тянут и в клиент-сервер.
43 cw014
 
13.10.15
07:31
(38) Молодец. Наверное невнимательно читаешь форум. В основном поля нормальные, кроме поля "data"
44 cw014
 
13.10.15
07:40
Сабж все еще актуален
45 cw014
 
13.10.15
07:59
:(
46 cw014
 
13.10.15
09:48
Апачки
47 Strogg
 
13.10.15
09:52
(9) где почитать, чтоб начальству переслать? А то неделю долбился - восстанавливал ЖР после краша...
48 Живой Ископаемый
 
13.10.15
10:26
(43)да, действительно...

Ну тогда вот корявый способ:
http://screencast.com/t/BhgkHg5hed

Вот способ, про который чувак думает что он не корявый:
http://habrahabr.ru/post/107945/

:)

Успехов
49 Живой Ископаемый
 
13.10.15
10:26
ЗТ = Новый Записьтекста("d:\EPF_ERF\123.txt","windows-1251");
    ЗТ.ЗаписатьСтроку(СтраннаяСтрока);
    ЗТ.Закрыть();
    ЧТ = Новый Чтениетекста("d:\EPF_ERF\123.txt",КодировкаТекста.UTF8);
    Строка = ЧТ.Прочитать();
    ЧТ.Закрыть();
====


Как сделать не терзая винт - не знаю.
50 Живой Ископаемый
 
13.10.15
10:28
А как прямо в запросе. чтобы например к этому полю мы могли например применить оператор "ПОДОБНО" -  так и ваще
51 cw014
 
13.10.15
11:07
Ладно, спасибо всем за помощь и понимание. Иными способами попробую
52 cw014
 
13.10.15
11:08
(49) Мой коллега сказал, что это похоже на "вырывание гланд через ж**у бор-машиной с приминением автогена"
53 Провинциальный 1сник
 
14.10.15
07:29
(52) С такой же проблемой можно столкнуться, когда надо текстовый файл, хранящийся в двоичных данных, интерпретировать как текст в 1с. Ну не умеет объект типа Текст загружаться из двоичных данных, только из файла. Вот и приходится выгружать ДД в файл, а потом загружать в Текст. Другого варианта нет(