diff --git a/docs/docs/lib-features/vtables.md b/docs/docs/lib-features/vtables.md new file mode 100644 index 0000000..d3f96e9 --- /dev/null +++ b/docs/docs/lib-features/vtables.md @@ -0,0 +1,63 @@ +--- +sidebar_position: 7 +tags: [Функционал] +--- + +# Виртуальные таблицы + +```bsl +Запрос = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ВТаблицуЗначений(); +``` + +## Параметры виртульных таблиц + +```bsl +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); + +Запрос = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + // highlight-next-line + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + .Параметры(МассивПараметров) + .ВТаблицуЗначений(); +``` + +## Условия в параметрах виртульных таблиц + +### Предикатом + +```bsl +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); + +ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + // highlight-start + .ПараметрВиртуальнойТаблицы(2, СхЗапрос.Предикат() + .Реквизит("Валюта").Равно(Валюта)) + // highlight-end + .Параметры(МассивПараметров) + .ВТаблицуЗначений() +; +``` + +### Строкой + +```bsl +МассивПараметров = Новый Массив; +МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); +МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Валюта", Валюта)); + +ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + // highlight-next-line + .ПараметрВиртуальнойТаблицы(2, "Валюта = &Валюта") + .Параметры(МассивПараметров) + .ВТаблицуЗначений() +; +``` diff --git a/package.json b/package.json index 77166cd..57db4e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fluent-request-schema-1c", - "version": "0.0.1", + "version": "0.0.4", "scripts": { "build": "npm run build:config && npm run build:extension", "build:config": "cd scripts ", diff --git a/src/cfe/CommonModules/СхЗапросТест/Ext/Module.bsl b/src/cfe/CommonModules/СхЗапросТест/Ext/Module.bsl index 54681eb..db27604 100644 --- a/src/cfe/CommonModules/СхЗапросТест/Ext/Module.bsl +++ b/src/cfe/CommonModules/СхЗапросТест/Ext/Module.bsl @@ -74,6 +74,27 @@ .ДобавитьТест("Порядок") .ДобавитьТест("ПорядокУбывания") .ДобавитьТест("Итоги") + .ДобавитьТестовыйНабор("СЗ: Виртуальные таблицы") + .ДобавитьТест("СрезПоследних") + .ДобавитьТест("СрезПоследнихСПараметром") + .ДобавитьТест("СрезПоследнихСФильтром") + .Перед("Перед_СрезПоследнихСФильтром") + .ДобавитьТест("СрезПоследнихСоСложнымФильтром") + .Перед("Перед_СрезПоследнихСоСложнымФильтром") + .ДобавитьТест("СрезПоследнихСПараметромИФильтром") + .Перед("Перед_СрезПоследнихСПараметромИФильтром") + .ДобавитьТест("СрезПоследнихСПараметромИФильтромВОбратномПорядке") + .Перед("Перед_СрезПоследнихСПараметромИФильтромВОбратномПорядке") + .ДобавитьТест("НеВиртуальнаяТаблицаСПараметромВиртуальнойТаблицы") + .ДобавитьТест("ОбъединениеДвухВиртуальныхТаблицСПараметрами") + .Перед("Перед_ОбъединениеДвухВиртуальныхТаблицСПараметрами") + .ДобавитьТест("ВиртуальнаяТаблицаВоВложенномЗапросе") + .ДобавитьТест("ПараметровВиртуальнойТаблицыБольшеЧемНужно") + .Перед("Перед_ПараметровВиртуальнойТаблицыБольшеЧемНужно") + .ДобавитьТест("ПараметрВиртуальнойТаблицыПредикатом") + .Перед("Перед_ПараметрВиртуальнойТаблицыПредикатом") + .ДобавитьТест("ПараметрВиртуальнойТаблицыСоСложнымПредикатом") + .Перед("Перед_ПараметрВиртуальнойТаблицыСоСложнымПредикатом") .ДобавитьТестовыйНабор("СЗ: Реальные запросы") .ДобавитьТест("АдресныйКлассификаторСлужебный_ТаблицаАдресныхСокращений") .Перед("Перед_АдресныйКлассификаторСлужебный_ТаблицаАдресныхСокращений") @@ -112,6 +133,57 @@ КонецПроцедуры +#Область ВиртуальныеТаблицы + +Процедура Перед_СрезПоследнихСФильтром() Экспорт + + СоздатьВалютуИУстановитьКурс(); + +КонецПроцедуры + +Процедура Перед_СрезПоследнихСоСложнымФильтром() Экспорт + + СоздатьВалютуИУстановитьКурс(); + +КонецПроцедуры + +Процедура Перед_СрезПоследнихСПараметромИФильтром() Экспорт + + СоздатьВалютуИУстановитьКурс(); + +КонецПроцедуры + +Процедура Перед_СрезПоследнихСПараметромИФильтромВОбратномПорядке() Экспорт + + СоздатьВалютуИУстановитьКурс(); + +КонецПроцедуры + +Процедура Перед_ОбъединениеДвухВиртуальныхТаблицСПараметрами() Экспорт + + СоздатьВалютуИУстановитьКурс("Валюта1"); + СоздатьВалютуИУстановитьКурс("Валюта2"); + +КонецПроцедуры + +Процедура Перед_ПараметровВиртуальнойТаблицыБольшеЧемНужно() Экспорт + + СоздатьВалютуИУстановитьКурс(); + +КонецПроцедуры + +Процедура Перед_ПараметрВиртуальнойТаблицыПредикатом() Экспорт + + СоздатьВалютуИУстановитьКурс(); + +КонецПроцедуры + +Процедура Перед_ПараметрВиртуальнойТаблицыСоСложнымПредикатом() Экспорт + + СоздатьВалютуИУстановитьКурс(); + +КонецПроцедуры + Процедура Перед_АдресныйКлассификаторСлужебный_ТаблицаАдресныхСокращений() Экспорт Для Сч = 1 По 3 Цикл @@ -133,6 +205,8 @@ #КонецОбласти +#КонецОбласти + #Область Тесты #Область Базовые @@ -1342,6 +1416,264 @@ #КонецОбласти +#Область ВиртуальныеТаблицы + +Процедура СрезПоследних() Экспорт + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ВТаблицуЗначений() + ; + + Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних"); + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(Запрос.Выполнить().Выгрузить().Количество()) + ; + +КонецПроцедуры + +Процедура СрезПоследнихСПараметром() Экспорт + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних"); + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(Запрос.Выполнить().Выгрузить().Количество()) + ; + +КонецПроцедуры + +Процедура СрезПоследнихСФильтром() Экспорт + + Контекст = ЮТест.КонтекстТеста(); + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Валюта", Контекст.Валюта)); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(2, "Валюта = &Валюта") + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(1) + .Свойство("[0].Валюта").Равно(Контекст.Валюта) + ; + +КонецПроцедуры + +Процедура СрезПоследнихСоСложнымФильтром() Экспорт + + Контекст = ЮТест.КонтекстТеста(); + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Валюта", Контекст.Валюта)); + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Курс", Контекст.Курс)); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(2, "Валюта = &Валюта И Курс = &Курс") + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(1) + .Свойство("[0].Валюта").Равно(Контекст.Валюта) + .Свойство("[0].Курс").Равно(Контекст.Курс) + ; + +КонецПроцедуры + +Процедура СрезПоследнихСПараметромИФильтром() Экспорт + + Контекст = ЮТест.КонтекстТеста(); + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Валюта", Контекст.Валюта)); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + .ПараметрВиртуальнойТаблицы(2, "Валюта = &Валюта") + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(1) + .Свойство("[0].Валюта").Равно(Контекст.Валюта) + ; + +КонецПроцедуры + +Процедура СрезПоследнихСПараметромИФильтромВОбратномПорядке() Экспорт + + Контекст = ЮТест.КонтекстТеста(); + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Валюта", Контекст.Валюта)); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(2, "Валюта = &Валюта") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(1) + .Свойство("[0].Валюта").Равно(Контекст.Валюта) + ; + +КонецПроцедуры + +Процедура НеВиртуальнаяТаблицаСПараметромВиртуальнойТаблицы() Экспорт + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("Справочник.Номенклатура") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + .ВТаблицуЗначений() + ; + + // TODO: + +КонецПроцедуры + +Процедура ОбъединениеДвухВиртуальныхТаблицСПараметрами() Экспорт + + Контекст = ЮТест.КонтекстТеста(); + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Валюта1", Контекст.Валюта1)); + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Валюта2", Контекст.Валюта2)); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(2, "Валюта = &Валюта1") + .ОбъединитьВсе("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(2, "Валюта = &Валюта2") + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(2) + .Свойство("[0].Валюта").Равно(Контекст.Валюта1) + .Свойство("[1].Валюта").Равно(Контекст.Валюта2) + ; + +КонецПроцедуры + +Процедура ВиртуальнаяТаблицаВоВложенномЗапросе() Экспорт + + // TODO: + +КонецПроцедуры + +Процедура ПараметровВиртуальнойТаблицыБольшеЧемНужно() Экспорт + + Контекст = ЮТест.КонтекстТеста(); + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "Валюта", Контекст.Валюта)); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + .ПараметрВиртуальнойТаблицы(2, "Валюта = &Валюта") + .ПараметрВиртуальнойТаблицы(3, "КакойТоЛишнийПараметр") + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(1) + .Свойство("[0].Валюта").Равно(Контекст.Валюта) + ; + +КонецПроцедуры + +Процедура ПараметрВиртуальнойТаблицыПредикатом() Экспорт + + Контекст = ЮТест.КонтекстТеста(); + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + .ПараметрВиртуальнойТаблицы(2, СхЗапрос.Предикат() + .Реквизит("Валюта").Равно(Контекст.Валюта)) + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(1) + .Свойство("[0].Валюта").Равно(Контекст.Валюта) + ; + +КонецПроцедуры + +Процедура ПараметрВиртуальнойТаблицыСоСложнымПредикатом() Экспорт + + Контекст = ЮТест.КонтекстТеста(); + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + "НаДату", ТекущаяДатаСеанса())); + + ТаблицаЗначений = СхЗапрос.НовыйЗапрос("РегистрСведений.КурсыВалют.СрезПоследних") + .ПараметрВиртуальнойТаблицы(1, "&НаДату") + .ПараметрВиртуальнойТаблицы(2, СхЗапрос.Предикат() + .Реквизит("Валюта").Равно(Контекст.Валюта) + .Реквизит("Курс").Равно(Контекст.Курс) + ) + .Параметры(МассивПараметров) + .ВТаблицуЗначений() + ; + + ЮТест.ОжидаетЧто(ТаблицаЗначений) + .ИмеетТип("ТаблицаЗначений") + .ИмеетДлину(1) + .Свойство("[0].Валюта").Равно(Контекст.Валюта) + .Свойство("[0].Курс").Равно(Контекст.Курс) + ; + +КонецПроцедуры + +#КонецОбласти + #Область РеальныеЗапросы Процедура АдресныйКлассификаторСлужебный_ТаблицаАдресныхСокращений() Экспорт @@ -1409,4 +1741,27 @@ КонецПроцедуры +Процедура СоздатьВалютуИУстановитьКурс(НаименованиеПараметра = "Валюта") + + Валюта = ЮТест.Данные().КонструкторОбъекта("Справочники.Валюты") + .Фикция("Наименование") + .Записать() + ; + + Курс = ЮТест.Данные().СлучайноеЧисло(2, 100, 2); + + ЮТест.Данные().КонструкторОбъекта("РегистрСведений.КурсыВалют") + .Установить("Период", ТекущаяДатаСеанса()) + .Установить("Валюта", Валюта) + .Установить("Курс", Курс) + .Установить("Кратность", 1) + .Записать() + ; + + Контекст = ЮТест.КонтекстТеста(); + Контекст.Вставить(НаименованиеПараметра, Валюта); + Контекст.Вставить("Курс", Курс); + +КонецПроцедуры + #КонецОбласти diff --git a/src/cfe/CommonModules/СхПроцессорыСхемЗапросаСлужебный/Ext/Module.bsl b/src/cfe/CommonModules/СхПроцессорыСхемЗапросаСлужебный/Ext/Module.bsl index ba9c56b..9a27949 100644 --- a/src/cfe/CommonModules/СхПроцессорыСхемЗапросаСлужебный/Ext/Module.bsl +++ b/src/cfe/CommonModules/СхПроцессорыСхемЗапросаСлужебный/Ext/Module.bsl @@ -104,7 +104,7 @@ КонецЕсли; Если ТипЗнч(СтруктураСхемыЗапроса.ИсточникДанных) = Тип("Строка") Тогда - Оператор.Источники.Добавить(СтруктураСхемыЗапроса.ИсточникДанных); + ИсточникСхемыЗапроса = Оператор.Источники.Добавить(СтруктураСхемыЗапроса.ИсточникДанных); Иначе СтруктураСхемыВложенногоЗапроса = СтруктураСхемыЗапроса.ИсточникДанных; Если Не СтруктураСхемыВложенногоЗапроса.Свойство("ПсевдонимИсточника") Или @@ -120,6 +120,20 @@ ИсточникСхемыЗапроса.Источник.Запрос.УстановитьТекстЗапроса(ВложенныйЗапрос); КонецЕсли; + Если СтруктураСхемыЗапроса.Свойство("ПараметрыВиртуальнойТаблицы") И ТипЗнч(СтруктураСхемыЗапроса.ПараметрыВиртуальнойТаблицы) = Тип("Массив") Тогда + Для Сч = 1 По СтруктураСхемыЗапроса.ПараметрыВиртуальнойТаблицы.Количество() Цикл + Если Сч > ИсточникСхемыЗапроса.Источник.Параметры.Количество() Тогда + Прервать; + КонецЕсли; + Если СтруктураСхемыЗапроса.ПараметрыВиртуальнойТаблицы[Сч - 1] = Неопределено Тогда + Продолжить; + КонецЕсли; + + ИсточникСхемыЗапроса.Источник.Параметры[Сч - 1].Выражение = + Новый ВыражениеСхемыЗапроса(СтруктураСхемыЗапроса.ПараметрыВиртуальнойТаблицы[Сч - 1]); + КонецЦикла; + КонецЕсли; + Возврат Оператор; КонецФункции @@ -311,11 +325,11 @@ Оператор.ТипОбъединения = ТипОбъединенияСхемыЗапроса.Объединить; КонецЕсли; Если ТипЗнч(ЭлементОбъединения.СтруктураСхемыЗапроса.ИсточникДанных) = Тип("Строка") Тогда - Оператор.Источники.Добавить(ЭлементОбъединения.СтруктураСхемыЗапроса.ИсточникДанных); + ИсточникСхемыЗапроса = Оператор.Источники.Добавить(ЭлементОбъединения.СтруктураСхемыЗапроса.ИсточникДанных); ДобавитьДанныеЗапроса(ЗапросПакета, Оператор, Запрос, ЭлементОбъединения.СтруктураСхемыЗапроса); ИначеЕсли ТипЗнч(ЭлементОбъединения.СтруктураСхемыЗапроса.ИсточникДанных.ИсточникДанных) = Тип("Строка") Тогда - Оператор.Источники.Добавить(ЭлементОбъединения.СтруктураСхемыЗапроса.ИсточникДанных.ИсточникДанных); + ИсточникСхемыЗапроса = Оператор.Источники.Добавить(ЭлементОбъединения.СтруктураСхемыЗапроса.ИсточникДанных.ИсточникДанных); ДобавитьДанныеЗапроса(ЗапросПакета, Оператор, Запрос, ЭлементОбъединения.СтруктураСхемыЗапроса.ИсточникДанных); Иначе @@ -337,6 +351,20 @@ КонецЕсли; + Если ЭлементОбъединения.Свойство("ПараметрыВиртуальнойТаблицы") И ТипЗнч(ЭлементОбъединения.ПараметрыВиртуальнойТаблицы) = Тип("Массив") Тогда + Для Сч = 1 По ЭлементОбъединения.ПараметрыВиртуальнойТаблицы.Количество() Цикл + Если Сч > ИсточникСхемыЗапроса.Источник.Параметры.Количество() Тогда + Прервать; + КонецЕсли; + Если СтруктураСхемыЗапроса.ПараметрыВиртуальнойТаблицы[Сч - 1] = Неопределено Тогда + Продолжить; + КонецЕсли; + + ИсточникСхемыЗапроса.Источник.Параметры[Сч - 1].Выражение = + Новый ВыражениеСхемыЗапроса(ЭлементОбъединения.ПараметрыВиртуальнойТаблицы[Сч - 1]); + КонецЦикла; + КонецЕсли; + КонецЦикла; КонецЕсли; diff --git a/src/cfe/CommonModules/СхПроцессорыСхемЗапросаСлужебныйКлиентСервер/Ext/Module.bsl b/src/cfe/CommonModules/СхПроцессорыСхемЗапросаСлужебныйКлиентСервер/Ext/Module.bsl index c8f3a64..2bd7f63 100644 --- a/src/cfe/CommonModules/СхПроцессорыСхемЗапросаСлужебныйКлиентСервер/Ext/Module.bsl +++ b/src/cfe/CommonModules/СхПроцессорыСхемЗапросаСлужебныйКлиентСервер/Ext/Module.bsl @@ -77,6 +77,36 @@ КонецПроцедуры +Процедура УстановитьПараметрВиртуальнойТаблицы(СхемаЗапроса, Номер, Выражение) Экспорт + + МассивОбъединений = Новый Массив; + Если СхемаЗапроса.Свойство("Объединения") И ТипЗнч(СхемаЗапроса.Объединения) = Тип("Массив") Тогда + МассивОбъединений = СхемаЗапроса.Объединения; + КонецЕсли; + + МассивПараметров = Новый Массив; + Если СхемаЗапроса.Свойство("Параметры") И ТипЗнч(СхемаЗапроса.Параметры) = Тип("Массив") Тогда + МассивПараметров = СхемаЗапроса.Параметры; + КонецЕсли; + + Если МассивОбъединений.Количество() = 0 Тогда + СхемаЗапроса.Вставить("ПараметрыВиртуальнойТаблицы", + ПолучитьПараметрыВиртуальнойТаблицы(СхемаЗапроса, Номер, Выражение, МассивПараметров)); + Иначе + + ПоследнееОбъединение = МассивОбъединений[МассивОбъединений.Количество() - 1]; + ПоследнееОбъединение.Вставить("ПараметрыВиртуальнойТаблицы", + ПолучитьПараметрыВиртуальнойТаблицы(ПоследнееОбъединение, Номер, Выражение, МассивПараметров)); + + МассивОбъединений[МассивОбъединений.Количество() - 1] = ПоследнееОбъединение; + СхемаЗапроса.Объединения = МассивОбъединений; + + КонецЕсли; + + СхемаЗапроса.Вставить("Параметры", МассивПараметров); + +КонецПроцедуры + Процедура УстановитьУсловие(СхемаЗапроса, Предикат) Экспорт СхемаЗапроса.Вставить("Условия", ПолучитьУсловияОтбора(СхемаЗапроса, Предикат)); @@ -241,17 +271,7 @@ КонецЕсли; Условия = ПолучитьУсловияОтбора(СхемаЗапроса, Предикат); - - УсловиеСтрокой = ""; - Для каждого Условие Из Условия Цикл - Если Не ПустаяСтрока(УсловиеСтрокой) Тогда - УсловиеСтрокой = УсловиеСтрокой + " И "; - КонецЕсли; - - УсловиеСтрокой = УсловиеСтрокой + Условие.УсловиеСтрокой; - МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", - Условие.ИмяПараметра, Условие.Значение)); - КонецЦикла; + УсловиеСтрокой = ПолучитьУсловияСтрокой(Условия, МассивПараметров); ПриведенноеЗначениеИстина = ПривестиЗначение(ЗначениеИстина); ПриведенноеЗначениеЛожь = ПривестиЗначение(ЗначениеЛожь); @@ -476,6 +496,46 @@ КонецФункции +// СхемаЗапроса может быть или структурой запроса или структурой объединения, +// так что установка каких-то общих данных запроса, типа парметров запроса, надо +// выполнять вне пределов этой функции. Для этого и передаётся МассивПараметров +Функция ПолучитьПараметрыВиртуальнойТаблицы(СхемаЗапроса, Номер, Выражение, МассивПараметров) + + ПараметрыВиртуальнойТаблицы = Новый Массив; + Если СхемаЗапроса.Свойство("ПараметрыВиртуальнойТаблицы") И ТипЗнч(СхемаЗапроса.ПараметрыВиртуальнойТаблицы) = Тип("Массив") Тогда + ПараметрыВиртуальнойТаблицы = СхемаЗапроса.ПараметрыВиртуальнойТаблицы; + КонецЕсли; + + Если ПараметрыВиртуальнойТаблицы.Количество() >= Номер Тогда + Если ТипЗнч(Выражение) = Тип("Строка") Тогда + ПараметрыВиртуальнойТаблицы[Номер - 1] = Выражение; + Иначе + Условия = ПолучитьУсловияОтбора(СхемаЗапроса, Выражение); + УсловиеСтрокой = ПолучитьУсловияСтрокой(Условия, МассивПараметров); + + ПараметрыВиртуальнойТаблицы.Добавить(УсловиеСтрокой); + КонецЕсли; + Иначе + Для Сч = ПараметрыВиртуальнойТаблицы.Количество() По Номер - 1 Цикл + Если Сч = Номер - 1 Тогда + Если ТипЗнч(Выражение) = Тип("Строка") Тогда + ПараметрыВиртуальнойТаблицы.Добавить(Выражение); + Иначе + Условия = ПолучитьУсловияОтбора(СхемаЗапроса, Выражение); + УсловиеСтрокой = ПолучитьУсловияСтрокой(Условия, МассивПараметров); + + ПараметрыВиртуальнойТаблицы.Добавить(УсловиеСтрокой); + КонецЕсли; + Иначе + ПараметрыВиртуальнойТаблицы.Добавить(); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат ПараметрыВиртуальнойТаблицы; + +КонецФункции + Функция ПолучитьУсловияОтбора(СхемаЗапроса, Предикат) МассивУсловий = Новый Массив; @@ -604,4 +664,21 @@ КонецФункции +Функция ПолучитьУсловияСтрокой(Условия, МассивПараметров) + + УсловиеСтрокой = ""; + Для каждого Условие Из Условия Цикл + Если Не ПустаяСтрока(УсловиеСтрокой) Тогда + УсловиеСтрокой = УсловиеСтрокой + " И "; + КонецЕсли; + + УсловиеСтрокой = УсловиеСтрокой + Условие.УсловиеСтрокой; + МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение", + Условие.ИмяПараметра, Условие.Значение)); + КонецЦикла; + + Возврат УсловиеСтрокой; + +КонецФункции + #КонецОбласти diff --git a/src/cfe/ConfigDumpInfo.xml b/src/cfe/ConfigDumpInfo.xml index 288102f..cc729e1 100644 --- a/src/cfe/ConfigDumpInfo.xml +++ b/src/cfe/ConfigDumpInfo.xml @@ -2,41 +2,41 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + diff --git a/src/cfe/DataProcessors/СхПроцессорСхемЗапроса/Ext/ObjectModule.bsl b/src/cfe/DataProcessors/СхПроцессорСхемЗапроса/Ext/ObjectModule.bsl index 621bf17..f45e102 100644 --- a/src/cfe/DataProcessors/СхПроцессорСхемЗапроса/Ext/ObjectModule.bsl +++ b/src/cfe/DataProcessors/СхПроцессорСхемЗапроса/Ext/ObjectModule.bsl @@ -87,6 +87,24 @@ Возврат ЭтотОбъект; КонецФункции +// +// +Функция ПараметрВиртуальнойТаблицы(Номер, Выражение) Экспорт + + Если ТипЗнч(Выражение) = Тип("Строка") Или ТипЗнч(Выражение) = Тип("Структура") Тогда + _Выражение = Выражение; + ИначеЕсли ТипЗнч(Выражение) = Тип("ОбработкаОбъект.СхПроцессорПредикатов") Тогда + _Выражение = Выражение.Получить(); + Иначе + ВызватьИсключение "Неверный тип выражения в методе ""ПараметрВиртуальнойТаблицы"""; + КонецЕсли; + + СхПроцессорыСхемЗапросаСлужебныйКлиентСервер + .УстановитьПараметрВиртуальнойТаблицы(СхемаЗапроса, Номер, _Выражение); + Возврат ЭтотОбъект; + +КонецФункции + // // Функция Поместить(ИмяВременнойТаблицы) Экспорт diff --git a/src/cfe/DataProcessors/СхПроцессорСхемЗапроса/Forms/Форма/Ext/Form/Module.bsl b/src/cfe/DataProcessors/СхПроцессорСхемЗапроса/Forms/Форма/Ext/Form/Module.bsl index 7d501c6..57f37dd 100644 --- a/src/cfe/DataProcessors/СхПроцессорСхемЗапроса/Forms/Форма/Ext/Form/Module.bsl +++ b/src/cfe/DataProcessors/СхПроцессорСхемЗапроса/Forms/Форма/Ext/Form/Module.bsl @@ -76,6 +76,20 @@ Возврат ЭтотОбъект; КонецФункции +&НаКлиенте +Функция ПараметрВиртуальнойТаблицы(Номер, Выражение) Экспорт + СхПроцессорыСхемЗапросаСлужебныйКлиентСервер + .УстановитьПараметрВиртуальнойТаблицы(СхемаЗапроса, Номер, Выражение); + Возврат ЭтотОбъект; +КонецФункции + +&НаКлиенте +Функция Поместить(ИмяВременнойТаблицы) Экспорт + СхПроцессорыСхемЗапросаСлужебныйКлиентСервер + .УстановитьИмяВременнойТаблицы(СхемаЗапроса, ИмяВременнойТаблицы); + Возврат ЭтотОбъект; +КонецФункции + &НаКлиенте Функция Где(Предикат) Экспорт