1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-10-30 23:47:46 +02:00
This commit is contained in:
Anton Titovets
2025-01-04 15:12:23 +03:00
parent 5b447819b8
commit 8b4eff98ba
5 changed files with 6559 additions and 6230 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -234,6 +234,23 @@
КонецФункции
// Удалить записи
// Удаляет записи из таблицы
//
// Параметры:
// Таблица - Строка - Имя таблицы - table
// Фильтры - Массив Из Структура - Массив фильтров. См. ПолучитьСтруктуруФильтраЗаписей - filter
// Соединение - Строка, Произвольный - Существующее соединение или путь к базе - db
//
// Возвращаемое значение:
// Структура Из КлючИЗначение, Строка - Результат выполнения запроса
Функция УдалитьЗаписи(Знач Таблица, Знач Фильтры = "", Знач Соединение = "") Экспорт
Результат = OPI_ЗапросыSQL.УдалитьЗаписи(OPI_SQLite, Таблица, Фильтры, Соединение);
Возврат Результат;
КонецФункции
// Получить структуру фильтра записей
// Получает структуру шаблон для фильтрации записей в запросах ORM
//

View File

@@ -23,7 +23,7 @@
<module name="OPI_YandexID" file="core/Modules/OPI_YandexID.os"/>
<module name="OPI_YandexMarket" file="core/Modules/OPI_YandexMarket.os"/>
<module name="OPI_YandexMetrika" file="core/Modules/OPI_YandexMetrika.os"/>
<module name="os" file="tools/Modules/os"/>
<module name="OPI_ЗапросыSQL" file="tools/Modules/OPI_ЗапросыSQL.os"/>
<module name="OPI_Инструменты" file="tools/Modules/internal/Modules/OPI_Инструменты.os"/>
<module name="OPI_Криптография" file="tools/Modules/internal/Modules/OPI_Криптография.os"/>
<module name="OPI_ПолучениеДанныхТестов" file="tools/Modules/OPI_ПолучениеДанныхТестов.os"/>

View File

@@ -42,164 +42,200 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция ПустаяСхемаSQL(Знач Действие) Экспорт
Функция СоздатьТаблицу(Знач Модуль, Знач Таблица, Знач СтруктураКолонок, Знач Соединение = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Действие);
ТекстОшибки = "Структура колонок не является валидной структурой ключ-значение";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(СтруктураКолонок, ТекстОшибки);
Действие = вРег(Действие);
Схема = ПустаяСхемаSQL("CREATE");
Если Действие = "SELECT" Тогда
УстановитьИмяТаблицы(Схема, Таблица);
Схема = ПустаяСхемаSelect();
Для Каждого Колонка Из СтруктураКолонок Цикл
ДобавитьКолонку(Схема, Колонка.Ключ, Колонка.Значение);
КонецЦикла;
ИначеЕсли Действие = "INSERT" Тогда
Запрос = СформироватьТекстSQL(Схема);
Результат = Модуль.ВыполнитьЗапросSQL(Запрос, , , Соединение);
Схема = ПустаяСхемаInsert();
ИначеЕсли Действие = "UPDATE" Тогда
Схема = ПустаяСхемаUpdate();
ИначеЕсли Действие = "DELETE" Тогда
Схема = ПустаяСхемаDelete();
ИначеЕсли Действие = "CREATE" Тогда
Схема = ПустаяСхемаCreate();
Иначе
Схема = Новый Структура;
КонецЕсли;
Возврат Схема;
Возврат Результат;
КонецФункции
Функция СформироватьТекстSQL(Знач Схема) Экспорт
Функция ДобавитьЗаписи(Знач Модуль
, Знач Таблица
, Знач МассивДанных
, Знач Транзакция = Истина
, Знач Соединение = "") Экспорт
ТекстОшибки = "Переданное значение не является валидной схемой SQL запроса";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Схема, ТекстОшибки);
OPI_ПреобразованиеТипов.ПолучитьМассив(МассивДанных);
OPI_ПреобразованиеТипов.ПолучитьБулево(Транзакция);
ТипСхемы = "";
Соединение = Модуль.ОткрытьСоединение(Соединение);
Если Не OPI_Инструменты.ПолеКоллекцииСуществует(Схема, "type", ТипСхемы) Тогда
ВызватьИсключение ТекстОшибки;
Если Не Модуль.ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
КонецЕсли;
ТипСхемы = вРег(ТипСхемы);
Если Транзакция Тогда
Если ТипСхемы = "SELECT" Тогда
Начало = Модуль.ВыполнитьЗапросSQL("BEGIN TRANSACTION", , , Соединение);
ТекстЗапроса = СформироватьТекстSelect(Схема);
ИначеЕсли ТипСхемы = "INSERT" Тогда
ТекстЗапроса = СформироватьТекстInsert(Схема);
ИначеЕсли ТипСхемы = "UPDATE" Тогда
ТекстЗапроса = СформироватьТекстUpdate(Схема);
ИначеЕсли ТипСхемы = "DELETE" Тогда
ТекстЗапроса = СформироватьТекстDelete(Схема);
ИначеЕсли ТипСхемы = "CREATE" Тогда
ТекстЗапроса = СформироватьТекстCreate(Схема);
Иначе
ТекстЗапроса = "";
Если Не Начало["result"] Тогда
Возврат Начало;
КонецЕсли;
КонецЕсли;
Возврат ТекстЗапроса;
Счетчик = 0;
СчетчикУспешных = 0;
Ошибка = Ложь;
МассивОшибок = Новый Массив;
ОшибкаКоллекции = "Invalid data";
СтруктураРезультата = Новый Структура;
Для Каждого Запись Из МассивДанных Цикл
Если Ошибка И Транзакция Тогда
Откат = Модуль.ВыполнитьЗапросSQL("ROLLBACK", , , Соединение);
СчетчикУспешных = 0;
СтруктураРезультата.Вставить("rollback", Откат);
Прервать;
КонецЕсли;
Счетчик = Счетчик + 1;
Ошибка = Ложь;
Попытка
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Запись, ОшибкаКоллекции);
Исключение
МассивОшибок.Добавить(Новый Структура("row,error", Счетчик, ОшибкаКоллекции));
Ошибка = Истина;
Продолжить;
КонецПопытки;
Результат = ДобавитьЗапись(Модуль, Таблица, Запись, Соединение);
Если Результат["result"] Тогда
СчетчикУспешных = СчетчикУспешных + 1;
Иначе
МассивОшибок.Добавить(Новый Структура("row,error", Счетчик, Результат["error"]));
Ошибка = Истина;
КонецЕсли;
КонецЦикла;
Если Транзакция И Не Ошибка Тогда
Завершение = Модуль.ВыполнитьЗапросSQL("COMMIT", , , Соединение);
СтруктураРезультата.Вставить("commit", Завершение);
КонецЕсли;
СтруктураРезультата.Вставить("result", МассивОшибок.Количество() = 0);
СтруктураРезультата.Вставить("rows" , СчетчикУспешных);
СтруктураРезультата.Вставить("errors", МассивОшибок);
Возврат СтруктураРезультата;
КонецФункции
Процедура ДобавитьКолонку(Схема, Знач Имя, Знач Тип) Экспорт
Функция ПолучитьЗаписи(Знач Модуль
, Знач Таблица
, Знач Поля = "*"
, Знач Фильтры = ""
, Знач Сортировка = ""
, Знач Количество = ""
, Знач Соединение = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
Схема = ПустаяСхемаSQL("SELECT");
Если Не Схема["type"] = "CREATE" Тогда
Возврат;
УстановитьИмяТаблицы(Схема, Таблица);
УстановитьЛимит(Схема, Количество);
ЗаполнитьПоля(Схема, Поля);
ЗаполнитьФильтры(Схема, Фильтры);
ЗаполнитьСортировку(Схема, Сортировка);
Запрос = СформироватьТекстSQL(Схема);
Результат = Модуль.ВыполнитьЗапросSQL(Запрос, Схема["values"], , Соединение);
Возврат Результат;
КонецФункции
Функция ОбновитьЗаписи(Знач Модуль
, Знач Таблица
, Знач СтруктураЗначений
, Знач Фильтры = ""
, Знач Соединение = "") Экспорт
Схема = ПустаяСхемаSQL("UPDATE");
МассивПолей = Новый Массив;
МассивЗначений = Новый Массив;
УстановитьИмяТаблицы(Схема, Таблица);
РазделитьКоллекциюДанных(СтруктураЗначений, МассивПолей, МассивЗначений);
Схема["values"] = МассивЗначений;
Для Каждого Поле Из МассивПолей Цикл
ДобавитьПоле(Схема, Поле);
КонецЦикла;
ЗаполнитьФильтры(Схема, Фильтры);
Запрос = СформироватьТекстSQL(Схема);
Результат = Модуль.ВыполнитьЗапросSQL(Запрос, Схема["values"], , Соединение);
Возврат Результат;
КонецФункции
Функция УдалитьЗаписи(Знач Модуль, Знач Таблица, Знач Фильтры = "", Знач Соединение = "") Экспорт
Схема = ПустаяСхемаSQL("DELETE");
УстановитьИмяТаблицы(Схема, Таблица);
ЗаполнитьФильтры(Схема, Фильтры);
Запрос = СформироватьТекстSQL(Схема);
Результат = Модуль.ВыполнитьЗапросSQL(Запрос, Схема["values"], , Соединение);
Возврат Результат;
КонецФункции
Функция ПолучитьСтруктуруФильтраЗаписей(Знач Пустая = Ложь) Экспорт
СтруктураФильтра = Новый Структура;
СтруктураФильтра.Вставить("field", "<имя поля для отбора>");
СтруктураФильтра.Вставить("type" , "<тип сравнения>");
СтруктураФильтра.Вставить("value", "<значение для сравнения>");
СтруктураФильтра.Вставить("union", "<связь со следующим условием: AND, OR и пр.>");
СтруктураФильтра.Вставить("raw" , "<истина - значение будет вставлено текстом, как есть, ложь - через параметр>");
Если Пустая Тогда
СтруктураФильтра = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураФильтра);
КонецЕсли;
СоответствиеКолонки = Новый Соответствие;
СоответствиеКолонки.Вставить(Имя, Тип);
//@skip-check constructor-function-return-section
Возврат СтруктураФильтра;
Схема["columns"].Добавить(СоответствиеКолонки);
КонецПроцедуры
Процедура ДобавитьПоле(Схема, Знач Имя) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
Схема["set"].Добавить(Имя);
КонецПроцедуры
Процедура ДобавитьОтбор(Схема, Знач Поле, Знач Тип, Знач Значение, Знач Группировка, Знач КакЕсть) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Группировка);
OPI_ПреобразованиеТипов.ПолучитьБулево(КакЕсть);
ОсновнаяСтруктура = Новый Структура("field,type,union"
, Поле
, Тип
, Группировка);
Если КакЕсть Тогда
ОсновнаяСтруктура.Вставить("value", Строка(Значение));
Иначе
Схема["values"].Добавить(Значение);
ПорядковыйНомер = Схема["values"].Количество();
ОсновнаяСтруктура.Вставить("value", "?" + OPI_Инструменты.ЧислоВСтроку(ПорядковыйНомер));
КонецЕсли;
Схема["filter"].Добавить(ОсновнаяСтруктура);
КонецПроцедуры
Процедура ДобавитьСортировку(Схема, Знач Поле, Знач Тип) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
Схема["order"].Добавить(Новый Структура("field,type", Поле, Тип));
КонецПроцедуры
Процедура УстановитьИмяТаблицы(Схема, Знач Имя) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
Схема.Вставить("table", Имя);
КонецПроцедуры
Процедура УстановитьЛимит(Схема, Знач Количество) Экспорт
OPI_ПреобразованиеТипов.ПолучитьЧисло(Количество);
Схема.Вставить("limit", Количество);
КонецПроцедуры
КонецФункции
#КонецОбласти
@@ -237,9 +273,10 @@
Схема = Новый Структура("type", "UPDATE");
Схема.Вставить("table" , "");
Схема.Вставить("set" , Новый Массив);
Схема.Вставить("filter", Новый Массив);
Схема.Вставить("table" , "");
Схема.Вставить("set" , Новый Массив);
Схема.Вставить("filter" , Новый Массив);
Схема.Вставить("values" , Новый Массив);
Возврат Схема;
@@ -318,7 +355,23 @@
Функция СформироватьТекстUpdate(Знач Схема)
ТекстSQL = "";
ПроверитьОбязательныеПоляСхемы(Схема, "table,set,values");
Таблица = Схема["table"];
Поля = Схема["set"];
Фильтры = Схема["filter"];
ШаблонSQL = "UPDATE %1 SET %2 %3";
ТекстФильтра = СформироватьТекстФильтра(Фильтры);
Для Н = 0 По Поля.ВГраница() Цикл
Поля[Н] = Поля[Н] + " = ?" + OPI_Инструменты.ЧислоВСтроку(Н + 1);
КонецЦикла;
ТекстSQL = СтрШаблон(ШаблонSQL, Таблица, СтрСоединить(Поля, "," + Символы.ПС), ТекстФильтра);
Возврат ТекстSQL;
@@ -326,7 +379,16 @@
Функция СформироватьТекстDelete(Знач Схема)
ТекстSQL = "";
ПроверитьОбязательныеПоляСхемы(Схема, "table");
Таблица = Схема["table"];
Фильтры = Схема["filter"];
ШаблонSQL = "DELETE FROM %1 %2";
ТекстФильтра = СформироватьТекстФильтра(Фильтры);
ТекстSQL = СтрШаблон(ШаблонSQL, Таблица, ТекстФильтра);
Возврат ТекстSQL;
@@ -363,6 +425,87 @@
#КонецОбласти
#Область Вспомогательные
Функция ПустаяСхемаSQL(Знач Действие)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Действие);
Действие = вРег(Действие);
Если Действие = "SELECT" Тогда
Схема = ПустаяСхемаSelect();
ИначеЕсли Действие = "INSERT" Тогда
Схема = ПустаяСхемаInsert();
ИначеЕсли Действие = "UPDATE" Тогда
Схема = ПустаяСхемаUpdate();
ИначеЕсли Действие = "DELETE" Тогда
Схема = ПустаяСхемаDelete();
ИначеЕсли Действие = "CREATE" Тогда
Схема = ПустаяСхемаCreate();
Иначе
Схема = Новый Структура;
КонецЕсли;
Возврат Схема;
КонецФункции
Функция СформироватьТекстSQL(Знач Схема)
ТекстОшибки = "Переданное значение не является валидной схемой SQL запроса";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Схема, ТекстОшибки);
ТипСхемы = "";
Если Не OPI_Инструменты.ПолеКоллекцииСуществует(Схема, "type", ТипСхемы) Тогда
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ТипСхемы = вРег(ТипСхемы);
Если ТипСхемы = "SELECT" Тогда
ТекстЗапроса = СформироватьТекстSelect(Схема);
ИначеЕсли ТипСхемы = "INSERT" Тогда
ТекстЗапроса = СформироватьТекстInsert(Схема);
ИначеЕсли ТипСхемы = "UPDATE" Тогда
ТекстЗапроса = СформироватьТекстUpdate(Схема);
ИначеЕсли ТипСхемы = "DELETE" Тогда
ТекстЗапроса = СформироватьТекстDelete(Схема);
ИначеЕсли ТипСхемы = "CREATE" Тогда
ТекстЗапроса = СформироватьТекстCreate(Схема);
Иначе
ТекстЗапроса = "";
КонецЕсли;
Возврат ТекстЗапроса;
КонецФункции
Функция СформироватьТекстНастроекSelect(Знач Фильтры, Знач Сортировка, Знач Количество)
ШаблонБлока = "%1
@@ -454,6 +597,93 @@
КонецФункции
Функция ДобавитьЗапись(Знач Модуль, Знач Таблица, Знач Запись, Знач Соединение)
МассивПолей = Новый Массив;
МассивЗначений = Новый Массив;
Схема = ПустаяСхемаSQL("INSERT");
УстановитьИмяТаблицы(Схема, Таблица);
РазделитьКоллекциюДанных(Запись, МассивПолей, МассивЗначений);
Для Каждого Поле Из МассивПолей Цикл
ДобавитьПоле(Схема, Поле);
КонецЦикла;
Запрос = СформироватьТекстSQL(Схема);
Результат = Модуль.ВыполнитьЗапросSQL(Запрос, МассивЗначений, , Соединение);
Возврат Результат;
КонецФункции
Процедура РазделитьКоллекциюДанных(Знач Запись, МассивПолей, МассивЗначений)
ТекстОшибки = "Некорректный набор данных для обновления";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Запись, ТекстОшибки);
Для Каждого Элемент Из Запись Цикл
МассивПолей.Добавить(Элемент.Ключ);
МассивЗначений.Добавить(Элемент.Значение);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьПоля(Схема, Знач Поля)
Если Не ЗначениеЗаполнено(Поля) Тогда
Поля = "*";
КонецЕсли;
OPI_ПреобразованиеТипов.ПолучитьМассив(Поля);
Для Каждого Поле Из Поля Цикл
ДобавитьПоле(Схема, Поле);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьФильтры(Схема, Знач Фильтры)
Если Не ЗначениеЗаполнено(Фильтры) Тогда
Возврат;
КонецЕсли;
OPI_ПреобразованиеТипов.ПолучитьМассив(Фильтры);
Для Каждого Фильтр Из Фильтры Цикл
ДобавитьОтбор(Схема
, Фильтр["field"]
, ?(Фильтр.Свойство("type"), Фильтр["type"], "=")
, Фильтр["value"]
, ?(Фильтр.Свойство("union"), Фильтр["union"], "AND")
, ?(Фильтр.Свойство("raw"), Фильтр["raw"], Ложь));
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьСортировку(Знач Схема, Знач Сортировка)
Если Не ЗначениеЗаполнено(Сортировка) Тогда
Возврат;
КонецЕсли;
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Сортировка);
Для Каждого Элемент Из Сортировка Цикл
ДобавитьСортировку(Схема, Элемент.Ключ, Элемент.Значение);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьОбязательныеПоляСхемы(Схема, Знач Поля)
МассивОбязательныхПолей = СтрРазделить(Поля, ",");
@@ -465,4 +695,85 @@
КонецПроцедуры
Процедура ДобавитьКолонку(Схема, Знач Имя, Знач Тип) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
Если Не Схема["type"] = "CREATE" Тогда
Возврат;
КонецЕсли;
СоответствиеКолонки = Новый Соответствие;
СоответствиеКолонки.Вставить(Имя, Тип);
Схема["columns"].Добавить(СоответствиеКолонки);
КонецПроцедуры
Процедура ДобавитьПоле(Схема, Знач Имя) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
Схема["set"].Добавить(Имя);
КонецПроцедуры
Процедура ДобавитьОтбор(Схема, Знач Поле, Знач Тип, Знач Значение, Знач Группировка, Знач КакЕсть)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Группировка);
OPI_ПреобразованиеТипов.ПолучитьБулево(КакЕсть);
ОсновнаяСтруктура = Новый Структура("field,type,union"
, Поле
, Тип
, Группировка);
Если КакЕсть Тогда
ОсновнаяСтруктура.Вставить("value", Строка(Значение));
Иначе
Схема["values"].Добавить(Значение);
ПорядковыйНомер = Схема["values"].Количество();
ОсновнаяСтруктура.Вставить("value", "?" + OPI_Инструменты.ЧислоВСтроку(ПорядковыйНомер));
КонецЕсли;
Схема["filter"].Добавить(ОсновнаяСтруктура);
КонецПроцедуры
Процедура ДобавитьСортировку(Схема, Знач Поле, Знач Тип)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
Схема["order"].Добавить(Новый Структура("field,type", Поле, Тип));
КонецПроцедуры
Процедура УстановитьИмяТаблицы(Схема, Знач Имя)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
Схема.Вставить("table", Имя);
КонецПроцедуры
Процедура УстановитьЛимит(Схема, Знач Количество)
OPI_ПреобразованиеТипов.ПолучитьЧисло(Количество);
Схема.Вставить("limit", Количество);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

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