1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-04-07 07:10:01 +02:00

SQLite: Доработка добавления расширения

This commit is contained in:
Anton Titovets 2025-02-27 12:55:19 +03:00
parent 55a602e49a
commit cb8540b43c
15 changed files with 6993 additions and 6596 deletions

1
.gitignore vendored
View File

@ -24,3 +24,4 @@ target/
addin.zip
src/addins/tcp_server/OPI_TCPServer.zip
src/addins/sqlite/OPI_SQLite.zip
*.db3

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@ -122,19 +122,22 @@
// в виде `{'blob':Base64 строка}`
// Без указания флага `ФорсироватьРезультат`, чтение результата осуществляется только для запросов, начинающихся с `SELECT`^^
// Для остальных запросов возвращается `result:true` или `false` с текстом ошибки
// При выполнении нескольких запросов в рамках одного соединения, расширения лучше подключить один раз при помощи функции `ПодключитьРасширение`
//
// Параметры:
// ТекстЗапроса - Строка - Текст запроса к базе - sql
// Параметры - Массив Из Произвольный - Массив позиционных параметров запроса - params
// ФорсироватьРезультат - Булево - Включает попытку получения результата, даже для не SELECT запросов - force
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе. In memory, если не заполнено - db
// ТекстЗапроса - Строка - Текст запроса к базе - sql
// Параметры - Массив Из Произвольный - Массив позиционных параметров запроса - params
// ФорсироватьРезультат - Булево - Включает попытку получения результата, даже для не SELECT запросов - force
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе. In memory, если не заполнено - db
// Расширения - Соответствие Из КлючИЗначение - Расширения: Ключ > путь или данные расширения, Значение > точка входа - exts
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат выполнения запроса
Функция ВыполнитьЗапросSQL(Знач ТекстЗапроса
, Знач Параметры = ""
, Знач ФорсироватьРезультат = Ложь
, Знач Соединение = "") Экспорт
, Знач Соединение = ""
, Знач Расширения = Неопределено) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстЗапроса, Истина);
OPI_ПреобразованиеТипов.ПолучитьБулево(ФорсироватьРезультат);
@ -145,6 +148,22 @@
Если ТипЗнч(Коннектор) <> Тип("AddIn.OPI_SQLite.Main") Тогда
Возврат Коннектор;
КонецЕсли;
Если ЗначениеЗаполнено(Расширения) Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Расширения, "Некорректная коллекция расширений!");
Для Каждого Расширение Из Расширения Цикл
ПодключениеРасширения = ПодключитьРасширение(Расширение.Ключ, Расширение.Значение, Коннектор);
Если Не ПодключениеРасширения["result"] Тогда
Возврат ПодключениеРасширения;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Результат = Коннектор.Execute(ТекстЗапроса, Параметры_, ФорсироватьРезультат);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
@ -153,6 +172,52 @@
КонецФункции
// Подключить расширение !NOCLI
// Подключает расширение SQLite для указанного соединения
//
// Примечание:
// Соединение активно только в рамках соединения. При каждом новом соединении его необходимо подключать заново
// Аналогично использованию параметра `Расширения` (`exts` в CLI) функции `ВыполнитьЗапросSQL`
//
// Параметры:
// Расширение - Строка, ДвоичныеДанные - Данные или путь к расширению - ext
// ТочкаВхода - Строка - Точка входа расширения, если необходима - point
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе. In memory, если не заполнено - db
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат подключения расширения
Функция ПодключитьРасширение(Знач Расширение, Знач ТочкаВхода = "", Знач Соединение = "") Экспорт
Расширение_ = Расширение;
OPI_ПреобразованиеТипов.ПолучитьФайлНаДиске(Расширение_);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТочкаВхода);
Временный = Расширение_["Временный"];
ПутьКФайлу = Расширение_["Путь"];
Коннектор = ОткрытьСоединение(Соединение);
Если ТипЗнч(Коннектор) <> Тип("AddIn.OPI_SQLite.Main") Тогда
Возврат Коннектор;
КонецЕсли;
Результат = Коннектор.LoadExtension(ПутьКФайлу, ТочкаВхода);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
Если Временный Тогда
Попытка
УдалитьФайлы(ПутьКФайлу);
Исключение
Возврат Результат;
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область ORM

View File

@ -2266,12 +2266,25 @@
Процедура SQLL_ОсновныеМетоды() Экспорт
ПараметрыТеста = Новый Структура;
База = ПолучитьИмяВременногоФайла("sqlite");
OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("SQLite_DB", База);
OPI_Инструменты.ДобавитьПоле("SQLite_DB", База, "Строка", ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("SQLite_Ext", ПараметрыТеста);
SQLite_ОткрытьСоединение(ПараметрыТеста);
SQLite_ЗакрытьСоединение(ПараметрыТеста);
SQLite_ВыполнитьЗапросSQL(ПараметрыТеста);
SQLite_ЭтоКоннектор(ПараметрыТеста);
SQLite_ПодключитьРасширение(ПараметрыТеста);
Попытка
УдалитьФайлы(База);
Исключение
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла базы", "SQLite");
КонецПопытки;
КонецПроцедуры
@ -17005,8 +17018,24 @@
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьЗапросSQL (Transaction)", "SQLite"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); // SKIP
// С расширением
Расширение = ПараметрыФункции["SQLite_Ext"]; // URL, Путь или Двоичные данные
ТочкаВхода = "sqlite3_uuid_init";
СоответствиеРасширений = Новый Соответствие;
СоответствиеРасширений.Вставить(Расширение, ТочкаВхода);
ТекстЗапроса = "SELECT uuid4();";
Результат = OPI_SQLite.ВыполнитьЗапросSQL(ТекстЗапроса, , , Соединение, СоответствиеРасширений);
Закрытие = OPI_SQLite.ЗакрытьСоединение(Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьЗапросSQL (расширение)", "SQLite"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1); // SKIP
Закрытие = OPI_SQLite.ЗакрытьСоединение(Соединение);
// END
@ -17350,6 +17379,49 @@
КонецПроцедуры
Процедура SQLite_ПодключитьРасширение(ПараметрыФункции)
База = ПараметрыФункции["SQLite_DB"];
Расширение = ПараметрыФункции["SQLite_Ext"]; // URL, Путь или Двоичные данные
ТочкаВхода = "sqlite3_uuid_init";
Соединение = OPI_SQLite.ОткрытьСоединение(База);
Результат = OPI_SQLite.ПодключитьРасширение(Расширение, ТочкаВхода, Соединение);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
ИВФ = ПолучитьИмяВременногоФайла("dll");
КопироватьФайл(Расширение, ИВФ);
Результат = OPI_SQLite.ПодключитьРасширение(ИВФ, ТочкаВхода, Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение (путь)", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
Результат = OPI_SQLite.ПодключитьРасширение(Новый ДвоичныеДанные(ИВФ), ТочкаВхода, Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение (двоичные)", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
Результат = OPI_SQLite.ВыполнитьЗапросSQL("select uuid4();", , , Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение (проверка)", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1);
Результат = OPI_SQLite.ЗакрытьСоединение(Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение (закрытие)", "SQLite");
Попытка
УдалитьФайлы(ИВФ);
Исключение
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла расширение", "SQLite");
КонецПопытки;
КонецПроцедуры
#КонецОбласти
#Область PostgreSQL

View File

@ -19050,6 +19050,27 @@
Картинка = Новый ДвоичныеДанные(ФайлКартинки);
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Base64Значение(Результат["data"][0]["data"]["blob"]).Размер(), Картинка.Размер());
// С расширением
Расширение = ПараметрыФункции["SQLite_Ext"]; // URL, Путь или Двоичные данные
ТочкаВхода = "sqlite3_uuid_init";
СоответствиеРасширений = Новый Соответствие;
СоответствиеРасширений.Вставить(Расширение, ТочкаВхода);
ТекстЗапроса = "SELECT uuid4();";
Опции = Новый Структура;
Опции.Вставить("sql" , СтрЗаменить(ТекстЗапроса, Символы.ПС, ""));
Опции.Вставить("db" , ИВФ);
Опции.Вставить("exts", СоответствиеРасширений);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("sqlite", "ВыполнитьЗапросSQL", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ВыполнитьЗапросSQL (расширение)", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1);
Попытка
УдалитьФайлы(ИВФ);
УдалитьФайлы(ФайлКартинки);

View File

@ -2196,9 +2196,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции

View File

@ -325,6 +325,33 @@
КонецПроцедуры
Процедура ПолучитьФайлНаДиске(Значение, Знач Расширение = Неопределено) Экспорт
СтруктураВозврата = Новый Структура("Путь,Временный", "", Ложь);
ЗначениеСтрокой = OPI_Инструменты.ЧислоВСтроку(Значение);
ЗначениеФайл = Новый Файл(ЗначениеСтрокой);
Если ЗначениеФайл.Существует() Тогда
СтруктураВозврата.Вставить("Путь", ЗначениеФайл.ПолноеИмя);
Иначе
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение, Истина);
//@skip-check missing-temporary-file-deletion
Путь = ПолучитьИмяВременногоФайла(Расширение);
Значение.Записать(Путь);
СтруктураВозврата.Вставить("Путь" , Путь);
СтруктураВозврата.Вставить("Временный", Истина);
КонецЕсли;
Значение = СтруктураВозврата;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -122,19 +122,22 @@
// в виде `{'blob':Base64 строка}`
// Без указания флага `ФорсироватьРезультат`, чтение результата осуществляется только для запросов, начинающихся с `SELECT`^^
// Для остальных запросов возвращается `result:true` или `false` с текстом ошибки
// При выполнении нескольких запросов в рамках одного соединения, расширения лучше подключить один раз при помощи функции `ПодключитьРасширение`
//
// Параметры:
// ТекстЗапроса - Строка - Текст запроса к базе - sql
// Параметры - Массив Из Произвольный - Массив позиционных параметров запроса - params
// ФорсироватьРезультат - Булево - Включает попытку получения результата, даже для не SELECT запросов - force
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе. In memory, если не заполнено - db
// ТекстЗапроса - Строка - Текст запроса к базе - sql
// Параметры - Массив Из Произвольный - Массив позиционных параметров запроса - params
// ФорсироватьРезультат - Булево - Включает попытку получения результата, даже для не SELECT запросов - force
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе. In memory, если не заполнено - db
// Расширения - Соответствие Из КлючИЗначение - Расширения: Ключ > путь или данные расширения, Значение > точка входа - exts
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат выполнения запроса
Функция ВыполнитьЗапросSQL(Знач ТекстЗапроса
, Знач Параметры = ""
, Знач ФорсироватьРезультат = Ложь
, Знач Соединение = "") Экспорт
, Знач Соединение = ""
, Знач Расширения = Неопределено) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстЗапроса, Истина);
OPI_ПреобразованиеТипов.ПолучитьБулево(ФорсироватьРезультат);
@ -145,6 +148,22 @@
Если ТипЗнч(Коннектор) <> Тип("AddIn.OPI_SQLite.Main") Тогда
Возврат Коннектор;
КонецЕсли;
Если ЗначениеЗаполнено(Расширения) Тогда
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Расширения, "Некорректная коллекция расширений!");
Для Каждого Расширение Из Расширения Цикл
ПодключениеРасширения = ПодключитьРасширение(Расширение.Ключ, Расширение.Значение, Коннектор);
Если Не ПодключениеРасширения["result"] Тогда
Возврат ПодключениеРасширения;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Результат = Коннектор.Execute(ТекстЗапроса, Параметры_, ФорсироватьРезультат);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
@ -153,6 +172,52 @@
КонецФункции
// Подключить расширение !NOCLI
// Подключает расширение SQLite для указанного соединения
//
// Примечание:
// Расширение активно только в рамках соединения. При каждом новом соединении его необходимо подключать заново
// Аналогично использованию параметра `Расширения` (`exts` в CLI) функции `ВыполнитьЗапросSQL`
//
// Параметры:
// Расширение - Строка, ДвоичныеДанные - Данные или путь к расширению - ext
// ТочкаВхода - Строка - Точка входа расширения, если необходима - point
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе. In memory, если не заполнено - db
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат подключения расширения
Функция ПодключитьРасширение(Знач Расширение, Знач ТочкаВхода = "", Знач Соединение = "") Экспорт
Расширение_ = Расширение;
OPI_ПреобразованиеТипов.ПолучитьФайлНаДиске(Расширение_);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТочкаВхода);
Временный = Расширение_["Временный"];
ПутьКФайлу = Расширение_["Путь"];
Коннектор = ОткрытьСоединение(Соединение);
Если ТипЗнч(Коннектор) <> Тип("AddIn.OPI_SQLite.Main") Тогда
Возврат Коннектор;
КонецЕсли;
Результат = Коннектор.LoadExtension(ПутьКФайлу, ТочкаВхода);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
Если Временный Тогда
Попытка
УдалитьФайлы(ПутьКФайлу);
Исключение
Возврат Результат;
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область ORM

View File

@ -325,6 +325,33 @@
КонецПроцедуры
Процедура ПолучитьФайлНаДиске(Значение, Знач Расширение = Неопределено) Экспорт
СтруктураВозврата = Новый Структура("Путь,Временный", "", Ложь);
ЗначениеСтрокой = OPI_Инструменты.ЧислоВСтроку(Значение);
ЗначениеФайл = Новый Файл(ЗначениеСтрокой);
Если ЗначениеФайл.Существует() Тогда
СтруктураВозврата.Вставить("Путь", ЗначениеФайл.ПолноеИмя);
Иначе
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение, Истина);
//@skip-check missing-temporary-file-deletion
Путь = ПолучитьИмяВременногоФайла(Расширение);
Значение.Записать(Путь);
СтруктураВозврата.Вставить("Путь" , Путь);
СтруктураВозврата.Вставить("Временный", Истина);
КонецЕсли;
Значение = СтруктураВозврата;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -2266,12 +2266,25 @@
Процедура SQLL_ОсновныеМетоды() Экспорт
ПараметрыТеста = Новый Структура;
База = ПолучитьИмяВременногоФайла("sqlite");
OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("SQLite_DB", База);
OPI_Инструменты.ДобавитьПоле("SQLite_DB", База, "Строка", ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("SQLite_Ext", ПараметрыТеста);
SQLite_ОткрытьСоединение(ПараметрыТеста);
SQLite_ЗакрытьСоединение(ПараметрыТеста);
SQLite_ВыполнитьЗапросSQL(ПараметрыТеста);
SQLite_ЭтоКоннектор(ПараметрыТеста);
SQLite_ПодключитьРасширение(ПараметрыТеста);
Попытка
УдалитьФайлы(База);
Исключение
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла базы", "SQLite");
КонецПопытки;
КонецПроцедуры
@ -17005,8 +17018,24 @@
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьЗапросSQL (Transaction)", "SQLite"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); // SKIP
// С расширением
Расширение = ПараметрыФункции["SQLite_Ext"]; // URL, Путь или Двоичные данные
ТочкаВхода = "sqlite3_uuid_init";
СоответствиеРасширений = Новый Соответствие;
СоответствиеРасширений.Вставить(Расширение, ТочкаВхода);
ТекстЗапроса = "SELECT uuid4();";
Результат = OPI_SQLite.ВыполнитьЗапросSQL(ТекстЗапроса, , , Соединение, СоответствиеРасширений);
Закрытие = OPI_SQLite.ЗакрытьСоединение(Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьЗапросSQL (расширение)", "SQLite"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1); // SKIP
Закрытие = OPI_SQLite.ЗакрытьСоединение(Соединение);
// END
@ -17350,6 +17379,49 @@
КонецПроцедуры
Процедура SQLite_ПодключитьРасширение(ПараметрыФункции)
База = ПараметрыФункции["SQLite_DB"];
Расширение = ПараметрыФункции["SQLite_Ext"]; // URL, Путь или Двоичные данные
ТочкаВхода = "sqlite3_uuid_init";
Соединение = OPI_SQLite.ОткрытьСоединение(База);
Результат = OPI_SQLite.ПодключитьРасширение(Расширение, ТочкаВхода, Соединение);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
ИВФ = ПолучитьИмяВременногоФайла("dll");
КопироватьФайл(Расширение, ИВФ);
Результат = OPI_SQLite.ПодключитьРасширение(ИВФ, ТочкаВхода, Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение (путь)", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
Результат = OPI_SQLite.ПодключитьРасширение(Новый ДвоичныеДанные(ИВФ), ТочкаВхода, Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение (двоичные)", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
Результат = OPI_SQLite.ВыполнитьЗапросSQL("select uuid4();", , , Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение (проверка)", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1);
Результат = OPI_SQLite.ЗакрытьСоединение(Соединение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПодключитьРасширение (закрытие)", "SQLite");
Попытка
УдалитьФайлы(ИВФ);
Исключение
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла расширение", "SQLite");
КонецПопытки;
КонецПроцедуры
#КонецОбласти
#Область PostgreSQL

View File

@ -19050,6 +19050,27 @@
Картинка = Новый ДвоичныеДанные(ФайлКартинки);
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Base64Значение(Результат["data"][0]["data"]["blob"]).Размер(), Картинка.Размер());
// С расширением
Расширение = ПараметрыФункции["SQLite_Ext"]; // URL, Путь или Двоичные данные
ТочкаВхода = "sqlite3_uuid_init";
СоответствиеРасширений = Новый Соответствие;
СоответствиеРасширений.Вставить(Расширение, ТочкаВхода);
ТекстЗапроса = "SELECT uuid4();";
Опции = Новый Структура;
Опции.Вставить("sql" , СтрЗаменить(ТекстЗапроса, Символы.ПС, ""));
Опции.Вставить("db" , ИВФ);
Опции.Вставить("exts", СоответствиеРасширений);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("sqlite", "ВыполнитьЗапросSQL", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ВыполнитьЗапросSQL (расширение)", "SQLite");
OPI_ПолучениеДанныхТестов.Проверка_SQLiteУспех(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1);
Попытка
УдалитьФайлы(ИВФ);
УдалитьФайлы(ФайлКартинки);