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

MSSQL: Доработка компоненты, дополнение тестов

This commit is contained in:
Anton Titovets
2025-07-09 20:54:41 +03:00
parent 9050ff90ef
commit f9df3fbaf6
12 changed files with 360 additions and 63 deletions

View File

@ -1,13 +1,13 @@
"MAIN ---"
linux-vdso.so.1 (0x00007ffd92bc9000)
libssl.so.3 => /lib64/libssl.so.3 (0x00007741c0c00000)
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007741c0400000)
libm.so.6 => /lib64/libm.so.6 (0x00007741c0000000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007741bfc00000)
libc.so.6 => /lib64/libc.so.6 (0x00007741bf800000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007741bf400000)
/lib64/ld-linux-x86-64.so.2 (0x00007741c1200000)
libz.so.1 => /lib64/libz.so.1 (0x00007741bf000000)
linux-vdso.so.1 (0x00007ffdc9db0000)
libssl.so.3 => /lib64/libssl.so.3 (0x00007a6a61c00000)
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007a6a61400000)
libm.so.6 => /lib64/libm.so.6 (0x00007a6a61000000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007a6a60c00000)
libc.so.6 => /lib64/libc.so.6 (0x00007a6a60800000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007a6a60400000)
/lib64/ld-linux-x86-64.so.2 (0x00007a6a62200000)
libz.so.1 => /lib64/libz.so.1 (0x00007a6a60000000)
GLIBC_2.2.5
GLIBC_2.12
GLIBC_2.3

View File

@ -169,8 +169,11 @@ impl MSSQLBackend {
None => return Self::format_json_error("Parameters must be a JSON array"),
};
if query.trim_start().to_uppercase().starts_with("SELECT") || force_result {
match client.simple_query(query).await {
let normalized_query = query.trim_start().to_uppercase();
let params_refs: Vec<&dyn ToSql> = params_array.iter().map(|b| b.as_ref()).collect();
if normalized_query.starts_with("SELECT") || force_result {
match client.query(query, &params_refs).await {
Ok(stream) => {
let rows = match stream.into_results().await {
Ok(rows) => rows.into_iter().flatten().collect(),
@ -180,8 +183,18 @@ impl MSSQLBackend {
},
Err(e) => Self::format_json_error(&e.to_string()),
}
} else if normalized_query == "BEGIN TRAN"
|| normalized_query == "COMMIT;"
|| normalized_query == "ROLLBACK;"
|| normalized_query == "BEGIN TRANSACTION"{
match client.simple_query(query).await {
Ok(_) => json!({"result": true}).to_string(),
Err(e) => Self::format_json_error(&e.to_string()),
}
} else {
let params_refs: Vec<&dyn ToSql> = params_array.iter().map(|b| b.as_ref()).collect();
match client.execute(query, &params_refs).await {
Ok(_) => json!({"result": true}).to_string(),
Err(e) => Self::format_json_error(&e.to_string()),
@ -215,43 +228,30 @@ impl MSSQLBackend {
fn from_sql_to_json(row: &Row, index: usize, column: &Column) -> Value {
match column.column_type() {
ColumnType::Null => Value::Null,
ColumnType::Bit => {
row.try_get::<bool, _>(index)
.ok()
.flatten()
.map(Value::Bool)
.unwrap_or(Value::Null)
ColumnType::Bit | ColumnType::Bitn => {
match try_get_any_bit(row, index){
Some(i) => Value::Number(i.into()),
None => Value::Null,
}
},
ColumnType::Bitn => {
row.try_get::<u8, _>(index)
.ok()
.flatten()
.and_then(|n| Number::from_u128(n as u128))
.map(Value::Number)
.unwrap_or(Value::Null)
}
ColumnType::Int1 | ColumnType::Int2 | ColumnType::Int4 | ColumnType::Int8 | ColumnType::Intn => {
row.try_get::<i64, _>(index)
.ok()
.flatten()
.and_then(|n| Number::from_i128(n as i128))
.map(Value::Number)
.unwrap_or(Value::Null)
match try_get_any_int(row, index){
Some(i) => Value::Number(i.into()),
None => Value::Null,
}
},
ColumnType::Float4 | ColumnType::Float8 | ColumnType::Floatn | ColumnType::Money | ColumnType::Money4 => {
row.try_get::<f64, _>(index)
.ok()
.flatten()
.and_then(|f| Number::from_f64(f))
.map(Value::Number)
.unwrap_or(Value::Null)
match try_get_any_float(row, index) {
Some(i) => Number::from_f64(i).map(Value::Number).unwrap_or(Value::Null),
None => Value::Null,
}
},
ColumnType::Decimaln | ColumnType::Numericn => {
row.try_get::<Decimal, _>(index)
.ok()
.flatten()
.and_then(|f| Number::from_f64(f64::try_from(f).unwrap_or(0.0)))
.map(Value::Number)
.map(|num| Value::Number(num))
.unwrap_or(Value::Null)
},
ColumnType::Daten => {
@ -295,6 +295,13 @@ impl MSSQLBackend {
.flatten()
.map(|u| Value::String(u.to_string()))
.unwrap_or(Value::Null)
},
ColumnType::Xml => {
row.try_get::<&XmlData, _>(index)
.ok()
.flatten()
.map(|d| Value::String(d.clone().into_string()))
.unwrap_or(Value::Null)
}
_ => {
row.try_get::<&str, _>(index)
@ -452,6 +459,30 @@ impl MSSQLBackend {
}
}
fn try_get_any_int(row: &Row, index: usize) -> Option<i64> {
row.try_get::<i64, _>(index)
.or_else(|_| row.try_get::<i64, _>(index).map(|v| v.map(|x| x)))
.or_else(|_| row.try_get::<i32, _>(index).map(|v| v.map(|x| x as i64)))
.or_else(|_| row.try_get::<i16, _>(index).map(|v| v.map(|x| x as i64)))
.or_else(|_| row.try_get::<u8, _>(index).map(|v| v.map(|x| x as i64)))
.ok()
.flatten()
}
fn try_get_any_bit(row: &Row, index: usize) -> Option<u8> {
row.try_get::<u8, _>(index)
.or_else(|_| row.try_get::<bool, _>(index).map(|v| v.map(|x| x as u8)))
.ok()
.flatten()
}
fn try_get_any_float(row: &Row, index: usize) -> Option<f64> {
row.try_get::<f64, _>(index)
.or_else(|_| row.try_get::<f32, _>(index).map(|v| v.map(|x| x as f64)))
.ok()
.flatten()
}
impl Drop for MSSQLBackend {
fn drop(&mut self) {

Binary file not shown.

Binary file not shown.

View File

@ -559,6 +559,7 @@
Особенности.Вставить("МаркерПараметров" , "@P");
Особенности.Вставить("СУБД" , "mssql");
Особенности.Вставить("ПолеКолонки" , "COLUMN_NAME");
Особенности.Вставить("НачалоТранзакции" , "BEGIN TRAN");
Возврат Особенности;

View File

@ -530,6 +530,7 @@
Особенности.Вставить("МаркерПараметров" , "?");
Особенности.Вставить("СУБД" , "mysql");
Особенности.Вставить("ПолеКолонки" , "COLUMN_NAME");
Особенности.Вставить("НачалоТранзакции" , "BEGIN");
Возврат Особенности;

View File

@ -559,6 +559,7 @@
Особенности.Вставить("МаркерПараметров" , "$");
Особенности.Вставить("СУБД" , "postgres");
Особенности.Вставить("ПолеКолонки" , "column_name");
Особенности.Вставить("НачалоТранзакции" , "BEGIN");
Возврат Особенности;

View File

@ -463,6 +463,7 @@
Особенности.Вставить("МаркерПараметров" , "?");
Особенности.Вставить("СУБД" , "sqlite");
Особенности.Вставить("ПолеКолонки" , "name");
Особенности.Вставить("НачалоТранзакции" , "BEGIN");
Возврат Особенности;

View File

@ -1,4 +1,4 @@
// OneScript: ./OInt/tools/Modules/OPI_ЗапросыSQL.os
// OneScript: ./OInt/tools/Modules/OPI_ЗапросыSQL.os
// MIT License
@ -702,13 +702,31 @@
Фильтры = Схема["filter"];
Сортировка = Схема["order"];
Количество = Схема["limit"];
СУБД = Схема["dbms"];
ШаблонSQL = "SELECT %1 FROM %2
|%3;";
ШаблонSQL = "SELECT %1 %2 FROM %3
|%4
|%5
|%6;";
БлокНастроек = СформироватьТекстНастроекSelect(Фильтры, Сортировка, Количество);
ТекстФильтра = СформироватьТекстФильтра(Фильтры);
ТекстСортировки = СформироватьТекстСортировки(Сортировка);
Если СУБД = "mssql" Тогда
ТекстТопа = СформироватьТекстТопа(Количество);
ТекстЛимита = "";
Иначе
ТекстТопа = "";
ТекстЛимита = СформироватьТекстКоличества(Количество);
КонецЕсли;
ТекстSQL = СтрШаблон(ШаблонSQL, СтрСоединить(Поля, ", "), Таблица, БлокНастроек);
ТекстSQL = СтрШаблон(ШаблонSQL
, ТекстТопа
, СтрСоединить(Поля, ", ")
, Таблица
, ТекстФильтра
, ТекстСортировки
, ТекстЛимита);
Возврат ТекстSQL;
@ -1017,7 +1035,8 @@
Если Транзакция Тогда
Начало = Модуль.ВыполнитьЗапросSQL("BEGIN", , , Соединение);
Текст = Модуль.ПолучитьОсобенности()["НачалоТранзакции"];
Начало = Модуль.ВыполнитьЗапросSQL(Текст, , , Соединение);
Если Не Начало["result"] Тогда
Возврат Начало;
@ -1082,22 +1101,6 @@
КонецФункции
Функция СформироватьТекстНастроекSelect(Знач Фильтры, Знач Сортировка, Знач Количество)
ШаблонБлока = "%1
|%2
|%3";
ТекстФильтра = СформироватьТекстФильтра(Фильтры);
ТекстСортировки = СформироватьТекстСортировки(Сортировка);
ТекстКоличества = СформироватьТекстКоличества(Количество);
ТекстБлока = СтрШаблон(ШаблонБлока, ТекстФильтра, ТекстСортировки, ТекстКоличества);
Возврат ТекстБлока;
КонецФункции
Функция СформироватьТекстФильтра(Знач Фильтры)
Если Не ЗначениеЗаполнено(Фильтры) Тогда
@ -1173,6 +1176,19 @@
КонецФункции
Функция СформироватьТекстТопа(Знач Количество)
Если Не ЗначениеЗаполнено(Количество) Тогда
Возврат "";
КонецЕсли;
ТекстКоличества = "TOP %1";
ТекстКоличества = СтрШаблон(ТекстКоличества, OPI_Инструменты.ЧислоВСтроку(Количество));
Возврат ТекстКоличества;
КонецФункции
Процедура РазделитьКоллекциюДанных(Знач Запись, МассивПолей, МассивЗначений)
ТекстОшибки = "Некорректный набор данных для обновления";

View File

@ -1,4 +1,4 @@
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// MIT License
@ -2838,6 +2838,11 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("PG_IP" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("PG_Password", ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
MSSQL_СоздатьБазуДанных(ПараметрыТеста);
MSSQL_СоздатьТаблицу(ПараметрыТеста);
MSSQL_ДобавитьЗаписи(ПараметрыТеста);
MSSQL_ПолучитьЗаписи(ПараметрыТеста);
КонецПроцедуры
@ -19468,7 +19473,7 @@
Результат = OPI_MySQL.СоздатьБазуДанных(База, Подключение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных (существующая)", "PostgreSQL");
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных (существующая)", "MySQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат);
OPI_MySQL.ЗакрытьСоединение(Подключение);
@ -23987,6 +23992,247 @@
КонецПроцедуры
Процедура MSSQL_СоздатьБазуДанных(ПараметрыФункции)
Адрес = ПараметрыФункции["PG_IP"];
Логин = "SA";
Пароль = ПараметрыФункции["PG_Password"];
НастройкиTLS = OPI_MSSQL.ПолучитьНастройкиTls(Истина);
СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, , Логин, Пароль);
База = "testbase1";
Удаление = OPI_MSSQL.УдалитьБазуДанных(База, СтрокаПодключения, НастройкиTLS); // SKIP
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Удаление, "СоздатьБазуДанных (удаление)", "MSSQL"); // SKIP
// При использовании строки подключения инициализируется новое соединение,
// которое будет закрыто после выполнения функции.
// В случае выполнения нескольких операций желательно использовать одно соединение,
// заранее созданное функцией ОткрытьСоединение()
Результат = OPI_MSSQL.СоздатьБазуДанных(База, СтрокаПодключения, НастройкиTLS);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
База = "testbase2";
OPI_MSSQL.УдалитьБазуДанных(База, СтрокаПодключения, НастройкиTLS);
Подключение = OPI_MSSQL.ОткрытьСоединение(СтрокаПодключения, НастройкиTLS);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Подключение, "СоздатьБазуДанных (открытие)", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_Компонента(Подключение, "AddIn.OPI_MSSQL.Main");
Результат = OPI_MSSQL.СоздатьБазуДанных(База, Подключение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных (подключение)", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Результат = OPI_MSSQL.СоздатьБазуДанных(База, Подключение);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных (существующая)", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат);
OPI_MSSQL.ЗакрытьСоединение(Подключение);
КонецПроцедуры
Процедура MSSQL_СоздатьТаблицу(ПараметрыФункции)
Адрес = ПараметрыФункции["PG_IP"];
Логин = "SA";
Пароль = ПараметрыФункции["PG_Password"];
База = "testbase1";
НастройкиTLS = OPI_MSSQL.ПолучитьНастройкиTls(Истина);
СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, База, Логин, Пароль);
Таблица = "testtable";
СтруктураКолонок = Новый Структура;
СтруктураКолонок.Вставить("tinyint_field" , "tinyint");
СтруктураКолонок.Вставить("smallint_field" , "smallint");
СтруктураКолонок.Вставить("int_field" , "int");
СтруктураКолонок.Вставить("bigint_field" , "bigint");
СтруктураКолонок.Вставить("float24_field" , "float(24)");
СтруктураКолонок.Вставить("float53_field" , "float(53)");
СтруктураКолонок.Вставить("bit_field" , "bit");
СтруктураКолонок.Вставить("nvarchar_field" , "nvarchar(4000)");
СтруктураКолонок.Вставить("varbinary_field", "varbinary(max)");
СтруктураКолонок.Вставить("uid_field" , "uniqueidentifier");
СтруктураКолонок.Вставить("numeric_field" , "numeric(5,3)"); // Или decimal
СтруктураКолонок.Вставить("xml_field" , "xml");
СтруктураКолонок.Вставить("date_field" , "date");
СтруктураКолонок.Вставить("time_field" , "time");
СтруктураКолонок.Вставить("dto_field" , "datetimeoffset");
СтруктураКолонок.Вставить("datetime_field" , "datetime");
// При использовании строки подключения инициализируется новое соединение,
// которое будет закрыто после выполнения функции.
// В случае выполнения нескольких операций желательно использовать одно соединение,
// заранее созданное функцией ОткрытьСоединение()
Результат = OPI_MSSQL.СоздатьТаблицу(Таблица, СтруктураКолонок, СтрокаПодключения, НастройкиTLS);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Таблица = "АБВ ГДЕ";
Результат = OPI_MSSQL.СоздатьТаблицу(Таблица, СтруктураКолонок, СтрокаПодключения, НастройкиTLS);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу (ошибка имени)", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат);
Таблица = "somename";
СтруктураКолонок.Вставить("wtf_field", "WTF");
Результат = OPI_MSSQL.СоздатьТаблицу(Таблица, СтруктураКолонок, СтрокаПодключения, НастройкиTLS);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу (ошибка типа)", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат);
КонецПроцедуры
Процедура MSSQL_ДобавитьЗаписи(ПараметрыФункции)
Адрес = ПараметрыФункции["PG_IP"];
Логин = "SA";
Пароль = ПараметрыФункции["PG_Password"];
База = "testbase1";
НастройкиTLS = OPI_MSSQL.ПолучитьНастройкиTls(Истина);
СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, База, Логин, Пароль);
Таблица = "testtable";
МассивЗаписей = Новый Массив;
Картинка = ПараметрыФункции["Picture"];
OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); // Картинка - Тип: ДвоичныеДанные
XML = "<?xml version=""1.0""?>
|<root>
| <element>
| <name>Пример</name>
| <value>123</value>
| </element>
| <element>
| <name>Тест</name>
| <value>456</value>
| </element>
|</root>";
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
ТекущаяДатаЧП = OPI_Инструменты.ДатаRFC3339(ТекущаяДата, "+05:00");
СтруктураЗаписи = Новый Структура;
СтруктураЗаписи.Вставить("tinyint_field" , Новый Структура("TINYINT", 5));
СтруктураЗаписи.Вставить("smallint_field" , Новый Структура("SMALLINT", 2000));
СтруктураЗаписи.Вставить("int_field" , Новый Структура("INT", 200000));
СтруктураЗаписи.Вставить("bigint_field" , Новый Структура("BIGINT", 20000000000));
СтруктураЗаписи.Вставить("float24_field" , Новый Структура("FLOAT24", 10.1234567));
СтруктураЗаписи.Вставить("float53_field" , Новый Структура("FLOAT53", 10.123456789123456));
СтруктураЗаписи.Вставить("bit_field" , Новый Структура("BIT", Истина));
СтруктураЗаписи.Вставить("nvarchar_field" , Новый Структура("NVARCHAR", "Some text"));
СтруктураЗаписи.Вставить("varbinary_field", Новый Структура("BYTES", Картинка));
СтруктураЗаписи.Вставить("uid_field" , Новый Структура("UUID", Новый УникальныйИдентификатор));
СтруктураЗаписи.Вставить("numeric_field" , Новый Структура("NUMERIC", 5.333));
СтруктураЗаписи.Вставить("xml_field" , Новый Структура("XML", XML));
СтруктураЗаписи.Вставить("date_field" , Новый Структура("DATE", ТекущаяДата));
СтруктураЗаписи.Вставить("time_field" , Новый Структура("TIME", ТекущаяДата));
СтруктураЗаписи.Вставить("dto_field" , Новый Структура("DATETIMEOFFSET", ТекущаяДатаЧП));
СтруктураЗаписи.Вставить("datetime_field" , Новый Структура("DATETIME", ТекущаяДата));
МассивЗаписей.Добавить(СтруктураЗаписи);
// При использовании строки подключения инициализируется новое соединение,
// которое будет закрыто после выполнения функции.
// В случае выполнения нескольких операций желательно использовать одно соединение,
// заранее созданное функцией ОткрытьСоединение()
Результат = OPI_MSSQL.ДобавитьЗаписи(Таблица, МассивЗаписей, Истина, СтрокаПодключения, НастройкиTLS);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЗаписи", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
КонецПроцедуры
Процедура MSSQL_ПолучитьЗаписи(ПараметрыФункции)
Адрес = ПараметрыФункции["PG_IP"];
Логин = "SA";
Пароль = ПараметрыФункции["PG_Password"];
База = "testbase1";
НастройкиTLS = OPI_MSSQL.ПолучитьНастройкиTls(Истина);
СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, База, Логин, Пароль);
// Все записи без отборов
Таблица = "testtable";
// При использовании строки подключения инициализируется новое соединение,
// которое будет закрыто после выполнения функции.
// В случае выполнения нескольких операций желательно использовать одно соединение,
// заранее созданное функцией ОткрытьСоединение()
Результат = OPI_MSSQL.ПолучитьЗаписи(Таблица, , , , , СтрокаПодключения, НастройкиTLS);
Если ЗначениеЗаполнено(Результат["data"]) Тогда // SKIP
Результат["data"][0]["varbinary_field"]["BYTES"] = Лев(Результат["data"][0]["varbinary_field"]["BYTES"], 10) + "..."; // SKIP
КонецЕсли; // SKIP
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗаписи", "MSSQL"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат); // SKIP
// Отборы, выбранные поля, количество и сортировка
СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, "test_data", Логин, Пароль);
Таблица = "test_data";
Поля = Новый Массив;
Поля.Добавить("first_name");
Поля.Добавить("last_name");
Поля.Добавить("email");
Фильтры = Новый Массив;
СтруктураФильтра1 = Новый Структура;
СтруктураФильтра1.Вставить("field", "gender");
СтруктураФильтра1.Вставить("type" , "=");
СтруктураФильтра1.Вставить("value", "Male");
СтруктураФильтра1.Вставить("union", "AND");
СтруктураФильтра1.Вставить("raw" , Ложь);
СтруктураФильтра2 = Новый Структура;
СтруктураФильтра2.Вставить("field", "id");
СтруктураФильтра2.Вставить("type" , "BETWEEN");
СтруктураФильтра2.Вставить("value", "20 AND 50");
СтруктураФильтра2.Вставить("raw" , Истина);
Фильтры.Добавить(СтруктураФильтра1);
Фильтры.Добавить(СтруктураФильтра2);
Сортировка = Новый Структура("ip_address", "DESC");
Количество = 5;
Результат = OPI_MSSQL.ПолучитьЗаписи(Таблица, Поля, Фильтры, Сортировка, Количество, СтрокаПодключения, НастройкиTLS);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗаписи (отборы)", "MSSQL");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 5);
КонецПроцедуры
#КонецОбласти
#КонецОбласти