diff --git a/src/cfe/.gitkeep b/src/cfe/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/src/cfe/CommonModules/СЗ_Запрос.xml b/src/cfe/CommonModules/СЗ_Запрос.xml
new file mode 100644
index 0000000..9658e77
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_Запрос.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ СЗ_Запрос
+
+
+ ru
+ Схема запроса: запрос
+
+
+
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_Запрос/Ext/Module.bsl b/src/cfe/CommonModules/СЗ_Запрос/Ext/Module.bsl
new file mode 100644
index 0000000..15b46b5
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_Запрос/Ext/Module.bsl
@@ -0,0 +1,27 @@
+
+Функция НовыйЗапрос(ИсточникДанных, Первые = 0, Различные = Ложь, Разрешенные = Ложь) Экспорт
+
+ ПроцессорСхемЗапроса = СЗ_ПроцессорыСхемЗапросаКлиентСервер
+ .НовыйПроцессорСхемЗапроса(ИсточникДанных, Первые, Различные, Разрешенные);
+
+ Возврат ПроцессорСхемЗапроса;
+
+КонецФункции
+
+Функция Предикат() Экспорт
+
+ ПроцессорПредикатов = СЗ_ПроцессорыПредикатовКлиентСервер
+ .НовыйПроцессорПредикатов();
+
+ Возврат ПроцессорПредикатов;
+
+КонецФункции
+
+// TODO: В модуле СЗ_ПроцессорыСхемЗапросаКлиентСерверСлужебный так же регулярно требуетс
+// такая структура. Рефакторинг!
+Функция НовоеПоле(ИмяПоля, Источник, Псевдоним) Экспорт
+
+ Возврат Новый Структура("ИмяПоля, Источник, Псевдоним",
+ ИмяПоля, Источник, Псевдоним);
+
+КонецФункции
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ЗапросТест.xml b/src/cfe/CommonModules/СЗ_ЗапросТест.xml
new file mode 100644
index 0000000..f2dd27a
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ЗапросТест.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ СЗ_ЗапросТест
+
+
+ ru
+ Схема запроса: запрос тест
+
+
+
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ЗапросТест/Ext/Module.bsl b/src/cfe/CommonModules/СЗ_ЗапросТест/Ext/Module.bsl
new file mode 100644
index 0000000..079245f
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ЗапросТест/Ext/Module.bsl
@@ -0,0 +1,566 @@
+#Область ОбъявлениеТестов
+
+Процедура ИсполняемыеСценарии() Экспорт
+
+ ЮТТесты
+ .ДобавитьТест("ИсключениеИсточникОтсутствует")
+ .ДобавитьТест("ИсключениеИсточникПустаяСтрока")
+ .ДобавитьТест("ЗапросВТаблицуЗначений")
+ .ДобавитьТест("ЗапросВМассив")
+ .ДобавитьТест("Первые")
+ .ДобавитьТест("Различные")
+ .ДобавитьТест("Разрешенные")
+ .ДобавитьТест("ИсключениеПолеОтсутствует")
+ .ДобавитьТест("ДобавитьПоляССинонимами")
+ .ДобавитьТест("ДобавитьНесколькоПолей")
+ .ДобавитьТест("ДобавитьНесколькоПолейСПереносомСтроки")
+ .ДобавитьТест("ДобавитьПоляССинонимамиИСписком")
+ .ДобавитьТест("ВсеПоляДляНеСсылочногоТипа")
+ .ДобавитьТест("ВсеПоляДляСсылочногоТипа")
+ .ДобавитьТест("ЗапросСУсловием")
+ .ДобавитьТест("ЛевоеСоединениеПоИсточникуСтроке")
+ .ДобавитьТест("ЛевоеСоединениеПоИсточникуЗапросу")
+ .ДобавитьТест("ЛевоеСоединениеБезПредиката")
+ .ДобавитьТест("ЛевоеСоединениеНесколькоУсловийВПредикате")
+ .ДобавитьТест("ЛевоеСоединениеПредикатЭтоПараметр")
+ .ДобавитьТест("ЛевоеСоединениеБезПсевдонимовВСоединении")
+ .ДобавитьТест("НесколькоЛевыхСоединений")
+ .ДобавитьТест("ВложенныйЗапрос")
+ .ДобавитьТест("Порядок")
+ .ДобавитьТест("Итоги")
+ .ДобавитьТест("АдресныйКлассификаторСлужебный_ТаблицаАдресныхСокращений")
+ ;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Тесты
+
+#Область Базовые
+
+Процедура ИсключениеИсточникОтсутствует() Экспорт
+
+ Предикат = СЗ_Запрос.Предикат()
+ .Реквизит("ЭтоГруппа").Равно(Ложь)
+ .Получить()
+ ;
+
+ Обработка = Обработки.СЗ_ПроцессорСхемЗапроса.Создать();
+
+ ЮТест.ОжидаетЧто(Обработка)
+ .Метод("ВТаблицуЗначений")
+ .ВыбрасываетИсключение("Источник данных запроса не определен");
+
+КонецПроцедуры
+
+Процедура ИсключениеИсточникПустаяСтрока() Экспорт
+
+ Предикат = СЗ_Запрос.Предикат()
+ .Реквизит("ЭтоГруппа").Равно(Ложь)
+ .Получить()
+ ;
+
+ Запрос = СЗ_Запрос.НовыйЗапрос("")
+ .Где(Предикат)
+ ;
+
+ ЮТест.ОжидаетЧто(Запрос)
+ .Метод("ВТаблицуЗначений")
+ .ВыбрасываетИсключение("Источник данных запроса не определен");
+
+КонецПроцедуры
+
+Процедура ЗапросВТаблицуЗначений() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+
+КонецПроцедуры
+
+Процедура ЗапросВМассив() Экспорт
+
+ Массив = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .ВМассив("Ссылка")
+ ;
+
+ ЮТест.ОжидаетЧто(Массив)
+ .ИмеетТип("Массив")
+ ;
+ ЮТест.ОжидаетЧто(Массив.Количество())
+ .Больше(0)
+ ;
+
+КонецПроцедуры
+
+Процедура Первые() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура", 10)
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Равно(10)
+ ;
+
+КонецПроцедуры
+
+Процедура Различные() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура",, Истина)
+ .ВТаблицуЗначений()
+ ;
+
+КонецПроцедуры
+
+Процедура Разрешенные() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура",,, Истина)
+ .ВТаблицуЗначений()
+ ;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Поля
+
+// TODO: Поля могут быть выражениями
+
+Процедура ИсключениеПолеОтсутствует() Экспорт
+
+ НеправильноеНаименованиеПоля = "йцукен";
+
+ Запрос = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать(НеправильноеНаименованиеПоля)
+ ;
+
+ ЮТест.ОжидаетЧто(Запрос)
+ .Метод("ВТаблицуЗначений")
+ .ВыбрасываетИсключение(
+ СтрШаблон("Поле %1 в источнике не определено", НеправильноеНаименованиеПоля));
+
+КонецПроцедуры
+
+Процедура ДобавитьПоляССинонимами() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать(СЗ_Запрос.НовоеПоле("Ссылка",, "СсылкаНоменклатуры"))
+ .Выбрать(СЗ_Запрос.НовоеПоле("Наименование",, "НаименованиеНоменклатуры"))
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("СсылкаНоменклатуры")
+ .ИмеетСвойство("НаименованиеНоменклатуры")
+ ;
+
+КонецПроцедуры
+
+Процедура ДобавитьНесколькоПолей() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать("Ссылка, Наименование, ЭтоГруппа")
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("Наименование")
+ .ИмеетСвойство("ЭтоГруппа")
+ ;
+
+КонецПроцедуры
+
+Процедура ДобавитьНесколькоПолейСПереносомСтроки() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать("Ссылка, Наименование,
+ |ЭтоГруппа")
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("Наименование")
+ .ИмеетСвойство("ЭтоГруппа")
+ ;
+
+КонецПроцедуры
+
+Процедура ДобавитьПоляССинонимамиИСписком() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать(СЗ_Запрос.НовоеПоле("Ссылка",, "СсылкаНоменклатуры"))
+ .Выбрать("Наименование КАК НаименованиеНоменклатуры, ЭтоГруппа")
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("СсылкаНоменклатуры")
+ .ИмеетСвойство("НаименованиеНоменклатуры")
+ .ИмеетСвойство("ЭтоГруппа")
+ ;
+
+КонецПроцедуры
+
+Процедура ВсеПоляДляНеСсылочногоТипа() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("РегистрСведений.КурсыВалют")
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Валюта")
+ .ИмеетСвойство("Курс")
+ .ИмеетСвойство("Кратность")
+ ;
+
+КонецПроцедуры
+
+Процедура ВсеПоляДляСсылочногоТипа() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .ВыбратьВсе()
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("Наименование")
+ .ИмеетСвойство("ЭтоГруппа")
+ ;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Условия
+
+Процедура ЗапросСУсловием() Экспорт
+
+ Предикат = СЗ_Запрос.Предикат()
+ .Реквизит("ЭтоГруппа").Равно(Ложь)
+ ;
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Где(Предикат)
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Соединения
+
+Процедура ЛевоеСоединениеПоИсточникуСтроке() Экспорт
+
+ ПредикатДляСоединения = СЗ_Запрос.Предикат()
+ .Реквизит("НоменклатураСоединение.Ссылка").Равно("Номенклатура.Родитель")
+ ;
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать("Номенклатура.Ссылка,
+ |НоменклатураСоединение.Ссылка КАК НоменклатураСоединениеСсылка")
+ .ЛевоеСоединение("Справочник.Номенклатура КАК НоменклатураСоединение", ПредикатДляСоединения)
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("НоменклатураСоединениеСсылка")
+ ;
+
+КонецПроцедуры
+
+Процедура ЛевоеСоединениеПоИсточникуЗапросу() Экспорт
+
+ ЗапросДляСоединения = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура");
+ ПредикатДляСоединения = СЗ_Запрос.Предикат()
+ .Реквизит("Ссылка").Равно("Родитель")
+ ;
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать("Номенклатура.Ссылка,
+ |НоменклатураСоединение.Ссылка КАК НоменклатураСоединениеСсылка")
+ .ЛевоеСоединение(ЗапросДляСоединения, ПредикатДляСоединения)
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("НоменклатураСоединениеСсылка")
+ ;
+
+КонецПроцедуры
+
+Процедура ЛевоеСоединениеБезПредиката() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("РегистрСведений.ПримененияЕНВД")
+ .Выбрать("ПримененияЕНВД.Организация КАК Организация,
+ |ПримененияЕНВДСоединение.Склад КАК Склад")
+ .ЛевоеСоединение("РегистрСведений.ПримененияЕНВД КАК ПримененияЕНВДСоединение")
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Организация")
+ .ИмеетСвойство("Склад")
+ ;
+
+КонецПроцедуры
+
+Процедура ЛевоеСоединениеНесколькоУсловийВПредикате() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать("Номенклатура.Ссылка,
+ |НоменклатураСоединение.Ссылка КАК НоменклатураСоединениеСсылка")
+ .ЛевоеСоединение("Справочник.Номенклатура КАК НоменклатураСоединение", СЗ_Запрос.Предикат()
+ .Реквизит("НоменклатураСоединение.Ссылка").Равно("Номенклатура.Родитель")
+ .Реквизит("НоменклатураСоединение.ЭтоГруппа").Равно("ИСТИНА"))
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("НоменклатураСоединениеСсылка")
+ ;
+
+КонецПроцедуры
+
+Процедура ЛевоеСоединениеПредикатЭтоПараметр() Экспорт
+
+ // Подготовка
+ Запрос = Новый Запрос;
+ Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
+ | Номенклатура.Ссылка КАК Ссылка
+ |ИЗ
+ | Справочник.Номенклатура КАК Номенклатура
+ |ГДЕ
+ | Номенклатура.ЭтоГруппа";
+
+ Выборка = Запрос.Выполнить().Выбрать();
+ Выборка.Следующий();
+
+ МассивПараметров = Новый Массив;
+ МассивПараметров.Добавить(Новый Структура("ИмяПараметра, Значение",
+ "Родитель", Выборка.Ссылка));
+
+ // Выполнение
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать("Номенклатура.Ссылка,
+ |НоменклатураСоединение.Ссылка КАК НоменклатураСоединениеСсылка")
+ .ЛевоеСоединение("Справочник.Номенклатура КАК НоменклатураСоединение", СЗ_Запрос.Предикат()
+ .Реквизит("НоменклатураСоединение.Родитель").Равно("&Родитель"))
+ .Параметры(МассивПараметров)
+ .ВТаблицуЗначений()
+ ;
+
+ // Проверки
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("НоменклатураСоединениеСсылка")
+ ;
+
+КонецПроцедуры
+
+Процедура ЛевоеСоединениеБезПсевдонимовВСоединении() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать("Номенклатура.Ссылка, Номенклатура1.Ссылка")
+ .ЛевоеСоединение("Справочник.Номенклатура", СЗ_Запрос.Предикат()
+ .Реквизит("Ссылка").Равно("Родитель")
+ .Реквизит("ЭтоГруппа").Равно("ИСТИНА"))
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("Ссылка1")
+ ;
+
+КонецПроцедуры
+
+Процедура НесколькоЛевыхСоединений() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Выбрать("Номенклатура.Ссылка, Номенклатура1.Ссылка, Номенклатура2.Ссылка")
+ .ЛевоеСоединение("Справочник.Номенклатура", СЗ_Запрос.Предикат()
+ .Реквизит("Ссылка").Равно("Родитель")
+ .Реквизит("ЭтоГруппа").Равно("ИСТИНА"))
+ .ЛевоеСоединение("Справочник.Номенклатура", СЗ_Запрос.Предикат()
+ .Реквизит("Ссылка").Равно("Родитель")
+ .Реквизит("ЭтоГруппа").Равно("ИСТИНА"))
+ .ВТаблицуЗначений()
+ ;
+
+ ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений.Количество())
+ .Больше(0)
+ ;
+ ЮТест.ОжидаетЧто(ТаблицаЗначений[0])
+ .ИмеетСвойство("Ссылка")
+ .ИмеетСвойство("Ссылка1")
+ .ИмеетСвойство("Ссылка2")
+ ;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+Процедура ВложенныйЗапрос() Экспорт
+
+ ВложенныйЗапрос = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура");
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос(ВложенныйЗапрос)
+ .ВТаблицуЗначений()
+ ;
+
+КонецПроцедуры
+
+Процедура Порядок() Экспорт
+
+ // Выполнение
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ .Упорядочить("ЭтоГруппа, Наименование")
+ .ВТаблицуЗначений()
+ ;
+
+ // Проверки
+ // TODO:
+
+КонецПроцедуры
+
+Процедура Итоги() Экспорт
+
+ ТаблицаЗначений = СЗ_Запрос.НовыйЗапрос("Справочник.Номенклатура")
+ // TODO:
+ .Итоги()
+ .ВТаблицуЗначений()
+ ;
+
+КонецПроцедуры
+
+#Область РеальныеЗапросы
+
+Процедура АдресныйКлассификаторСлужебный_ТаблицаАдресныхСокращений() Экспорт
+
+ // Подготовка
+ НаименованияАдресныхОбъектов = Новый Массив;
+ НаименованияАдресныхОбъектов.Добавить("Абонентский Ящик");
+
+ // Выполнение
+ Запрос = СЗ_Запрос.НовыйЗапрос("РегистрСведений.УровниСокращенийАдресныхСведений")
+ .Выбрать("Значение КАК Наименование, Сокращение")
+ .Сгруппировать("Значение, Сокращение")
+ .Упорядочить("Наименование");
+
+ Если ТипЗнч(НаименованияАдресныхОбъектов) = Тип("Массив") И НаименованияАдресныхОбъектов.Количество() > 0 Тогда
+ Запрос = Запрос
+ .Где(СЗ_Запрос.Предикат()
+ .Реквизит("Значение").В(НаименованияАдресныхОбъектов));
+ КонецЕсли;
+
+ Результат = Запрос.ВТаблицуЗначений();
+
+ // Проверки
+ ЮТест.ОжидаетЧто(Результат)
+ .ИмеетТип("ТаблицаЗначений")
+ ;
+ // TODO:
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовКлиентСервер.xml b/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовКлиентСервер.xml
new file mode 100644
index 0000000..41ea9b9
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовКлиентСервер.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ СЗ_ПроцессорыПредикатовКлиентСервер
+
+
+ ru
+ Схема запроса: процессоры предикатов клиент сервер
+
+
+
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовКлиентСервер/Ext/Module.bsl b/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовКлиентСервер/Ext/Module.bsl
new file mode 100644
index 0000000..28138fa
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовКлиентСервер/Ext/Module.bsl
@@ -0,0 +1,27 @@
+#Область ПрограммныйИнтерфейс
+
+Функция НовыйПроцессорПредикатов() Экспорт
+
+ #Если Клиент Тогда
+ ПроцессорПредикатов = ПолучитьФорму("Обработка.СЗ_ПроцессорПредикатов.Форма.Форма");
+ #Иначе
+ ПроцессорПредикатов = Обработки.СЗ_ПроцессорПредикатов.Создать();
+ #КонецЕсли
+
+ Возврат ПроцессорПредикатов;
+
+КонецФункции
+
+Функция Выражения() Экспорт
+
+ Выражения = Новый Структура;
+ Выражения.Вставить("Равно", "Равно");
+ Выражения.Вставить("Больше", "Больше");
+ Выражения.Вставить("Меньше", "Меньше");
+ Выражения.Вставить("В", "В");
+
+ Возврат Новый ФиксированнаяСтруктура(Выражения);
+
+КонецФункции
+
+#КонецОбласти
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер.xml b/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер.xml
new file mode 100644
index 0000000..34f2de9
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер
+
+
+ ru
+ Схема запроса: процессоры предикатов служебный клиент сервер
+
+
+
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер/Ext/Module.bsl b/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер/Ext/Module.bsl
new file mode 100644
index 0000000..41afd9e
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер/Ext/Module.bsl
@@ -0,0 +1,27 @@
+#Область ПрограммныйИнтерфейс
+
+Процедура УстановитьИмяРеквизита(Предикат, ИмяРеквизита) Экспорт
+
+ Если Предикат = Неопределено Тогда
+ Предикат = Новый Структура("ИмяРеквизита, Условия",
+ "", Новый Массив);
+ КонецЕсли;
+
+ Предикат.ИмяРеквизита = ИмяРеквизита;
+
+КонецПроцедуры
+
+Процедура УстановитьПредикат(Предикат, ВидСравнения, Значение) Экспорт
+
+ Если Предикат = Неопределено Или ПустаяСтрока(Предикат.ИмяРеквизита) Тогда
+ ВызватьИсключение "Ошибочный порядок вызова функций формирования предиката";
+ КонецЕсли;
+
+ Условие = Новый Структура("ИмяРеквизита, ВидСравнения, Значение",
+ Предикат.ИмяРеквизита, ВидСравнения, Значение);
+
+ Предикат.Условия.Добавить(Условие);
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаКлиентСервер.xml b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаКлиентСервер.xml
new file mode 100644
index 0000000..bd27893
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаКлиентСервер.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ СЗ_ПроцессорыСхемЗапросаКлиентСервер
+
+
+ ru
+ Схема запроса: процессоры схем запроса
+
+
+
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаКлиентСервер/Ext/Module.bsl b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаКлиентСервер/Ext/Module.bsl
new file mode 100644
index 0000000..ed804e8
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаКлиентСервер/Ext/Module.bsl
@@ -0,0 +1,17 @@
+#Область ПрограммныйИнтерфейс
+
+Функция НовыйПроцессорСхемЗапроса(ИсточникДанных, Первые = 0, Различные = Ложь, Разрешенные = Ложь) Экспорт
+
+ #Если Клиент Тогда
+ ПроцессорСхемЗапроса = ПолучитьФорму("Обработка.СЗ_ПроцессорСхемЗапроса.Форма.Форма");
+ #Иначе
+ ПроцессорСхемЗапроса = Обработки.СЗ_ПроцессорСхемЗапроса.Создать();
+ #КонецЕсли
+
+ ПроцессорСхемЗапроса.УстановитьИсточникДанных(ИсточникДанных, Первые, Различные, Разрешенные);
+
+ Возврат ПроцессорСхемЗапроса;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебный.xml b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебный.xml
new file mode 100644
index 0000000..f7c21d9
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебный.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ СЗ_ПроцессорыСхемЗапросаСлужебный
+
+
+ ru
+ Схема запроса: процессоры схем запроса служебный
+
+
+
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебный/Ext/Module.bsl b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебный/Ext/Module.bsl
new file mode 100644
index 0000000..21bbcfd
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебный/Ext/Module.bsl
@@ -0,0 +1,237 @@
+
+#Область ПрограммныйИнтерфейс
+
+Функция ПолучитьРезультатЗапроса(СтруктураСхемыЗапроса) Экспорт
+
+ Запрос = Новый Запрос;
+ Запрос.Текст = ПолучитьТекстЗапроса(СтруктураСхемыЗапроса, Запрос);
+ ДобавитьПараметрыЗапроса(СтруктураСхемыЗапроса, Запрос);
+
+ Возврат Запрос.Выполнить();
+
+КонецФункции
+
+Функция ПолучитьТекстЗапроса(СтруктураСхемыЗапроса, Запрос) Экспорт
+
+ Если Не ТипЗнч(СтруктураСхемыЗапроса) = Тип("Структура") Или
+ Не СтруктураСхемыЗапроса.Свойство("ИсточникДанных") Или
+ ПустаяСтрока(СтруктураСхемыЗапроса.ИсточникДанных) Тогда
+
+ ВызватьИсключение "Источник данных запроса не определен";
+ КонецЕсли;
+
+ СхемаЗапроса = Новый СхемаЗапроса;
+
+ ЗапросПакета = ДобавитьПолучитьПакет(СхемаЗапроса, СтруктураСхемыЗапроса);
+ Оператор = ДобавитьПолучитьОператор(ЗапросПакета, СтруктураСхемыЗапроса);
+
+ // Соединения добавляются раньше всех чтобы к моменту добавления полей у нас
+ // уже были все возможные источники данных
+ ДобавитьСоединения(Оператор, СтруктураСхемыЗапроса);
+ ДобавитьПоля(ЗапросПакета, Оператор, СтруктураСхемыЗапроса);
+ ДобавитьУсловия(Оператор, Запрос, СтруктураСхемыЗапроса);
+ ДобавитьГруппировку(Оператор, СтруктураСхемыЗапроса);
+ ДобавитьПорядок(ЗапросПакета, СтруктураСхемыЗапроса);
+
+ ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
+ Возврат ТекстЗапроса;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ДобавитьПолучитьПакет(СхемаЗапроса, СтруктураСхемыЗапроса)
+
+ ПакетЗапросов = СхемаЗапроса.ПакетЗапросов;
+ Если ПакетЗапросов.Количество() = 1 И СхемаЗапроса.ПолучитьТекстЗапроса() = "" Тогда
+ ЗапросПакета = ПакетЗапросов[0];
+ Иначе
+ ЗапросПакета = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
+ КонецЕсли;
+
+ Если СтруктураСхемыЗапроса.Свойство("Разрешенные") И СтруктураСхемыЗапроса.Разрешенные Тогда
+ ЗапросПакета.ВыбиратьРазрешенные = Истина;
+ КонецЕсли;
+
+ Возврат ЗапросПакета;
+
+КонецФункции
+
+Функция ДобавитьПолучитьОператор(ЗапросПакета, СтруктураСхемыЗапроса)
+
+ Если ЗапросПакета.Операторы.Количество() = 1 Тогда
+ Оператор = ЗапросПакета.Операторы[0];
+ Если НЕ Оператор.Источники.Количество() = 0 ИЛИ НЕ Оператор.ВыбираемыеПоля.Количество() = 0 Тогда
+ Оператор = Неопределено;
+ КонецЕсли;
+ КонецЕсли;
+ Если Оператор = Неопределено Тогда
+ Оператор = ЗапросПакета.Операторы.Добавить();
+ КонецЕсли;
+
+ Если СтруктураСхемыЗапроса.Свойство("Первые") И СтруктураСхемыЗапроса.Первые > 0 Тогда
+ Оператор.КоличествоПолучаемыхЗаписей = СтруктураСхемыЗапроса.Первые;
+ КонецЕсли;
+ Если СтруктураСхемыЗапроса.Свойство("Различные") И СтруктураСхемыЗапроса.Различные Тогда
+ Оператор.ВыбиратьРазличные = Истина;
+ КонецЕсли;
+
+ Оператор.Источники.Добавить(СтруктураСхемыЗапроса.ИсточникДанных);
+
+ Возврат Оператор;
+
+КонецФункции
+
+Процедура ДобавитьПоля(ЗапросПакета, Оператор, СтруктураСхемыЗапроса)
+
+ Если СтруктураСхемыЗапроса.Свойство("Поля") И
+ ТипЗнч(СтруктураСхемыЗапроса.Поля) = Тип("Массив") И
+ СтруктураСхемыЗапроса.Поля.Количество() > 0 Тогда
+
+ Для каждого Поле Из СтруктураСхемыЗапроса.Поля Цикл
+ Если Не Поле.Источник = Неопределено Тогда
+ ИсточникПоля = Оператор.Источники.НайтиПоПсевдониму(Поле.Источник);
+ Иначе
+ ИсточникПоля = Оператор.Источники[0];
+ КонецЕсли;
+
+ ДоступноеПоле = ИсточникПоля.Источник.ДоступныеПоля.Найти(Поле.ИмяПоля);
+ Если Не ДоступноеПоле = Неопределено Тогда
+ НовоеПоле = Оператор.ВыбираемыеПоля.Добавить(ДоступноеПоле);
+ Если Не Поле.Псевдоним = Неопределено Тогда
+ ЗапросПакета.Колонки[ЗапросПакета.Колонки.Количество() - 1].Псевдоним = Поле.Псевдоним;
+ КонецЕсли;
+ Иначе
+ ВызватьИсключение СтрШаблон("Поле %1 в источнике не определено", Поле.ИмяПоля);
+ КонецЕсли;
+ КонецЦикла;
+ Иначе
+ ЕстьСсылка = Ложь;
+ Для каждого Источник Из Оператор.Источники Цикл
+ Если Не Источник.Источник.ДоступныеПоля.Найти("Ссылка") = Неопределено Тогда
+ ЕстьСсылка = Истина;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+ Если Не ЕстьСсылка Или (СтруктураСхемыЗапроса.Свойство("ВсеПоля") И СтруктураСхемыЗапроса.ВсеПоля) Тогда
+ Для каждого Источник Из Оператор.Источники Цикл
+ Для каждого Поле Из Источник.Источник.ДоступныеПоля Цикл
+ Оператор.ВыбираемыеПоля.Добавить(Поле);
+ КонецЦикла;
+ КонецЦикла;
+ Иначе
+ Оператор.ВыбираемыеПоля.Добавить(Оператор.Источники[0].Источник.ДоступныеПоля.Найти("Ссылка"));
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ДобавитьУсловия(Оператор, Запрос, СтруктураСхемыЗапроса)
+
+ Если СтруктураСхемыЗапроса.Свойство("Условия") И ТипЗнч(СтруктураСхемыЗапроса.Условия) = Тип("Массив") Тогда
+ Для каждого Условие Из СтруктураСхемыЗапроса.Условия Цикл
+ Оператор.Отбор.Добавить(Условие.УсловиеСтрокой);
+ Запрос.УстановитьПараметр(Условие.ИмяПараметра, Условие.Значение);
+ КонецЦикла;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ДобавитьСоединения(Оператор, СтруктураСхемыЗапроса)
+
+ Если СтруктураСхемыЗапроса.Свойство("Соединения") И ТипЗнч(СтруктураСхемыЗапроса.Соединения) = Тип("Массив") Тогда
+ Для каждого СтруктураСоединения Из СтруктураСхемыЗапроса.Соединения Цикл
+ ИсточникСоединения = Оператор.Источники.Добавить(СтруктураСоединения.ИсточникДанных,
+ СтруктураСоединения.Псевдоним);
+ Если Оператор.Источники[0].Соединения.Количество() = 0 Тогда
+ Оператор.Источники[0].Соединения.Добавить(ИсточникСоединения);
+ КонецЕсли;
+
+ Условия = ПроверитьНаНеоднозначностьПолей(СтруктураСоединения.Условие,
+ Оператор.Источники[0].Источник, ИсточникСоединения.Источник);
+
+ Соединение = Оператор.Источники[0].Соединения[Оператор.Источники[0].Соединения.Количество() - 1];
+ Соединение.Условие = Новый ВыражениеСхемыЗапроса(СтрСоединить(Условия, " И "));
+ // TODO: Строки заменить на функцию?
+ Если СтруктураСоединения.ТипСоединения = "Левое" Тогда
+ Соединение.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
+ ИначеЕсли СтруктураСоединения.ТипСоединения = "Правое" Тогда
+ Соединение.ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;
+ ИначеЕсли СтруктураСоединения.ТипСоединения = "Внутреннее" Тогда
+ Соединение.ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
+ ИначеЕсли СтруктураСоединения.ТипСоединения = "Полное" Тогда
+ Соединение.ТипСоединения = ТипСоединенияСхемыЗапроса.ПолноеВнешнее;
+ Иначе
+ ВызватьИсключение СтрШаблон("ДобавитьСоединения: неподдерживаемый тип соединения %1",
+ СтруктураСоединения.ТипСоединения);
+ КонецЕсли;
+ КонецЦикла;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ДобавитьГруппировку(Оператор, СтруктураСхемыЗапроса)
+
+ Если СтруктураСхемыЗапроса.Свойство("Группировка") И ТипЗнч(СтруктураСхемыЗапроса.Группировка) = Тип("Массив") Тогда
+ Для каждого Группировка Из СтруктураСхемыЗапроса.Группировка Цикл
+ Оператор.Группировка.Добавить(Группировка);
+ КонецЦикла;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ДобавитьПорядок(ЗапросПакета, СтруктураСхемыЗапроса)
+
+ Если СтруктураСхемыЗапроса.Свойство("Порядок") И ТипЗнч(СтруктураСхемыЗапроса.Порядок) = Тип("Массив") Тогда
+ Для каждого ЭлементПорядка Из СтруктураСхемыЗапроса.Порядок Цикл
+ ЗапросПакета.Порядок.Добавить(ЭлементПорядка);
+ КонецЦикла;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ПроверитьНаНеоднозначностьПолей(МассивУсловий, ТаблицаОсновная, ТаблицаСоединения)
+
+ // TODO: Пока не учитывается ситуация типа: "Ссылка = Ссылка"
+ // Похоже вообще не имеет смысла преобразовывать условие в строку на предыдущем этапе.
+ // Преобразовывать надо здесь с учетом неоднозначности полей. Рефакторинг!
+ НовыйМассивУсловий = Новый Массив;
+
+ Для каждого Условие Из МассивУсловий Цикл
+ УсловиеСтрокой = Условие.УсловиеСтрокой;
+
+ Если Не Условие.ЛеваяЧасть = Неопределено И
+ Не ТаблицаОсновная.ДоступныеПоля.Найти(Условие.ЛеваяЧасть) = Неопределено И
+ Не ТаблицаСоединения.ДоступныеПоля.Найти(Условие.ЛеваяЧасть) = Неопределено Тогда
+
+ УсловиеСтрокой = СтрЗаменить(УсловиеСтрокой, Условие.ЛеваяЧасть,
+ ТаблицаОсновная.Псевдоним + "." + Условие.ЛеваяЧасть);
+ КонецЕсли;
+ Если Не Условие.ПраваяЧасть = Неопределено И
+ Не ТаблицаОсновная.ДоступныеПоля.Найти(Условие.ПраваяЧасть) = Неопределено И
+ Не ТаблицаСоединения.ДоступныеПоля.Найти(Условие.ПраваяЧасть) = Неопределено Тогда
+
+ УсловиеСтрокой = СтрЗаменить(УсловиеСтрокой, Условие.ПраваяЧасть,
+ ТаблицаСоединения.Псевдоним + "." + Условие.ПраваяЧасть);
+ КонецЕсли;
+
+ НовыйМассивУсловий.Добавить(УсловиеСтрокой);
+ КонецЦикла;
+
+ Возврат НовыйМассивУсловий;
+
+КонецФункции
+
+Процедура ДобавитьПараметрыЗапроса(СтруктураСхемыЗапроса, Запрос)
+
+ Если СтруктураСхемыЗапроса.Свойство("Параметры") И ТипЗнч(СтруктураСхемыЗапроса.Параметры) = Тип("Массив") Тогда
+ Для каждого Параметр Из СтруктураСхемыЗапроса.Параметры Цикл
+ Запрос.УстановитьПараметр(Параметр.ИмяПараметра, Параметр.Значение);
+ КонецЦикла;
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера.xml b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера.xml
new file mode 100644
index 0000000..aaa5f16
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера
+
+
+ ru
+ Схема запроса: процессоры схем запроса служебный вызов сервера
+
+
+
+ false
+ false
+ true
+ false
+ false
+ true
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера/Ext/Module.bsl b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера/Ext/Module.bsl
new file mode 100644
index 0000000..57858fb
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера/Ext/Module.bsl
@@ -0,0 +1 @@
+// TODO:
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.xml b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.xml
new file mode 100644
index 0000000..fdea0b6
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер
+
+
+ ru
+ Схема запроса: процессоры схем запроса служебный клиент сервер
+
+
+
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер/Ext/Module.bsl b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер/Ext/Module.bsl
new file mode 100644
index 0000000..7fd0d01
--- /dev/null
+++ b/src/cfe/CommonModules/СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер/Ext/Module.bsl
@@ -0,0 +1,305 @@
+#Область ПрограммныйИнтерфейс
+
+Процедура УстановитьИсточникДанных(СхемаЗапроса, ИсточникДанных, Первые, Различные, Разрешенные) Экспорт
+
+ Если СхемаЗапроса = Неопределено Тогда
+ СхемаЗапроса = Новый Структура;
+ КонецЕсли;
+
+ СхемаЗапроса.Вставить("ИсточникДанных", ИсточникДанных);
+ Если Первые >= 0 Тогда
+ СхемаЗапроса.Вставить("Первые", Первые);
+ КонецЕсли;
+ СхемаЗапроса.Вставить("Различные", Различные);
+ СхемаЗапроса.Вставить("Разрешенные", Разрешенные);
+
+КонецПроцедуры
+
+Процедура УстановитьПервые(СхемаЗапроса, Количество) Экспорт
+
+ СхемаЗапроса.Вставить("Первые", Количество);
+
+КонецПроцедуры
+
+Процедура УстановитьРазличные(СхемаЗапроса) Экспорт
+
+ СхемаЗапроса.Вставить("Различные", Истина);
+
+КонецПроцедуры
+
+Процедура УстановитьРазрешенные(СхемаЗапроса) Экспорт
+
+ СхемаЗапроса.Вставить("Разрешенные", Истина);
+
+КонецПроцедуры
+
+Процедура УстановитьВыборВсехПолей(СхемаЗапроса) Экспорт
+
+ СхемаЗапроса.Вставить("ВсеПоля", Истина);
+
+КонецПроцедуры
+
+Процедура УстановитьПоляВыборки(СхемаЗапроса, Поля) Экспорт
+
+ Если ТипЗнч(Поля) = Тип("Строка") Тогда
+ НовыеПоля = ПолучитьПоляИзСтроки(Поля);
+ ИначеЕсли ТипЗнч(Поля) = Тип("Массив") Тогда
+ НовыеПоля = Поля;
+ ИначеЕсли ТипЗнч(Поля) = Тип("Структура") Тогда
+ НовыеПоля = Новый Массив;
+ НовыеПоля.Добавить(Поля);
+ Иначе
+ ВызватьИсключение "УстановитьПоляВыборки: неподдерживаемый тип данных в параметре ""Поля""";
+ КонецЕсли;
+
+ МассивПолей = Новый Массив;
+ Если СхемаЗапроса.Свойство("Поля") И ТипЗнч(СхемаЗапроса.Поля) = Тип("Массив") Тогда
+ МассивПолей = СхемаЗапроса.Поля;
+ КонецЕсли;
+ Для каждого НовоеПоле Из НовыеПоля Цикл
+ Поле = ПолучитьПоле(НовоеПоле);
+ МассивПолей.Добавить(Поле);
+ КонецЦикла;
+
+ СхемаЗапроса.Вставить("Поля", МассивПолей);
+
+КонецПроцедуры
+
+Процедура УстановитьУсловие(СхемаЗапроса, Предикат) Экспорт
+
+ СхемаЗапроса.Вставить("Условия", ПолучитьУсловияОтбора(Предикат));
+
+КонецПроцедуры
+
+Процедура ДобавитьСоединение(СхемаЗапроса, ТипСоединения, ИсточникДанных, Предикат) Экспорт
+
+ Если ТипЗнч(ИсточникДанных) = Тип("Строка") Тогда
+
+ МассивСоединений = Новый Массив;
+ Если СхемаЗапроса.Свойство("Соединения") И ТипЗнч(СхемаЗапроса.Поля) = Тип("Массив") Тогда
+ МассивСоединений = СхемаЗапроса.Соединения;
+ КонецЕсли;
+
+ Псевдоним = "";
+ Если СтрНайти(ИсточникДанных, " КАК ") > 0 Тогда
+ ИнформацияОбИсточникеДанных = СтрЗаменить(ИсточникДанных, " КАК ", Символы.ПС);
+ ИсточникДанных = СтрПолучитьСтроку(ИнформацияОбИсточникеДанных, 1);
+ Псевдоним = СтрПолучитьСтроку(ИнформацияОбИсточникеДанных, 2);
+ КонецЕсли;
+
+ МассивСоединений.Добавить(Новый Структура("ТипСоединения, ИсточникДанных, Псевдоним, Условие",
+ ТипСоединения, ИсточникДанных, Псевдоним, ПолучитьУсловияСоединения(Предикат)));
+ СхемаЗапроса.Вставить("Соединения", МассивСоединений);
+
+ Иначе // Структура = вложенный запрос
+
+ // TODO:
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура УстановитьГруппировку(СхемаЗапроса, Поля) Экспорт
+
+ Если ТипЗнч(Поля) = Тип("Строка") Тогда
+ НовыеПоля = ПолучитьПоляИзСтроки(Поля);
+ ИначеЕсли ТипЗнч(Поля) = Тип("Массив") Тогда
+ НовыеПоля = Поля;
+ Иначе
+ ВызватьИсключение "УстановитьГруппировку: неподдерживаемый тип данных в параметре ""Поля""";
+ КонецЕсли;
+
+ МассивПолей = Новый Массив;
+ Если СхемаЗапроса.Свойство("Группировка") И ТипЗнч(СхемаЗапроса.Поля) = Тип("Массив") Тогда
+ МассивПолей = СхемаЗапроса.Поля;
+ КонецЕсли;
+ Для каждого НовоеПоле Из НовыеПоля Цикл
+ МассивПолей.Добавить(НовоеПоле);
+ КонецЦикла;
+
+ СхемаЗапроса.Вставить("Группировка", МассивПолей);
+
+КонецПроцедуры
+
+Процедура УстановитьПорядок(СхемаЗапроса, Поля) Экспорт
+
+ Если ТипЗнч(Поля) = Тип("Строка") Тогда
+ НовыеПоля = ПолучитьПоляИзСтроки(Поля);
+ ИначеЕсли ТипЗнч(Поля) = Тип("Массив") Тогда
+ НовыеПоля = Поля;
+ Иначе
+ ВызватьИсключение "УстановитьПорядок: неподдерживаемый тип данных в параметре ""Поля""";
+ КонецЕсли;
+
+ МассивПолей = Новый Массив;
+ Если СхемаЗапроса.Свойство("Порядок") И ТипЗнч(СхемаЗапроса.Поля) = Тип("Массив") Тогда
+ МассивПолей = СхемаЗапроса.Поля;
+ КонецЕсли;
+ Для каждого НовоеПоле Из НовыеПоля Цикл
+ МассивПолей.Добавить(НовоеПоле);
+ КонецЦикла;
+
+ СхемаЗапроса.Вставить("Порядок", МассивПолей);
+
+КонецПроцедуры
+
+Процедура УстановитьПараметры(СхемаЗапроса, Параметры) Экспорт
+
+ СхемаЗапроса.Вставить("Параметры", Параметры);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьПоляИзСтроки(СтрокаИменПолей)
+
+ МассивПолей = СтрРазделить(СтрокаИменПолей, ",", Ложь);
+ Для Сч = 0 По МассивПолей.Количество() - 1 Цикл
+ МассивПолей[Сч] = СокрЛП(МассивПолей[Сч]);
+ КонецЦикла;
+
+ Возврат МассивПолей;
+
+КонецФункции
+
+Функция ПолучитьПоле(Поле)
+
+ // TODO: Строки проверять на корректность синтаксиса - отсутствие пробелов и спец.символов
+
+ Если ТипЗнч(Поле) = Тип("Строка") Тогда
+
+ Если СтрНайти(Поле, " КАК ") > 0 Тогда
+ ИнформацияОПоле = СтрЗаменить(Поле, " КАК ", Символы.ПС);
+ Возврат Новый Структура("ИмяПоля, Источник, Псевдоним",
+ ПолучитьИмяПоляБезИсточника(СтрПолучитьСтроку(ИнформацияОПоле, 1)),
+ ПолучитьИсточникИзИмениПоля(Поле),
+ СтрПолучитьСтроку(ИнформацияОПоле, 2));
+ КонецЕсли;
+
+ Возврат Новый Структура("ИмяПоля, Источник, Псевдоним",
+ ПолучитьИмяПоляБезИсточника(Поле),
+ ПолучитьИсточникИзИмениПоля(Поле),
+ Неопределено);
+
+ ИначеЕсли ТипЗнч(Поле) = Тип("Структура") Тогда
+
+ Если Поле.Свойство("ИмяПоля") Тогда
+ Если Поле.Свойство("Источник") И Не Поле.Источник = Неопределено Тогда
+ Если Поле.Свойство("Псевдоним") Тогда
+ Возврат Поле;
+ КонецЕсли;
+
+ Возврат Новый Структура("ИмяПоля, Источник, Псевдоним",
+ ПолучитьИмяПоляБезИсточника(Поле.ИмяПоля),
+ ПолучитьИсточникИзИмениПоля(Поле.ИмяПоля),
+ Неопределено);
+ КонецЕсли;
+
+ Если Поле.Свойство("Псевдоним") Тогда
+ Возврат Новый Структура("ИмяПоля, Источник, Псевдоним",
+ ПолучитьИмяПоляБезИсточника(Поле.ИмяПоля),
+ ПолучитьИсточникИзИмениПоля(Поле.ИмяПоля),
+ Поле.Псевдоним);
+ КонецЕсли;
+
+ Возврат Новый Структура("ИмяПоля, Источник, Псевдоним",
+ ПолучитьИмяПоляБезИсточника(Поле.ИмяПоля),
+ ПолучитьИсточникИзИмениПоля(Поле.ИмяПоля),
+ Неопределено);
+ КонецЕсли;
+
+ ВызватьИсключение "ПолучитьПоле: некорректная структура передана в параметре ""Поле""";
+
+ КонецЕсли;
+
+ ВызватьИсключение "ПолучитьПоле: неподдерживаемый тип данных в параметре ""Поле""";
+
+КонецФункции
+
+Функция ПолучитьИмяПоляБезИсточника(ИмяПоля)
+
+ Если СтрНайти(ИмяПоля, ".") > 0 Тогда
+ МассивЭлементовПоля = СтрРазделить(ИмяПоля, ".");
+ МассивЭлементовПоля.Удалить(0);
+ Возврат СтрСоединить(МассивЭлементовПоля, ".");
+ КонецЕсли;
+
+ Возврат ИмяПоля;
+
+КонецФункции
+
+Функция ПолучитьИсточникИзИмениПоля(ИмяПоля)
+
+ Если СтрНайти(ИмяПоля, ".") > 0 Тогда
+ МассивЭлементовПоля = СтрРазделить(ИмяПоля, ".");
+ Возврат МассивЭлементовПоля[0];
+ КонецЕсли;
+
+ Возврат Неопределено;
+
+КонецФункции
+
+Функция ПолучитьУсловияОтбора(Предикат)
+
+ // TODO: Нумерация (Сч) сквозная через все запросы
+
+ МассивУсловий = Новый Массив;
+ Сч = 0;
+
+ Для каждого Условие Из Предикат.Условия Цикл
+ ИмяПараметра = СтрШаблон("Параметр_%1", Сч);
+
+ Шаблон = ШаблонУсловия(Условие.ВидСравнения);
+ МассивУсловий.Добавить(Новый Структура("ИмяПараметра, УсловиеСтрокой, Значение",
+ ИмяПараметра, СтрШаблон(Шаблон, Условие.ИмяРеквизита, ИмяПараметра), Условие.Значение));
+
+ Сч = Сч + 1;
+ КонецЦикла;
+
+ Возврат МассивУсловий;
+
+КонецФункции
+
+Функция ПолучитьУсловияСоединения(Предикат)
+
+ МассивУсловий = Новый Массив;
+ Если Предикат = Неопределено Тогда
+ МассивУсловий.Добавить(
+ Новый Структура("ЛеваяЧасть, ПраваяЧасть, УсловиеСтрокой",,, "ИСТИНА"));
+
+ Возврат МассивУсловий;
+ КонецЕсли;
+
+ Для каждого Условие Из Предикат.Условия Цикл
+ Шаблон = ШаблонУсловия(Условие.ВидСравнения, Ложь);
+ МассивУсловий.Добавить(Новый Структура("ЛеваяЧасть, ПраваяЧасть, УсловиеСтрокой",
+ Условие.ИмяРеквизита, Условие.Значение, СтрШаблон(Шаблон, Условие.ИмяРеквизита, Условие.Значение)));
+ КонецЦикла;
+
+ Возврат МассивУсловий;
+
+КонецФункции
+
+Функция ШаблонУсловия(ВидСравнения, Амперсанд = Истина)
+
+ Выражения = СЗ_ПроцессорыПредикатовКлиентСервер.Выражения();
+
+ Если ВидСравнения = Выражения.Равно Тогда
+ Шаблон = "%1 = " + ?(Амперсанд, "&", "") + "%2";
+ ИначеЕсли ВидСравнения = Выражения.Больше Тогда
+ Шаблон = "%1 > " + ?(Амперсанд, "&", "") + "%2";
+ ИначеЕсли ВидСравнения = Выражения.Меньше Тогда
+ Шаблон = "%1 < " + ?(Амперсанд, "&", "") + "%2";
+ ИначеЕсли ВидСравнения = Выражения.В Тогда
+ Шаблон = "%1 В (" + ?(Амперсанд, "&", "") + "%2)";
+ Иначе
+ ВызватьИсключение "Неподдерживаемое выражение предиката " + ВидСравнения;
+ КонецЕсли;
+
+ Возврат Шаблон;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/src/cfe/ConfigDumpInfo.xml b/src/cfe/ConfigDumpInfo.xml
new file mode 100644
index 0000000..f1ba7a0
--- /dev/null
+++ b/src/cfe/ConfigDumpInfo.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/cfe/Configuration.xml b/src/cfe/Configuration.xml
new file mode 100644
index 0000000..debe389
--- /dev/null
+++ b/src/cfe/Configuration.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+ 9cd510cd-abfc-11d4-9434-004095e12fc7
+ 79fc0bfa-a7d2-4fcc-9968-cfb47caa8fd8
+
+
+ 9fcd25a0-4822-11d4-9414-008048da11f9
+ bf90fb71-1da9-4052-b179-033ccc51e8de
+
+
+ e3687481-0a87-462c-a166-9f34594f9bba
+ a8573e3a-9a13-4e2b-9666-240ff4f3d932
+
+
+ 9de14907-ec23-4a07-96f0-85521cb6b53b
+ 7e4ad5ff-f2b7-4283-a3c4-e62bfacbb5df
+
+
+ 51f2d5d8-ea4d-4064-8892-82951750031e
+ 048a7528-7f13-42d2-8898-549305be15a9
+
+
+ e68182ea-4237-4383-967f-90c1e3370bc7
+ f748cda1-e6d2-4aa2-8c76-75e9f4fe7eb7
+
+
+ fb282519-d103-4dd3-bc12-cb271d631dfc
+ fc951404-a9cc-4c5d-bd94-f031bd348ea2
+
+
+
+ Adopted
+ СхемаЗапроса
+
+
+ ru
+ Схема запроса
+
+
+
+ AddOn
+ true
+ СЗ_
+ Version8_3_24
+ Russian
+
+ 0.0.1
+
+
+
+
+
+ TaxiEnableVersion8_2
+
+
+ СЗ_Запрос
+ СЗ_ЗапросТест
+ СЗ_ПроцессорыПредикатовКлиентСервер
+ СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер
+ СЗ_ПроцессорыСхемЗапросаКлиентСервер
+ СЗ_ПроцессорыСхемЗапросаСлужебный
+ СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер
+ СЗ_ПроцессорПредикатов
+ СЗ_ПроцессорСхемЗапроса
+
+
+
\ No newline at end of file
diff --git a/src/cfe/DataProcessors/СЗ_ПроцессорПредикатов.xml b/src/cfe/DataProcessors/СЗ_ПроцессорПредикатов.xml
new file mode 100644
index 0000000..c5a82fa
--- /dev/null
+++ b/src/cfe/DataProcessors/СЗ_ПроцессорПредикатов.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+ 20e56103-de11-460e-989e-38009e54630a
+ 207e5e5e-fb17-43ad-959f-910b588f6d68
+
+
+ e3602dbd-6e64-429f-99f4-b0c9a7b7102f
+ facb276b-1229-4f98-960f-86720e17c5c9
+
+
+
+ СЗ_ПроцессорПредикатов
+
+
+ ru
+ С з процессор предикатов
+
+
+
+ true
+
+
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/cfe/DataProcessors/СЗ_ПроцессорПредикатов/Ext/ObjectModule.bsl b/src/cfe/DataProcessors/СЗ_ПроцессорПредикатов/Ext/ObjectModule.bsl
new file mode 100644
index 0000000..953769c
--- /dev/null
+++ b/src/cfe/DataProcessors/СЗ_ПроцессорПредикатов/Ext/ObjectModule.bsl
@@ -0,0 +1,44 @@
+#Область ОписаниеПеременных
+
+Перем Предикат;
+
+#КонецОбласти
+
+#Область ПрограммныйИнтерфейс
+
+Функция Реквизит(ИмяРеквизита) Экспорт
+ СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер.УстановитьИмяРеквизита(Предикат, ИмяРеквизита);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Равно(Значение) Экспорт
+ СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер.УстановитьПредикат(Предикат,
+ СЗ_ПроцессорыПредикатовКлиентСервер.Выражения().Равно, Значение);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Больше(Значение) Экспорт
+ СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер.УстановитьПредикат(Предикат,
+ СЗ_ПроцессорыПредикатовКлиентСервер.Выражения().Больше, Значение);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Меньше(Значение) Экспорт
+ СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер.УстановитьПредикат(Предикат,
+ СЗ_ПроцессорыПредикатовКлиентСервер.Выражения().Меньше, Значение);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция В(Значение) Экспорт
+ СЗ_ПроцессорыПредикатовСлужебныйКлиентСервер.УстановитьПредикат(Предикат,
+ СЗ_ПроцессорыПредикатовКлиентСервер.Выражения().В, Значение);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Получить() Экспорт
+
+ Возврат Предикат;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса.xml b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса.xml
new file mode 100644
index 0000000..b27445a
--- /dev/null
+++ b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+ 8fa76ff0-784b-4ebd-a63a-5bfed72f02c2
+ 4b2cbc6f-5517-4354-9cca-09e37ffb6ef4
+
+
+ 4c35d9a4-671c-4413-b87e-b984a2286b1e
+ 2db60e26-72c2-46c7-adef-d744c9274c32
+
+
+
+ СЗ_ПроцессорСхемЗапроса
+
+
+ ru
+ Схема запроса: процессор схем запроса
+
+
+
+ true
+ DataProcessor.СЗ_ПроцессорСхемЗапроса.Form.Форма
+
+ false
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Ext/ObjectModule.bsl b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Ext/ObjectModule.bsl
new file mode 100644
index 0000000..50c2ecf
--- /dev/null
+++ b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Ext/ObjectModule.bsl
@@ -0,0 +1,125 @@
+#Область ОписаниеПеременных
+
+Перем СхемаЗапроса;
+
+#КонецОбласти
+
+#Область ПрограммныйИнтерфейс
+
+Процедура УстановитьИсточникДанных(ИсточникДанных, Первые = -1, Различные = Ложь, Разрешенные = Ложь) Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.УстановитьИсточникДанных(СхемаЗапроса,
+ ИсточникДанных, Первые, Различные, Разрешенные);
+КонецПроцедуры
+
+Функция ВТаблицуЗначений() Экспорт
+ ТаблицаЗначений = СЗ_ПроцессорыСхемЗапросаСлужебный
+ .ПолучитьРезультатЗапроса(СхемаЗапроса).Выгрузить();
+ Возврат ТаблицаЗначений;
+КонецФункции
+
+Функция ВМассив(ИмяКолонки) Экспорт
+ ТаблицаЗначений = СЗ_ПроцессорыСхемЗапросаСлужебный
+ .ПолучитьРезультатЗапроса(СхемаЗапроса).Выгрузить();
+ Возврат ТаблицаЗначений.ВыгрузитьКолонку(ИмяКолонки);
+КонецФункции
+
+Функция Первые(Количество) Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Различные() Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Разрешенные() Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Выбрать(Поля) Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер
+ .УстановитьПоляВыборки(СхемаЗапроса, Поля);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция ВыбратьВсе() Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер
+ .УстановитьВыборВсехПолей(СхемаЗапроса);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Где(Предикат) Экспорт
+
+ Если ТипЗнч(Предикат) = Тип("Структура") Тогда
+ _Предикат = Предикат;
+ ИначеЕсли ТипЗнч(Предикат) = Тип("ОбработкаОбъект.СЗ_ПроцессорПредикатов") Тогда
+ _Предикат = Предикат.Получить();
+ Иначе
+ ВызватьИсключение "Неверный тип предиката в методе ""Где""";
+ КонецЕсли;
+
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.УстановитьУсловие(СхемаЗапроса, _Предикат);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция ЛевоеСоединение(ИсточникДанных, Предикат = Неопределено) Экспорт
+
+ // TODO: ИсточникДанных может быть структурой? Что делать в этом случае?
+ Если ТипЗнч(ИсточникДанных) = Тип("Строка") Тогда
+ _ИсточникДанных = ИсточникДанных;
+ ИначеЕсли ТипЗнч(ИсточникДанных) = Тип("ОбработкаОбъект.СЗ_ПроцессорСхемЗапроса") Тогда
+ _ИсточникДанных = ИсточникДанных.Получить();
+ Иначе
+ ВызватьИсключение "ЛевоеСоединение: неверный тип источника данных";
+ КонецЕсли;
+
+ Если ТипЗнч(Предикат) = Тип("Структура") Или Предикат = Неопределено Тогда
+ _Предикат = Предикат;
+ ИначеЕсли ТипЗнч(Предикат) = Тип("ОбработкаОбъект.СЗ_ПроцессорПредикатов") Тогда
+ _Предикат = Предикат.Получить();
+ Иначе
+ ВызватьИсключение "ЛевоеСоединение: неверный тип предиката";
+ КонецЕсли;
+
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.ДобавитьСоединение(
+ СхемаЗапроса, "Левое", ИсточникДанных, _Предикат);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Сгруппировать(Поля) Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер
+ .УстановитьГруппировку(СхемаЗапроса, Поля);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Упорядочить(Поля) Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер
+ .УстановитьПорядок(СхемаЗапроса, Поля);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Итоги() Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Параметры(Параметры) Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.УстановитьПараметры(СхемаЗапроса, Параметры);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+Функция Получить() Экспорт
+
+ Возврат СхемаЗапроса;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+
+
+#КонецОбласти
diff --git a/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма.xml b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма.xml
new file mode 100644
index 0000000..15510d0
--- /dev/null
+++ b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма.xml
@@ -0,0 +1,22 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма/Ext/Form.xml b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма/Ext/Form.xml
new file mode 100644
index 0000000..c15ed5f
--- /dev/null
+++ b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма/Ext/Form.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма/Ext/Form/Module.bsl b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма/Ext/Form/Module.bsl
new file mode 100644
index 0000000..614c888
--- /dev/null
+++ b/src/cfe/DataProcessors/СЗ_ПроцессорСхемЗапроса/Forms/Форма/Ext/Form/Module.bsl
@@ -0,0 +1,133 @@
+#Область ОписаниеПеременных
+
+&НаКлиенте
+Перем СхемаЗапроса;
+
+#КонецОбласти
+
+#Область ПрограммныйИнтерфейс
+
+&НаКлиенте
+Процедура УстановитьИсточникДанных(ИсточникДанных, Первые = -1, Различные = Ложь, Разрешенные = Ложь) Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.УстановитьИсточникДанных(СхемаЗапроса,
+ ИсточникДанных, Первые, Различные, Разрешенные);
+КонецПроцедуры
+
+&НаКлиенте
+Функция ВТаблицуЗначений() Экспорт
+ ТаблицаЗначений = СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера
+ .ПолучитьРезультатЗапроса(СхемаЗапроса).Выгрузить();
+ Возврат ТаблицаЗначений;
+КонецФункции
+
+&НаКлиенте
+Функция ВМассив(ИмяКолонки) Экспорт
+ ТаблицаЗначений = СЗ_ПроцессорыСхемЗапросаСлужебныйВызовСервера
+ .ПолучитьРезультатЗапроса(СхемаЗапроса).Выгрузить();
+ Возврат ТаблицаЗначений.ВыгрузитьКолонку(ИмяКолонки);
+КонецФункции
+
+&НаКлиенте
+Функция Первые(Количество) Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Различные() Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Разрешенные() Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Выбрать(Поля) Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер
+ .УстановитьПоляВыборки(СхемаЗапроса, Поля);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция ВыбратьВсе() Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер
+ .УстановитьВыборВсехПолей(СхемаЗапроса);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Где(Предикат) Экспорт
+
+ Если ТипЗнч(Предикат) = Тип("Структура") Тогда
+ _Предикат = Предикат;
+ ИначеЕсли ТипЗнч(Предикат) = Тип("ОбработкаОбъект.СЗ_ПроцессорПредикатов") Тогда
+ _Предикат = Предикат.Получить();
+ Иначе
+ ВызватьИсключение "Неверный тип предиката в методе ""Где""";
+ КонецЕсли;
+
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.УстановитьУсловие(СхемаЗапроса, _Предикат);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция ЛевоеСоединение(ИсточникДанных, Предикат = Неопределено) Экспорт
+
+ // TODO: ИсточникДанных может быть структурой? Что делать в этом случае?
+ Если ТипЗнч(ИсточникДанных) = Тип("Строка") Тогда
+ _ИсточникДанных = ИсточникДанных;
+ ИначеЕсли ТипЗнч(ИсточникДанных) = Тип("ОбработкаОбъект.СЗ_ПроцессорСхемЗапроса") Тогда
+ _ИсточникДанных = ИсточникДанных.Получить();
+ Иначе
+ ВызватьИсключение "ЛевоеСоединение: неверный тип источника данных";
+ КонецЕсли;
+
+ Если ТипЗнч(Предикат) = Тип("Структура") Или Предикат = Неопределено Тогда
+ _Предикат = Предикат;
+ ИначеЕсли ТипЗнч(Предикат) = Тип("ОбработкаОбъект.СЗ_ПроцессорПредикатов") Тогда
+ _Предикат = Предикат.Получить();
+ Иначе
+ ВызватьИсключение "ЛевоеСоединение: неверный тип предиката";
+ КонецЕсли;
+
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.ДобавитьСоединение(
+ СхемаЗапроса, "Левое", ИсточникДанных, _Предикат);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Сгруппировать(Поля) Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Упорядочить(Поля) Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Итоги() Экспорт
+ // TODO:
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Параметры(Параметры) Экспорт
+ СЗ_ПроцессорыСхемЗапросаСлужебныйКлиентСервер.УстановитьПараметры(СхемаЗапроса, Параметры);
+ Возврат ЭтотОбъект;
+КонецФункции
+
+&НаКлиенте
+Функция Получить() Экспорт
+
+ Возврат СхемаЗапроса;
+
+КонецФункции
+
+#КонецОбласти