1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-03-17 20:48:01 +02:00

Расширен API запросов

This commit is contained in:
alkoleft 2023-05-18 00:29:51 +03:00
parent 084c6102be
commit e954f52bde
4 changed files with 261 additions and 35 deletions

View File

@ -54,6 +54,41 @@
КонецФункции
// Возвращяет первую запись таблицы соответствующую условиям
//
// Параметры:
// ИмяТаблицы - Строка - Имя таблицы базы
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Структура, Неопределено - Содержит все данные записи, включая табличный части
Функция Запись(ИмяТаблицы, Предикат) Экспорт
ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат, "*");
//@skip-check constructor-function-return-section
Возврат ЮТЗапросыВызовСервера.Записи(ОписаниеЗапроса, Истина);
КонецФункции
// Возвращяет записи таблицы соответствующую условиям
//
// Параметры:
// ИмяТаблицы - Строка - Имя таблицы базы
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Массив из Структура - Найденные записи, включая табличный части
Функция Записи(ИмяТаблицы, Предикат) Экспорт
ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат, "*");
Возврат ЮТЗапросыВызовСервера.Записи(ОписаниеЗапроса, Ложь);
КонецФункции
// Вернет признак содержит ли таблица записи удовлетворяющие переданным условиям
//
// Параметры:
@ -107,9 +142,7 @@
// Возвращаемое значение:
// Структура - Описание запроса:
// * ИмяТаблицы - Строка -
// * ВыбираемыеПоля - Структура - Выражения выбираемых полей:
// * Ключ - Строка - Имя поля
// * Значение - Строка - выражение поля
// * ВыбираемыеПоля - Массив из Строка
// * КоличествоЗаписей - Число, Неопределено - Ограничение количества выбираемых записей
// * Условия - Массив из Строка - Коллекция выражений условий, которые будут объединены через `И`
// * ЗначенияПараметров - Структура - Набор параметров запроса
@ -117,7 +150,7 @@
Описание = Новый Структура();
Описание.Вставить("ИмяТаблицы", "");
Описание.Вставить("ВыбираемыеПоля", Новый Структура);
Описание.Вставить("ВыбираемыеПоля", Новый Массив);
Описание.Вставить("КоличествоЗаписей", Неопределено);
Описание.Вставить("Условия", Новый Массив());
Описание.Вставить("ЗначенияПараметров", Новый Структура());

View File

@ -23,26 +23,7 @@
Запрос = Запрос(ОписаниеЗапроса);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ ДляКлиента Тогда
Возврат РезультатЗапроса.Выгрузить();
ИначеЕсли РезультатЗапроса.Пустой() Тогда
Возврат Новый Массив();
КонецЕсли;
Ключи = СтрСоединить(ЮТОбщий.ВыгрузитьЗначения(РезультатЗапроса.Колонки, "Имя"), ",");
Результат = Новый Массив();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Запись = Новый Структура(Ключи);
ЗаполнитьЗначенияСвойств(Запись, Выборка);
Результат.Добавить(Запись);
КонецЦикла;
Возврат Результат;
Возврат ВыгрузитьРезультатЗапроса(РезультатЗапроса, ДляКлиента);
КонецФункции
@ -88,6 +69,35 @@
КонецФункции
// Возвращяет записи результат запроса
//
// Параметры:
// ОписаниеЗапроса - см. ЮТЗапросы.ОписаниеЗапроса
// ОднаЗапись - Булево - Вернуть первую запись
//
// Возвращаемое значение:
// Массив из Структура, Структура, Неопределено - Записи
Функция Записи(ОписаниеЗапроса, ОднаЗапись) Экспорт
Если ОднаЗапись Тогда
ОписаниеЗапроса.КоличествоЗаписей = 1;
КонецЕсли;
Запрос = Запрос(ОписаниеЗапроса);
РезультатЗапроса = Запрос.Выполнить();
Записи = ВыгрузитьРезультатЗапроса(РезультатЗапроса, Истина);
Если НЕ ОднаЗапись Тогда
Возврат Записи;
ИначеЕсли Записи.Количество() Тогда
Возврат Записи[0];
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -108,14 +118,10 @@
Строки.Добавить("ПЕРВЫЕ " + ЮТОбщий.ЧислоВСтроку(ОписаниеЗапроса.КоличествоЗаписей));
КонецЕсли;
ВыбираемыеПоля = Новый Массив();
Для Каждого Выражение Из ОписаниеЗапроса.ВыбираемыеПоля Цикл
Поле = СтрШаблон(" %1 КАК %2", ?(Выражение.Значение = Неопределено, Выражение.Ключ, Выражение.Значение), Выражение.Ключ);
ВыбираемыеПоля.Добавить(Поле);
КонецЦикла;
Если НЕ ВыбираемыеПоля.Количество() Тогда
ВыбираемыеПоля.Добавить("1 КАК Поле");
Если ОписаниеЗапроса.ВыбираемыеПоля.Количество() Тогда
ВыбираемыеПоля = ОписаниеЗапроса.ВыбираемыеПоля;
Иначе
ВыбираемыеПоля = ЮТОбщий.ЗначениеВМассиве("1 КАК Поле");
КонецЕсли;
Строки.Добавить(СтрСоединить(ВыбираемыеПоля, "," + Символы.ПС));
@ -159,4 +165,51 @@
КонецФункции
Функция ВыгрузитьРезультатЗапроса(РезультатЗапроса, ВМассив)
Если НЕ ВМассив Тогда
Возврат РезультатЗапроса.Выгрузить();
Иначе
Результат = Новый Массив();
КонецЕсли;
Если РезультатЗапроса.Пустой() Тогда
Возврат Результат;
КонецЕсли;
Реквизиты = Новый Массив();
ТабличныеЧасти = Новый Массив();
ТипРезультатЗапроса = Тип("РезультатЗапроса");
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
Реквизиты.Добавить(Колонка.Имя);
Если Колонка.ТипЗначения.СодержитТип(ТипРезультатЗапроса) Тогда
ТабличныеЧасти.Добавить(Колонка.Имя);
КонецЕсли;
КонецЦикла;
ПараметрыКонструктора = СтрСоединить(Реквизиты, ",");
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Запись = Новый Структура(ПараметрыКонструктора);
ЗаполнитьЗначенияСвойств(Запись, Выборка);
Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
Запись[ТабличнаяЧасть] = ВыгрузитьРезультатЗапроса(Выборка[ТабличнаяЧасть], ВМассив);
КонецЦикла;
Результат.Добавить(Запись);
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти

View File

@ -22,7 +22,11 @@
Описание = ЮТЗапросы.ОписаниеЗапроса();
Описание.ИмяТаблицы = ИмяТаблицы;
Описание.ВыбираемыеПоля.Вставить("Проверка", "1");
Если ВыбираемыеПоля = Неопределено Тогда
Описание.ВыбираемыеПоля.Добавить("1 КАК Проверка");
Иначе
ЗаполнитьВыбираемыеПоля(Описание, ВыбираемыеПоля)
КонецЕсли;
СформироватьУсловия(ПредикатыУсловия, Описание.Условия, Описание.ЗначенияПараметров);
@ -93,4 +97,32 @@
КонецФункции
Процедура ЗаполнитьВыбираемыеПоля(ОписаниеЗапроса, Знач ВыбираемыеПоля)
ТипПараметра = ТипЗнч(ВыбираемыеПоля);
Если ТипПараметра = Тип("Строка") Тогда
ВыбираемыеПоля = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ВыбираемыеПоля, ",", Истина);
ТипПараметра = Тип("Массив");
КонецЕсли;
Если ТипПараметра = Тип("Массив") Тогда
ОписаниеЗапроса.ВыбираемыеПоля = ВыбираемыеПоля;
ИначеЕсли ТипПараметра = Тип("Структура") Тогда
Для Каждого Поле Из ВыбираемыеПоля Цикл
Выражение = СтрШаблон("%1 КАК %2", Поле.Значение, Поле.Ключ);
ОписаниеЗапроса.ВыбираемыеПоля.Добавить(Выражение);
КонецЦикла;
Иначе
ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТЗапросыКлиентСервер.ЗаполнитьВыбираемыеПоля", ВыбираемыеПоля);
КонецЕсли;
КонецПроцедуры
#КонецОбласти

View File

@ -26,6 +26,8 @@
.ДобавитьТест("ТаблицаСодержитЗаписи")
.ДобавитьТест("РезультатЗапроса")
.ДобавитьТест("РезультатПустой")
.ДобавитьТест("Запись")
.ДобавитьТест("Записи")
;
КонецПроцедуры
@ -123,8 +125,8 @@
ОписаниеЗапроса.Условия.Добавить("Ссылка = &Ссылка");
ОписаниеЗапроса.Условия.Добавить("НЕ ПометкаУдаления");
ОписаниеЗапроса.ЗначенияПараметров.Вставить("Ссылка", Ссылка);
ОписаниеЗапроса.ВыбираемыеПоля.Вставить("Наименование");
ОписаниеЗапроса.ВыбираемыеПоля.Вставить("Число", "1+1");
ОписаниеЗапроса.ВыбираемыеПоля.Добавить("Наименование");
ОписаниеЗапроса.ВыбираемыеПоля.Добавить("1+1 КАК Число");
ЮТест.ОжидаетЧто(ЮТЗапросы.РезультатЗапроса(ОписаниеЗапроса))
.ИмеетДлину(1)
@ -153,4 +155,110 @@
КонецПроцедуры
Процедура Запись() Экспорт
// Справочник
Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
.Фикция("Наименование")
.Фикция("Поставщик");
Ссылка = Конструктор.Записать();
ДанныеОбъекта = Конструктор.ДанныеОбъекта();
ДанныеЗаписи = ЮТЗапросы.Запись("Справочник.Товары", ЮТест.Предикат()
.Реквизит("Ссылка").Равно(Ссылка));
ДанныеЗаписи = ЮТЗапросы.Запись("Справочник.Товары", ЮТест.Предикат()
.Реквизит("Поставщик").Равно(ДанныеОбъекта.Поставщик));
ЮТест.ОжидаетЧто(ДанныеЗаписи)
.ИмеетТип("Структура")
.Заполнено()
.Свойство("Ссылка").Равно(Ссылка)
.Свойство("Наименование").Равно(ДанныеОбъекта.Наименование)
.Свойство("Поставщик").Равно(ДанныеОбъекта.Поставщик);
// Справочник поиск по реквизиту
ДанныеЗаписи = ЮТЗапросы.Запись("Справочник.Товары", ЮТест.Предикат()
.Реквизит("Поставщик").Равно(ДанныеОбъекта.Поставщик));
ЮТест.ОжидаетЧто(ДанныеЗаписи)
.Свойство("Ссылка").Равно(Ссылка);
// Документ, тест на табличную часть
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара")
.Фикция("Склад")
.Фикция("Организация")
.Фикция("Поставщик")
.ТабличнаяЧасть("Товары")
.ДобавитьСтроку()
.Фикция("Товар")
.Фикция("Цена");
Ссылка = Конструктор.Записать();
ДанныеОбъекта = Конструктор.ДанныеОбъекта();
ДанныеЗаписи = ЮТЗапросы.Запись("Документ.ПриходТовара", ЮТест.Предикат()
.Реквизит("Ссылка").Равно(Ссылка));
ЮТест.ОжидаетЧто(ДанныеЗаписи)
.Свойство("Ссылка").Равно(Ссылка)
.Свойство("Поставщик").Равно(ДанныеОбъекта.Поставщик)
.Свойство("Товары")
.ИмеетТип("Массив")
.ИмеетДлину(1)
.Свойство("Товары[0].НомерСтроки").Равно(1)
.Свойство("Товары[0].Товар").Равно(ДанныеОбъекта.Товары[0].Товар);
ДанныеЗаписи = ЮТЗапросы.Запись("Документ.ПриходТовара.Товары", ЮТест.Предикат()
.Реквизит("Товар").Равно(ДанныеОбъекта.Товары[0].Товар));
ЮТест.ОжидаетЧто(ДанныеЗаписи)
.Свойство("Ссылка").Равно(Ссылка)
.Свойство("Товар").Равно(ДанныеОбъекта.Товары[0].Товар);
// Регистры
Конструктор = ЮТест.Данные().КонструкторОбъекта("РегистрыСведений.КурсыВалют")
.Фикция("Период")
.Фикция("Валюта")
.Фикция("Курс");
Конструктор.Записать();
ДанныеОбъекта = Конструктор.ДанныеОбъекта();
ДанныеЗаписи = ЮТЗапросы.Запись("РегистрСведений.КурсыВалют", ЮТест.Предикат()
.Реквизит("Валюта").Равно(ДанныеОбъекта.Валюта));
ЮТест.ОжидаетЧто(ДанныеЗаписи)
.Свойство("Валюта").Равно(ДанныеОбъекта.Валюта)
.Свойство("Курс").Равно(ДанныеОбъекта.Курс);
КонецПроцедуры
Процедура Записи() Экспорт
ТоварыПоставщика = Новый Соответствие();
Поставщик = ЮТест.Данные().СоздатьЭлемент("Справочники.Контрагенты");
Для Инд = 1 По 5 Цикл
Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
.Фикция("Наименование")
.Установить("Поставщик", Поставщик);
ТоварыПоставщика.Вставить(Конструктор.Записать(), Конструктор.ДанныеОбъекта());
КонецЦикла;
Записи = ЮТЗапросы.Записи("Справочник.Товары", ЮТест.Предикат()
.Реквизит("Поставщик").Равно(Поставщик));
ЮТест.ОжидаетЧто(Записи)
.ИмеетТип("Массив")
.ИмеетДлину(5);
Для Каждого Запись Из Записи Цикл
ЮТест.ОжидаетЧто(Запись)
.ИмеетТип("Структура")
.Свойство("Ссылка")
.Свойство("Поставщик").Равно(Поставщик)
.Свойство("Код");
КонецЦикла;
КонецПроцедуры
#КонецОбласти