![]() |
![]() |
![]() |
|
Можно-ли те виды сравнения что есть в СКД использовать не в СКД? | ☑ | ||
---|---|---|---|---|
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
|
спасибо. закладка :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |