Имя: Пароль:
1C
 
Переход от объекта "Отбор" к объекту "Структура"
0 Волшебник
 
23.10.04
19:14
Thrash

форма.
динамический список (ргСведений, спр - неважно).
панель инструментов.
юзер делает какой-либо отбор (абсолютно произвольный, стандартными средствами).
жмет на пимпу - и мне надо получить то, что у него в данный момент в списке.
логичное , казалось бы:

CODE  
тзЧтототам = РегистрыСведений.Чтототам.СрезПоследних(ТекущаяДата(), ЭлементыФормы.РегистрСведенийСписок.Значение.Отбор);


по понятным причинам не прокатывает (ну дурь, отбор - это отбор, а не структура, если 2 вида - надо дать возможность использовать оба варианта) - ибо ЭлементыФормы.РегистрСведенийСписок.Значение.Отбор это объект "Отбор", а в команде в параметре должна быть Структура.
то есть это отпадает и нужен запрос с условием.

собственно вопрос - есть ли какой-либо изящный способ это сделать, кроме как потрошить отбор, вытаскивая оттуда типы, пути к данным, виды сравнения, данные для сравнения громоздя условие в запрос?


---------------------------------
отвечаю сам себе, делюсь своим решением - вдруг кому-то пригодиться.

во вложении функция, ей передается динамический список
CODE  
глЗапросПоОтборуДС(ЭлементыФормы.РегистрСведенийСписок)


возвращает она ТЗ состояния регистра "как в списке" .
в качестве источника для условий используется отбор, для регистров сведений выполняется проверка устанвки значения среза - первых, последних, не использовать.

в качестве домашнего задания - там еще надо упорядочить, как в списке, и обработать галочку Иерархического просмотра в списках ПВХ, спр., планов счетов - сделаете самостоятельно

если обнаружите ошибки - пишите.

-------------------------------------------
Функция глЗапросПоОтборуДС(СписокД) Экспорт
   ВидД = СтрЗаменить(Строка(СписокД.Значение), "Список", "");

   Если Лев(ВидД, 15) = "РегистрСведений" Тогда
       Если СписокД.ВыбиратьСрез = ИспользованиеСреза.Первые Тогда
           ВидД = ВидД + ".СрезПервых";
       ИначеЕсли СписокД.ВыбиратьСрез = ИспользованиеСреза.Последние Тогда
           ВидД = ВидД + ".СрезПоследних";
       КонецЕсли;
   КонецЕсли;

   ЗапросД = Новый Запрос;
   ТекстЗапроса = "Выбрать
       |   *
       |Из
       |   " + ВидД;
   _где = "
       |ГДЕ
       |   ";
   _и = "
       | И
       |   ";

   Попытка     //бывает, что Отбор недоступен (например при первом вызове и
       ОтборД = СписокД.Значение.Отбор;    //из проц. ПередОткрытием()
   Исключение
       ОтборД = Неопределено;
   КонецПопытки;

   БылоГде = Ложь;
   Если ОтборД <> Неопределено Тогда
       Для ИндексОтбора = 0 По ОтборД.Количество() - 1 Цикл
           Если ОтборД[ИндексОтбора].Использование Тогда
               Если не БылоГде Тогда
                   ТекстЗапроса = ТекстЗапроса + _где;
                   БылоГде = Истина;
               Иначе
                   ТекстЗапроса = ТекстЗапроса + _и;
               КонецЕсли;
               Вариант = 0;
               Если ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Больше Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " > ";
                   Вариант = 1;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.БольшеИлиРавно Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " >= ";
                   Вариант = 1;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ВИерархии Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " В иерархии ";
                   Вариант = 4;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ВСписке Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " В ";
                   Вариант = 4;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ВСпискеПоИерархии Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " В иерархии ";
                   Вариант = 4;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Интервал Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " > &" + ОтборД[ИндексОтбора].ПутьКДанным + "1" + _и;
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " < &" + ОтборД[ИндексОтбора].ПутьКДанным + "2";
                   Вариант = 2;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " >= &" + ОтборД[ИндексОтбора].ПутьКДанным + "1" + _и;
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " <= &" + ОтборД[ИндексОтбора].ПутьКДанным + "2";
                   Вариант = 2;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ИнтервалВключаяНачало Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " >= &" + ОтборД[ИндексОтбора].ПутьКДанным + "1" + _и;
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " < &" + ОтборД[ИндексОтбора].ПутьКДанным + "2";
                   Вариант = 2;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ИнтервалВключаяОкончание Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " > &" + ОтборД[ИндексОтбора].ПутьКДанным + "1" + _и;
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " <= &" + ОтборД[ИндексОтбора].ПутьКДанным + "2";
                   Вариант = 2;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Меньше Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " < ";
                   Вариант = 1;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.МеньшеИлиРавно Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " <= ";
                   Вариант = 1;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.НеВИерархии Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " Не В иерархии ";
                   Вариант = 4;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.НеВСписке Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " Не В ";
                   Вариант = 4;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.НеВСпискеПоИерархии Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным +  " Не В иерархии ";
                   Вариант = 4;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.НеРавно Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " <> ";
                   Вариант = 1;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Равно Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " = ";
                   Вариант = 1;
               ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Содержит Тогда
                   ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " Подобно ";
                   Вариант = 3;
               Иначе
                   Сообщить("ошибка!");
               КонецЕсли;

               Если Вариант = 1 Тогда
                   ТекстЗапроса = ТекстЗапроса + "&" + ОтборД[ИндексОтбора].ПутьКДанным;
                   ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным, ОтборД[ИндексОтбора].Значение);
               ИначеЕсли Вариант = 2 Тогда
                   ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным + "1", ОтборД[ИндексОтбора].ЗначениеС);
                   ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным + "2", ОтборД[ИндексОтбора].ЗначениеПо);
               ИначеЕсли Вариант = 3 Тогда
                   ТекстЗапроса = ТекстЗапроса + "&" + ОтборД[ИндексОтбора].ПутьКДанным;
                   ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным, "%" + ОтборД[ИндексОтбора].Значение + "%");
               ИначеЕсли Вариант = 4 Тогда
                   ТекстЗапроса = ТекстЗапроса + "(&" + ОтборД[ИндексОтбора].ПутьКДанным + ")";
                   ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным, ОтборД[ИндексОтбора].Значение);
               КонецЕсли;

           КонецЕсли;
       КонецЦикла;
   КонецЕсли;

   Сообщить("" + ТекстЗапроса);
   ЗапросД.Текст = ТекстЗапроса;

   тзТ = ЗапросД.Выполнить().Выгрузить();
   Возврат тзТ;
КонецФункции // ()
-------------------------

Источник:
http://itland.ru/forum/index.php?showtopic=4977
1 427
 
23.10.04
20:00
и эти люди запрещают мне ковыряться в носу?
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.