Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: load extension ошибка not authorized

v7: load extension ошибка not authorized
Я
   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 аналогично
   evgpinsk_
 
3 - 22.07.21 - 16:24
Закомментировал эти строки. Не помогло. В какойто момент времени в другом сеансе происходит какоето обращение к базе db3 и после этого на код из (0) ругается
   evgpinsk_
 
4 - 23.07.21 - 12:33
Приходится закрывать сеанс 1с, в котором запускается данный код. А это сеанс робота и он должен работать постоянно, мониторя разные события
   nicesc
 
5 - 23.07.21 - 12:47
Скорее всего проблема в текущем каталоге. Попробуй так

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

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

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

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

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.