И еще одна фишка, которую я собственно хотел анонсировать.
Суть "фишки" - это сочетание использования прямого запроса и поставщика данных "Отбор" чтобы сделать возможность отбора данных в отчетах.
Например: у вас есть отчет. Предположим он собирается следующим запросом:
ВЫБРАТЬ Код, Наименование, ПометкаУдаления ИЗ Справочник.Контрагенты
И вы хотите сделать возможность пользователю отбора по полям "Наименование" и "Пометка удаления".
Ранее был добавлена возможность отображать в ТП объект "Объектыv8.Отбор". Что собственно позволяло делать таблицу элементов отбора для размещения на форме. Собственно рассмотрим код для добавления ТП и размещения полей отбора.
ПоставщикДанных = СоздатьОбъект("ПоставщикДанных");
ПоставщикДанных.ТипЗначений = "Отбор";
ПоставщикДанных.КонтейнерКоманднойПанели = "ИДКоманднаяПанель";
ПоставщикДанных.КонтейнерТабличногоПоля = "ОтборСписок";
ТабличноеПоле = ПоставщикДанных.ТабличноеПоле;
ТабличноеПоле.СтильЗаголовков = 1;
ТабличноеПоле.СтильРамки = 1;
Данные = ПоставщикДанных.Данные;
Отбор = Данные.Отбор;
ПоляНастройки = Отбор.ПолучитьДоступныеПоля();
ПолеНастройкиНаименование =
ПолеНастройкиНаименование.Родитель = "Справочник.Контрагенты";
ПолеНастройкиНаименование.ПутьКДанным = "Наименование";
ПолеНастройкиПометкаУдаления = ДобавитьПолеНастройки(ПоляНастройки,"ПометкаУдаления","Пометка удаления","Число.1.0");
ПолеНастройкиПометкаУдаления.Родитель = "Справочник.Контрагенты";
ПолеНастройкиПометкаУдаления.ПутьКДанным = "ПометкаУдаления";
Отбор.УстановитьДоступныеПоля(ПоляНастройки);
Отбор.Добавить("Наименование");
Отбор.Добавить("ПометкаУдаления");
Данные.СоздатьКнопкиПоУмолчанию();
ТабличноеПоле.ВосстановитьПозициюКолонок();
ПоставщикДанных.Обновить();
В итоге пользователь видит табличную часть с полями "Наименование" и "Пометка удаления".
В результате он выбирает какие то настройки и хочет сформировать отчет. На текущий момент чтобы модифицировать запрос необходимо "вручную" проанализировать элементы отбора. Собственно со следующего релиза, будет добавлена возможность получать значение отбора в виде запроса, кроме того с подставлением параметров в объект "ПрямойЗапрос".
Выглядеть это будет так:
Отбор.Наименование.Установить("Рога и копыта", 1); // отбор по контрагенту "Рога и копыта"
ТекстОтбора = Отбор.Наименование.ПолучитьТекстОтбора(Запрос);
ТекстОтбора = СтрЗаменить(ТекстОтбора, "[ОсновнаяТаблица]", "");
Запрос.Текст = Запрос.Текст + " ГДЕ " + ТекстОтбора;
В результате текст запроса будет
ВЫБРАТЬ Код, Наименование, ПометкаУдаления ИЗ Справочник.Контрагенты ГДЕ descr = 'Рога и копыта'
.
Собственно я понимаю что чтобы запросы работали эффективно надо вставлять не так примитивно как я это сделал, но собственно говоря полдела как я считаю уже положено.
Надо сказать что до конца с синтаксисом я не определился. Варианта 3 пока я вижу:
1. Научить класс "ПрямойЗапрос" работать с объектом "Отбор". Считывать элементы, устанавливать параметры, возвращать текст запроса.
2. Научить класс "ПрямойЗапрос" формировать текст запроса (с одновременной установкой параметров)
3. Научить класс "ЭлементОтбора" формировать текст запроса (с установкой параметров если ему передан класс "ПрямойЗапрос")
Ну как то так. Обсуждаем?