Имя: Пароль:
1C
1C 7.7
v7: load extension ошибка not authorized
0 evgpinsk_
 
21.07.21
11:53
Данный код (читает из CSV в базу 1sqlite), по умолчанию отрабатывает нормально:

    Запрос=База.НовыйЗапрос();
    Запрос.ВыполнитьЗапрос("PRAGMA synchronous = OFF");    
    Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = MEMORY");
    Запрос.ВыполнитьЗапрос("SELECT load_extension('sqlite3_mod_csv','sqlite3_extension_init');");

но периодически в течении дня вылазит ошибка : "not authorized"
насколько я понимаю, одновременно несколько пользователей чтото хотят сделать с базой.

Не понятно как отловить проблему? И каким именно действием может так монопольно захватываться база db3?
1 Ёпрст
 
гуру
21.07.21
11:58
(0)
https://www.sqlite.org/pragma.html#pragma_journal_mode

MEMORY - это от лукавого, лучше не пользовать, если тока, вы не читатель
2 Ёпрст
 
гуру
21.07.21
12:01
ну и synchronous  в off аналогично
3 evgpinsk_
 
22.07.21
16:24
Закомментировал эти строки. Не помогло. В какойто момент времени в другом сеансе происходит какоето обращение к базе db3 и после этого на код из (0) ругается
4 evgpinsk_
 
23.07.21
12:33
Приходится закрывать сеанс 1с, в котором запускается данный код. А это сеанс робота и он должен работать постоянно, мониторя разные события
5 nicesc
 
23.07.21
12:47
Скорее всего проблема в текущем каталоге. Попробуй так

ТекущийКаталог = ФС.ТекКаталог();
ФС.УстТекКаталог(КаталогИБ() + "ПАПКА_ГДЕ_ЛЕЖИТ_РАСШИРЕНИЕ\");
Запрос.ВыполнитьЗапрос("SELECT load_extension('sqlite3_mod_csv','sqlite3_extension_init');");
ФС.УстТекКаталог(ТекущийКаталог);
6 evgpinsk_
 
23.07.21
13:00
(5) Сложно попробовать, т.к. не понятно как вызвать ошибку.
Но мне кажется изза этой проблемы ошибка наблюдалась бы или всегда или никогда?
7 nicesc
 
23.07.21
14:10
(6) Возможно есть обработки или отчеты которые изменяют текущий каталог, тогда ошибка будет появляться после запуска таких модулей.
8 evgpinsk_
 
23.07.21
14:55
(7) Не в этом проблема , т.к. sqlite3_mod_csv лежит как-раз в КаталогИБ()
Тут именно косяк, что одновременно и Робот в своём сеансе 1с и какойто другой пользователь в другом сеансе одновременно чтото хотят сделать с базой db3
и как я понимаю захватывают её с монопольными правами.
естественно получается это только у одного.

Но баш ещё в том, что если такое событие произошло, то уже потом "монорольность" не отпускается и нужно закрывать руками сеанс робота
9 Вафель
 
23.07.21
15:30
Блокируй какой-нибудь элемент справочника
10 evgpinsk_
 
24.07.21
09:59
(9) Не понял
11 Djelf
 
гуру
24.07.21
10:34
(10) Загружай не в основную таблицу, а во временную таблицу, а потом дропай основную и переименовывай временную в основную.
Еще можешь попробовать PRAGMA busy_timeout = milliseconds; https://www.sqlite.org/pragma.html#pragma_busy_timeout
Ну и PRAGMA schema.journal_mode = WAL https://www.sqlite.org/pragma.html#pragma_journal_mode лучше включить.

А в (9) правильное, но сложное решение. Не расшифровываю кодом, но вот так: Справочник->Блокировки->ЭлементСправочника->Блокировка(<ВклВыкл>)
Т.е. устанавливаем блокировку в 1С на запись и читаем/пишем только когда элемент справочника в 1С разблокирован.
Не использую. journal_mode=wal и busy_timeout +загрузка объемных данных через временную таблицу вполне достаточно.
12 Djelf
 
гуру
24.07.21
10:38
+(11) Что бы выскочило load_extension "not authorized"... Возможно у тебя пересоздается объект "База".
Добавь туда еще База.РазрешитьЗагрузкуРасширений(1);
13 Djelf
 
гуру
24.07.21
11:11
+(12) Расширения лучше не загружать повторно (у меня изредка были падения при этом).
А для проверки загруженных расширений есть https://www.sqlite.org/pragma.html#pragma_module_list
14 Вафель
 
24.07.21
13:53
(10) ну чтоб пока 1 работает, другие отдыхали
15 Djelf
 
гуру
24.07.21
15:09
(14) Извини, но это вредная подсказка!
Монопольного доступа 1sqlite не требует.
И ошибка вообще другая... не связанная с доступом к базе
16 evgpinsk_
 
24.07.21
16:57
(11) > Загружай не в основную таблицу, а во временную таблицу, а потом дропай основную и переименовывай временную в основную.

Так и делаю почти. Но ведь все эти DROP и CREATE в коде идут после
Запрос.ВыполнитьЗапрос("SELECT load_extension('sqlite3_mod_csv','sqlite3_extension_init');");

а ошибка "not authorized" именно на этой первой строке кода