diff --git a/exts/yaxunit/src/CommonModules/ЮТЗапросы/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТЗапросы/Module.bsl index aa56287b..1ae9ab9b 100644 --- a/exts/yaxunit/src/CommonModules/ЮТЗапросы/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТЗапросы/Module.bsl @@ -54,6 +54,41 @@ КонецФункции +// Возвращяет первую запись таблицы соответствующую условиям +// +// Параметры: +// ИмяТаблицы - Строка - Имя таблицы базы +// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить +// - см. ЮТФабрика.ВыражениеПредиката +// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат +// - Неопределено - Проверит, что таблица не пустая +// Возвращаемое значение: +// Структура, Неопределено - Содержит все данные записи, включая табличный части +Функция Запись(ИмяТаблицы, Предикат) Экспорт + + ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат, "*"); + //@skip-check constructor-function-return-section + Возврат ЮТЗапросыВызовСервера.Записи(ОписаниеЗапроса, Истина); + +КонецФункции + +// Возвращяет записи таблицы соответствующую условиям +// +// Параметры: +// ИмяТаблицы - Строка - Имя таблицы базы +// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить +// - см. ЮТФабрика.ВыражениеПредиката +// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат +// - Неопределено - Проверит, что таблица не пустая +// Возвращаемое значение: +// Массив из Структура - Найденные записи, включая табличный части +Функция Записи(ИмяТаблицы, Предикат) Экспорт + + ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат, "*"); + Возврат ЮТЗапросыВызовСервера.Записи(ОписаниеЗапроса, Ложь); + +КонецФункции + // Вернет признак содержит ли таблица записи удовлетворяющие переданным условиям // // Параметры: @@ -107,9 +142,7 @@ // Возвращаемое значение: // Структура - Описание запроса: // * ИмяТаблицы - Строка - -// * ВыбираемыеПоля - Структура - Выражения выбираемых полей: -// * Ключ - Строка - Имя поля -// * Значение - Строка - выражение поля +// * ВыбираемыеПоля - Массив из Строка // * КоличествоЗаписей - Число, Неопределено - Ограничение количества выбираемых записей // * Условия - Массив из Строка - Коллекция выражений условий, которые будут объединены через `И` // * ЗначенияПараметров - Структура - Набор параметров запроса @@ -117,7 +150,7 @@ Описание = Новый Структура(); Описание.Вставить("ИмяТаблицы", ""); - Описание.Вставить("ВыбираемыеПоля", Новый Структура); + Описание.Вставить("ВыбираемыеПоля", Новый Массив); Описание.Вставить("КоличествоЗаписей", Неопределено); Описание.Вставить("Условия", Новый Массив()); Описание.Вставить("ЗначенияПараметров", Новый Структура()); diff --git a/exts/yaxunit/src/CommonModules/ЮТЗапросыВызовСервера/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТЗапросыВызовСервера/Module.bsl index 931cadad..9a31a352 100644 --- a/exts/yaxunit/src/CommonModules/ЮТЗапросыВызовСервера/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТЗапросыВызовСервера/Module.bsl @@ -23,26 +23,7 @@ Запрос = Запрос(ОписаниеЗапроса); РезультатЗапроса = Запрос.Выполнить(); - Если НЕ ДляКлиента Тогда - Возврат РезультатЗапроса.Выгрузить(); - ИначеЕсли РезультатЗапроса.Пустой() Тогда - Возврат Новый Массив(); - КонецЕсли; - - Ключи = СтрСоединить(ЮТОбщий.ВыгрузитьЗначения(РезультатЗапроса.Колонки, "Имя"), ","); - Результат = Новый Массив(); - - Выборка = РезультатЗапроса.Выбрать(); - - Пока Выборка.Следующий() Цикл - - Запись = Новый Структура(Ключи); - ЗаполнитьЗначенияСвойств(Запись, Выборка); - Результат.Добавить(Запись); - - КонецЦикла; - - Возврат Результат; + Возврат ВыгрузитьРезультатЗапроса(РезультатЗапроса, ДляКлиента); КонецФункции @@ -88,6 +69,35 @@ КонецФункции +// Возвращяет записи результат запроса +// +// Параметры: +// ОписаниеЗапроса - см. ЮТЗапросы.ОписаниеЗапроса +// ОднаЗапись - Булево - Вернуть первую запись +// +// Возвращаемое значение: +// Массив из Структура, Структура, Неопределено - Записи +Функция Записи(ОписаниеЗапроса, ОднаЗапись) Экспорт + + Если ОднаЗапись Тогда + ОписаниеЗапроса.КоличествоЗаписей = 1; + КонецЕсли; + + Запрос = Запрос(ОписаниеЗапроса); + РезультатЗапроса = Запрос.Выполнить(); + + Записи = ВыгрузитьРезультатЗапроса(РезультатЗапроса, Истина); + + Если НЕ ОднаЗапись Тогда + Возврат Записи; + ИначеЕсли Записи.Количество() Тогда + Возврат Записи[0]; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -108,14 +118,10 @@ Строки.Добавить("ПЕРВЫЕ " + ЮТОбщий.ЧислоВСтроку(ОписаниеЗапроса.КоличествоЗаписей)); КонецЕсли; - ВыбираемыеПоля = Новый Массив(); - Для Каждого Выражение Из ОписаниеЗапроса.ВыбираемыеПоля Цикл - Поле = СтрШаблон(" %1 КАК %2", ?(Выражение.Значение = Неопределено, Выражение.Ключ, Выражение.Значение), Выражение.Ключ); - ВыбираемыеПоля.Добавить(Поле); - КонецЦикла; - - Если НЕ ВыбираемыеПоля.Количество() Тогда - ВыбираемыеПоля.Добавить("1 КАК Поле"); + Если ОписаниеЗапроса.ВыбираемыеПоля.Количество() Тогда + ВыбираемыеПоля = ОписаниеЗапроса.ВыбираемыеПоля; + Иначе + ВыбираемыеПоля = ЮТОбщий.ЗначениеВМассиве("1 КАК Поле"); КонецЕсли; Строки.Добавить(СтрСоединить(ВыбираемыеПоля, "," + Символы.ПС)); @@ -159,4 +165,51 @@ КонецФункции +Функция ВыгрузитьРезультатЗапроса(РезультатЗапроса, ВМассив) + + Если НЕ ВМассив Тогда + Возврат РезультатЗапроса.Выгрузить(); + Иначе + Результат = Новый Массив(); + КонецЕсли; + + Если РезультатЗапроса.Пустой() Тогда + Возврат Результат; + КонецЕсли; + + Реквизиты = Новый Массив(); + ТабличныеЧасти = Новый Массив(); + + ТипРезультатЗапроса = Тип("РезультатЗапроса"); + Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл + + Реквизиты.Добавить(Колонка.Имя); + + Если Колонка.ТипЗначения.СодержитТип(ТипРезультатЗапроса) Тогда + ТабличныеЧасти.Добавить(Колонка.Имя); + КонецЕсли; + + КонецЦикла; + + ПараметрыКонструктора = СтрСоединить(Реквизиты, ","); + + Выборка = РезультатЗапроса.Выбрать(); + + Пока Выборка.Следующий() Цикл + + Запись = Новый Структура(ПараметрыКонструктора); + ЗаполнитьЗначенияСвойств(Запись, Выборка); + + Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл + Запись[ТабличнаяЧасть] = ВыгрузитьРезультатЗапроса(Выборка[ТабличнаяЧасть], ВМассив); + КонецЦикла; + + Результат.Добавить(Запись); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git a/exts/yaxunit/src/CommonModules/ЮТЗапросыКлиентСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТЗапросыКлиентСервер/Module.bsl index 9ee6615b..a039e9e2 100644 --- a/exts/yaxunit/src/CommonModules/ЮТЗапросыКлиентСервер/Module.bsl +++ b/exts/yaxunit/src/CommonModules/ЮТЗапросыКлиентСервер/Module.bsl @@ -22,7 +22,11 @@ Описание = ЮТЗапросы.ОписаниеЗапроса(); Описание.ИмяТаблицы = ИмяТаблицы; - Описание.ВыбираемыеПоля.Вставить("Проверка", "1"); + Если ВыбираемыеПоля = Неопределено Тогда + Описание.ВыбираемыеПоля.Добавить("1 КАК Проверка"); + Иначе + ЗаполнитьВыбираемыеПоля(Описание, ВыбираемыеПоля) + КонецЕсли; СформироватьУсловия(ПредикатыУсловия, Описание.Условия, Описание.ЗначенияПараметров); @@ -93,4 +97,32 @@ КонецФункции +Процедура ЗаполнитьВыбираемыеПоля(ОписаниеЗапроса, Знач ВыбираемыеПоля) + + ТипПараметра = ТипЗнч(ВыбираемыеПоля); + + Если ТипПараметра = Тип("Строка") Тогда + ВыбираемыеПоля = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ВыбираемыеПоля, ",", Истина); + ТипПараметра = Тип("Массив"); + КонецЕсли; + + Если ТипПараметра = Тип("Массив") Тогда + + ОписаниеЗапроса.ВыбираемыеПоля = ВыбираемыеПоля; + + ИначеЕсли ТипПараметра = Тип("Структура") Тогда + + Для Каждого Поле Из ВыбираемыеПоля Цикл + Выражение = СтрШаблон("%1 КАК %2", Поле.Значение, Поле.Ключ); + ОписаниеЗапроса.ВыбираемыеПоля.Добавить(Выражение); + КонецЦикла; + + Иначе + + ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТЗапросыКлиентСервер.ЗаполнитьВыбираемыеПоля", ВыбираемыеПоля); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти diff --git a/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl b/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl index a5384258..afcf8ac8 100644 --- a/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl +++ b/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl @@ -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); + + Для Каждого Запись Из Записи Цикл + ЮТест.ОжидаетЧто(Запись) + .ИмеетТип("Структура") + .Свойство("Ссылка") + .Свойство("Поставщик").Равно(Поставщик) + .Свойство("Код"); + КонецЦикла; + +КонецПроцедуры + #КонецОбласти