Имя: Пароль:
1C
1С v8
Можно-ли те виды сравнения что есть в СКД использовать не в СКД?
0 lanc2233
 
28.01.13
23:04
Допустим мне нужно проверить входит-ли элемент справочника в группу из списка. Если да, то как?
1 mikecool
 
28.01.13
23:06
в запросе
2 XLife
 
28.01.13
23:06
Элемент В ИЕРАРХИИ(&Список)
3 DrShad
 
28.01.13
23:06
ПринадлежитЭлементу()
4 Fragster
 
гуру
28.01.13
23:07
я эмуляцию писал, типа так:


Функция ПолучитьЗначениеСКД(Значение, Регистр, Документ)
   
   Если ТипЗнч(Значение) = Тип("ПолеКомпоновкиДанных") Тогда
       Путь = Строка(Значение);
       Если Найти(Путь,"Константа")=1 Тогда
           Возврат Вычислить(Путь+".Получить()");
       Иначе
           Возврат Вычислить(Путь);
       КонецЕсли;
   Иначе
       Возврат Значение;
   КонецЕсли;
КонецФункции

Функция ВИерархии(ЗначениеПоиска, ЗначениеИерархии)
   Возврат (ЗначениеПоиска = ЗначениеИерархии) ИЛИ ЗначениеПоиска.ПринадлежитЭлементу(ЗначениеИерархии)
КонецФункции

Функция ВСпискеПоИерархии(ЗначениеПоиска, СписокПоиска)
   Для каждого ЭлементСписка Из СписокПоиска Цикл
       Если ВИерархии(ЗначениеПоиска, ЭлементСписка.Значение) Тогда
           Возврат Истина;
       КонецЕсли;
   КонецЦикла;    
   Возврат Ложь;
КонецФункции

Функция ПроверитьАтомарноеУсловие(ЭлементОтбораСКД, Регистр, Документ)
   
   Если Ложь Тогда
       Настройки = Новый НастройкиКомпоновкиДанных;
       ЭлементОтбораСКД = Настройки.Отбор.Элементы.Получить(0);
   КонецЕсли;
   
   ЛевоеЗначение  = ПолучитьЗначениеСКД(ЭлементОтбораСКД.ЛевоеЗначение, Регистр, Документ);
   ПравоеЗначение = ПолучитьЗначениеСКД(ЭлементОтбораСКД.ПравоеЗначение, Регистр, Документ);
   ВидСравненияЗначений = ЭлементОтбораСКД.ВидСравнения;
   // Виды сравнения СКД:    
   //Больше (Greater)
   //БольшеИлиРавно (GreaterOrEqual)
   //ВИерархии (InHierarchy)
   //ВСписке (InList)
   //ВСпискеПоИерархии (InListByHierarchy)
   //Заполнено (Filled)
   //Меньше (Less)
   //МеньшеИлиРавно (LessOrEqual)
   //НеВИерархии (NotInHierarchy)
   //НеВСписке (NotInList)
   //НеВСпискеПоИерархии (NotInListByHierarchy)
   //НеЗаполнено (NotFilled)
   //НеРавно (NotEqual)
   //НеСодержит (NotContains)
   //Равно (Equal)
   //Содержит (Contains)
   Попытка
       Если ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.Больше Тогда
           Возврат ЛевоеЗначение > ПравоеЗначение;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.БольшеИлиРавно Тогда
           Возврат ЛевоеЗначение >= ПравоеЗначение;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.ВИерархии Тогда
           Возврат ВИерархии(ЛевоеЗначение, ПравоеЗначение);
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.ВСписке Тогда
           Возврат ПравоеЗначение.НайтиПоЗначению(ЛевоеЗначение)<>Неопределено;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии Тогда
           Возврат ВСпискеПоИерархии(ЛевоеЗначение, ПравоеЗначение);
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.Заполнено Тогда
           Возврат ЗначениеЗаполнено(ЛевоеЗначение);
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.Меньше Тогда
           Возврат ЛевоеЗначение < ПравоеЗначение;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно Тогда
           Возврат ЛевоеЗначение <= ПравоеЗначение;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.НеВИерархии Тогда
           Возврат Не ВИерархии(ЛевоеЗначение, ПравоеЗначение);
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.НеВСписке Тогда
           Возврат ПравоеЗначение.НайтиПоЗначению(ЛевоеЗначение) = Неопределено;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда
           Возврат Не ВСпискеПоИерархии(ЛевоеЗначение, ПравоеЗначение);
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.НеЗаполнено Тогда
           Возврат Не ЗначениеЗаполнено(ЛевоеЗначение);
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.НеРавно Тогда
           Возврат ЛевоеЗначение <> ПравоеЗначение;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.НеСодержит Тогда
           Возврат Найти(Строка(ЛевоеЗначение),Строка(ПравоеЗначение)) = 0;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.Равно Тогда
           Возврат ЛевоеЗначение = ПравоеЗначение;
           
       ИначеЕсли ВидСравненияЗначений = ВидСравненияКомпоновкиДанных.Содержит Тогда
           Возврат Найти(Строка(ЛевоеЗначение),Строка(ПравоеЗначение)) <> 0;
           
       Иначе // вроде выше все виды сравнения, но на всякий случай
           ВызватьИсключение "Вид сравнения <"+ВидСравненияЗначений+"> не поддерживается";
       КонецЕсли;
   Исключение
       Сообщить("не получилось проверить условие проводки");
       Сообщить(ОписаниеОшибки());
       Сообщить("Левое значение: "+ ТипЗнч(ЛевоеЗначение));
       Сообщить("Правое значение: "+ ТипЗнч(ПравоеЗначение));
       Сообщить("Вид сравнения: "+ ВидСравненияЗначений);
       Возврат Ложь;
   КонецПопытки;
КонецФункции

Функция ПроверитьУсловиеСКД(КоллекцияЭлементов, СтрокаДвижений, Документ, ТипГруппы = Неопределено)
   
   Если КоллекцияЭлементов.Количество() = 0 Тогда
       // пустая группа всегда истина;
       Возврат Истина;
   КонецЕсли;
   
   ТипГруппы = ?(ТипГруппы = Неопределено, ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ, ТипГруппы);
   
   ПромежуточныйРезультат = ТипГруппы <> ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
   Для каждого ЭлементОтбораСКД Из КоллекцияЭлементов Цикл
       Если ТипЗнч(ЭлементОтбораСКД) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
           ТМП = ПроверитьУсловиеСКД(ЭлементОтбораСКД.Элементы, СтрокаДвижений, Документ, ЭлементОтбораСКД.ТипГруппы);
       Иначе
           ТМП = ПроверитьАтомарноеУсловие(ЭлементОтбораСКД, СтрокаДвижений, Документ);
       КонецЕсли;
       
       Если ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли Тогда
           ПромежуточныйРезультат = ПромежуточныйРезультат ИЛИ ТМП;
           Если ПромежуточныйРезультат Тогда
               // "ленивая" проверка условий
               // если "ИЛИ" и уже истина, то прерываем
               Прервать;
           КонецЕсли;
       ИначеЕсли ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе Тогда
           ПромежуточныйРезультат = ПромежуточныйРезультат И (НЕ ТМП);
           Если Не ПромежуточныйРезультат Тогда
               // "ленивая" проверка условий
               // если "И" и уже ложь, то прерываем
               Прервать;
           КонецЕсли;
       Иначе
           ПромежуточныйРезультат = ПромежуточныйРезультат И ТМП;
           Если Не ПромежуточныйРезультат Тогда
               // "ленивая" проверка условий
               // если "И" и уже ложь, то прерываем
               Прервать;
           КонецЕсли;
       КонецЕсли
   КонецЦикла;
   
   // если группа была "не", то инвертируем условие
   Возврат ?(ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе,Не ПромежуточныйРезультат,ПромежуточныйРезультат);
КонецФункции
5 Fragster
 
гуру
28.01.13
23:09
дарю
6 lanc2233
 
28.01.13
23:17
Спасибо
7 zladenuw
 
29.01.13
00:02
спасибо. закладка :)