Имя: Пароль:
1C
1C 7.7
v7: Множественный фильтр не фильтрует
Ø (Mikeware 28.09.2012 11:32)
,
0 maxxxl-ms
 
28.09.12
11:21
Здравствуйте никак не могу сделать множественный фильтр на отбор по автору и проекту в документу реализации. Может кто увидит что не так.

Функция ПроверкаУсловияПоТаблицеМФ(ИмяПерем, ТаблицаМФ="", ИмяПоляМФ="", ПолеЕФ, ВидСправочникаСвойства="")
   Перем Результат;
   Перем Условие;
   
   Перем ПолеМФ, ТипМФ;
   Перем ПолеМФСвойств, ИмяПоляМФСвойств, ТипМФСвойств;
   Перем ТЗ;

   Результат = 1;  // априори полагаем, что условие выполняется
       
   Если ПустоеЗначение(ПолеЕФ) = 0 Тогда    // есть простой фильтр по позициям справочника
       Если ПолеЕФ.ЭтоГруппа() = 1 Тогда
           Результат = ИмяПерем.ПринадлежитГруппе(ПолеЕФ); // если выбрана группа в фильтре
       Иначе
           Если ИмяПерем = ПолеЕФ тогда
               Результат = 1;
           Иначе
               Результат = 0;
           КонецЕсли;
       КонецЕсли;
   Иначе
       ТЗ = СоздатьОбъект("ТаблицаЗначений");
       ТаблицаМФ.ВыбратьСтроки();
       Пока ТаблицаМФ.ПолучитьСтроку()=1 Цикл
           Если (ТаблицаМФ.СписокЭлементов.РазмерСписка()>0) и
                (ТаблицаМФ.ИмяПеременной=ИмяПоляМФ) и
                (ТаблицаМФ.ФлВкл=2) Тогда

               Если (ТаблицаМФ.Вид<>"ЗначенияСвойств") Тогда

                   ТипМФ = ТаблицаМФ.ТипМФ;
                   Условие = ТаблицаМФ.СписокЭлементов;

                   Если ТипМФ=1 Тогда // принадлежит списку
                       Результат = Условие.Принадлежит(ИмяПерем);
                   Иначе
                       Результат = (Условие.Принадлежит(ИмяПерем)-1)*(-1); // не принадлежит списку
                   КонецЕсли;

               Иначе // по свойствам

                   ЕстьМФ = 0;
                   ПолеМФ = ТаблицаМФ.СписокЭлементов;
                   ТипМФ  = ТаблицаМФ.ТипМФ;
                   
                   Если ТипЗначенияСтр(ПолеМФ)="СписокЗначений" Тогда
                       Если (ПолеМФ.РазмерСписка()>0) Тогда
                           ЕстьМФ = 1;
                       КонецЕсли;
                   КонецЕсли;

                   Если ЕстьМФ = 0 Тогда
                       Результат = 1;
                   Иначе
                       // теперь отбираем позиции по списку свойств
                       ТекстЗапросаСвойств = "
                           |Обрабатывать НеПомеченныеНаУдаление;
                           |КатегорияПозиции  = Справочник."+ВидСправочникаСвойства+".ТекущийЭлемент;
                           |Позиция           = Справочник."+ВидСправочникаСвойства+".Владелец;
                           |СвойствоПоз       = Справочник."+ВидСправочникаСвойства+".ЗначениеСвойства;
                           |Группировка Позиция Без Групп;";
                       Если ТипМФ=3 Тогда
                           ТекстЗапросаСвойств =ТекстЗапросаСвойств + "Группировка СвойствоПоз Без Групп;";
                       КонецЕсли;
                       ТекстЗапросаСвойств = ТекстЗапросаСвойств + "Условие (СвойствоПоз в ПолеМФ);";
                       ТекстЗапросаСвойств = ТекстЗапросаСвойств + "Условие (Позиция = ИмяПерем);";

                       // выполняем запрос
                       Запрос = СоздатьОбъект("Запрос");
                       Если Запрос.Выполнить(ТекстЗапросаСвойств)=0 Тогда
                           Результат = 0;
                       Иначе
                           Запрос.Выгрузить(ТЗ,0);
                           
                           Если (ТЗ.КоличествоСтрок() = 0) и ((ТипМФ=1)или(ТипМФ=3)) Тогда
                                 // если запрос ничего не принес и тип фильтра = "входит в список"
                               Результат = 0;
                           Иначе
                               НомерСтроки = 0;
                               Если (ТипМФ=1) или (ТипМФ=3) Тогда // принадлежит списку или одновременно все
                                   Результат = ТЗ.НайтиЗначение(ИмяПерем, НомерСтроки, "Позиция");
                               Иначе
                                   Результат = (ТЗ.НайтиЗначение(ИмяПерем, НомерСтроки, "Позиция")-1)*(-1); // не принадлежит списку
                               КонецЕсли;
                           КонецЕсли;
                       КонецЕсли;
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;
   
   Возврат Результат;
КонецФункции    // ПроверкаУсловияПоТаблицеМФ
1 Ёпрст
 
28.09.12
11:23
(0) да всё не так.
2 maxxxl-ms
 
28.09.12
11:24
(2) не смешно
3 maxxxl-ms
 
28.09.12
11:25
(1) не смешно(((
4 Ёпрст
 
28.09.12
11:25
(2) мне тоже.
5 ЧеловекДуши
 
28.09.12
11:27
Пятницо!!!
Все там работает, у Автора, руки из ЖПЫ растут :)
6 Nirvana
 
28.09.12
11:27
Для начала:
Если (СокрЛП(ТаблицаМФ.Вид)<>"ЗначенияСвойств") Тогда ...
7 Ёпрст
 
28.09.12
11:27
весь свой код в топку, открыть любой типовой отчет, типа ПнализПродаж и скопирять оттуда:


глДобавитьВТаблицуМФ(

+

глФильтрПоПеременнойЗапроса(....)

всё.
8 Ёпрст
 
28.09.12
11:28
т.е сделать полный аналог, подсунув свой текст запроса, нужные группировки и условия в МФ.
усё.

А не изобретать велик и портить МФ
9 maxxxl-ms
 
28.09.12
11:30
ЧеловекДуши у тебя в мозгу одно гвно ток серишь везде своими "мыслями"...
10 Sh1ko
 
28.09.12
11:32
Агрессивные дятлы, это страшно.
11 Mikeware
 
28.09.12
11:32
(9) Научись вести себя прилично.
а потом уже приходи с вопросами...