Имя: Пароль:
1C
 
v8sqlite. Ошибка при подключении к базе
0 zelenprog
 
07.06.23
14:45
Здравствуйте!

Решил попробовать работать с компонентой v8sqlite:
v8sqlite - нативная ВК для работы из 1С c базами  sqlite

Нужно загрузить данные из внешней sqlite-базы.
Написал вот такой код:

    база = Новый("AddIn.v8sqlite.v8sqlite");
    база.ОткрытьБазуДанных("C:\Выгрузка_из_77.db");
    база.Выполнить("pragma encoding='UTF-16'");
    лРезультатЗапроса = база.ВыполнитьЗапрос("
        |select *
        |from Контрагенты", "ТаблицаЗначений", "");
    лТЗКонтрагенты = ЗначениеИзСтрокиВнутр(лРезультатЗапроса);

Однако, у меня не срабатывает даже первая строка - создание базы.
Выдается ошибка - "К сожалению возникла непредвиденная ситуация".

Кстати, и с регистрацией компоненты тоже не все просто.
Регистрация срабатывает только если 1С запустить под правами Администратора.

Возможно все эти проблемы из-за операционки?
У меня Win 11 Pro x64. Компоненту v8sqlite также скачал x64-битную.

Подскажите, в чем может быть проблема?
Как исправить эту ошибку?
1 zelenprog
 
08.06.23
10:12
Никто не пользуется v8sqlite?
2 Salimbek
 
08.06.23
12:34
(0) А компоненту подключил? Первый пункт отсель:
https://github.com/orefkov/v8sqlite#использование
3 zelenprog
 
08.06.23
12:58
(2) Да, это я читал. Компонента подключена
4 Salimbek
 
08.06.23
13:42
Попробовал поиграться с компонентой. База у меня создается. Возможно у вашей 1С-ки нету прав на доступ к корню диска С?
Но у меня другая проблема - не создаются таблицы и ничего не может записать в базу. И вообще - файл нулевой длины генерируется. Сейчас с тестовой базой, созданной в другом ПО попробую поработать.
5 Salimbek
 
08.06.23
14:13
Продолжаю наблюдение:
Запрос: От1 = база.ВыполнитьЗапрос("create table test(a,b,c);","JSON"); - создает Таблицу в БД
а запрос: база.Выполнить("create table test(a,b,c);"); ничего не создает. Странное поведение.
При этом дальнейшее "insert into" и через Выполнить, и через ВыполнитьЗапрос - выдают Ошибку, но в качестве описания ошибки - пустая строка.

P.S. испытываю на версии компоненты х32
6 Salimbek
 
08.06.23
14:24
Хотя наврал в (5), пока заменял команды случайно вместо ВыполнитьЗапрос использовал ВыполнитьВыполнитьЗапрос, что и давало ошибку. Как исправил, так и стало нормально работать.
Вот с чем баловался:
https://controlc.com/8225d8b9
7 zelenprog
 
15.06.23
16:35
(4)-(6)
Спасибо! Попробую еще раз.
8 zelenprog
 
19.06.23
15:28
Снова сделал попытку...
Почему то не подключается компонента :(
9 Salimbek
 
21.06.23
14:32
(8) А разрядность правильная?
10 zelenprog
 
23.06.23
13:49
(9) Пробовал разные разрядности подсовывать.
Результат одинаковый.
11 orefkov
 
03.07.23
10:11
(0)
А если без русских букв назвать базу данных?
12 orefkov
 
03.07.23
10:42
(0)
А если попробовать

    база.ОткрытьБазуДанных("file:/C:/Выгрузка_из_77.db?mode=ro");

Возможно нет прав на создание файлов в корне диска, а если база в режиме WAL, то при открытии не режиме "только чтение", sqlite пытается создать рядом с базой два служебных файла.
13 orefkov
 
03.07.23
10:56
Стоп. Вот это
"Кстати, и с регистрацией компоненты тоже не все просто.
Регистрация срабатывает только если 1С запустить под правами Администратора."

ВК же по нативной технологии, какая там "регистрация"?
14 zelenprog
 
03.07.23
16:01
(11),(12)
Дело до открытия базы не доходит.
Ошибка на этапе подключения компоненты.

(13)
Под "регистрацией" я имел ввиду подключение:

ПутьКВК1 = "C:\1C_Dlls\v8sqlite.dll";
лВКПодключена1 = ПодключитьВнешнююКомпоненту(ПутьКВК1, "v8sqlite", ТипВнешнейКомпоненты.Native);

Всегда возвращает "Ложь".
15 zelenprog
 
03.07.23
16:34
Несколько раз пересоздавал и переименовывал папку, в которой лежит v8sqlite. Подсовывал dll-ки разной разрядности.
В общем подключение компоненты заработало!
Не понял в чем было дело. Скорее всего в названии папки "1С" была русскими буквами, а в коде - латинские буквы.
16 zelenprog
 
03.07.23
16:48
Всем спасибо!
17 zelenprog
 
03.07.23
16:52
А можно ли результат запроса сразу засунуть в ТЗ на форме?

Чтобы не делать преобразования в промежуточную ТЗ?

РезультатЗапроса = база.ВыполнитьЗапрос(""..."):
ТЗКонтрагенты = ЗначениеИзСтрокиВнутр(РезультатЗапроса);

Можно ли сделать что-то типа:
ТЗНаФорме.Загрузить(РезультатЗапроса)?
18 orefkov
 
03.07.23
17:23
(17)
Нет, так не получится, механизм нативных ВК не предусматривает передачу и возврат объектов, только примитивные типы - строки, числа и т.п.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой