|
v7: Не получается сделать выборку | ☑ | ||
---|---|---|---|---|
0
Ruseek
19.03.15
✎
05:45
|
Всем привет.
Дано на форме два реквизита, 1 - справочник товары (товар), 2 - текстовое поле (артикул). Справочник товары имеет 3 уровня, введен какой-нибд артикул, в случае когда выбираешь группу первого уровня то в выборке нет ни одного элемента, если второго тогда нормально, процедура Спр = СоздатьОбъект("Справочник.Товары"); Если ПустоеЗначение(Товар) = 0 Тогда Спр.ИспользоватьРодителя(Товар); КонецЕсли; Если ПустоеЗначение(Артикул) = 0 Тогда Спр.ВыбратьЭлементыПоРеквизиту("Артикул",СокрЛП(НРег(Артикул)),Товар.Выбран(),0); КонецЕсли; ИтогоТакихЭлементов = 0; Пока Спр.ПолучитьЭлемент() = 1 Цикл ИтогоТакихЭлементов = ИтогоТакихЭлементов +1; КонецЦикла; Сообщить("Итого в справочнике "+ИтогоТакихЭлементов+" товаров."); пример: есть телевизор самсунг артикул к123 (Телевизоры->Самсунг->телик самсунг, черный, к123), структура справочника на первом уровне виды товаров, на втором фирмы, если на форме в "товар" выбрать группу телевизоры то в выборку этот телевизор не попадет, если выбрать группу самсунг, тогда в выборке он будет. Почему? |
|||
1
ShoGUN
19.03.15
✎
06:44
|
(0) Это норма. "Вассал моего вассала - не мой вассал". В смысле, методы, тобой использованные - выбирают только подчиненных первого уровня. ЕМНИП, в семерочных запросах по справочнику можно использовать условие "В", и оно иерархию как раз учитывает. А так, как у тебя сделано - только рекурсивную функцию писать.
|
|||
2
Ruseek
20.03.15
✎
07:37
|
Спасибо.
Условие "В" работает очень долго, перебирать тупо сотни тысяч позиций постоянно, это очень долго, ладно буду через рекурсию. Не знал этого. |
|||
3
VladZ
20.03.15
✎
08:09
|
(2) "перебирать тупо сотни тысяч позиций постоянно, это очень долго" - смотри в сторону прямых запросов.
|
|||
4
dk
20.03.15
✎
08:29
|
если В указана группа, а не список значений, то простой черный запрос должен быстро отрабатывать - думаю пошустрее перебора
|
|||
5
Chameleon1980
20.03.15
✎
09:06
|
на всяуий еще глянь:
ПринадлежитГруппе(<?>) Синтаксис: ПринадлежитГруппе(<Группа>) Назначение: Метод проверяет, принадлежит ли указанной группе текущий элемент справочника (независимо от того, на каком нижележащем уровне он находится). Возвращает: 1 - если элемент принадлежит указанной группе , 0 - если нет. Параметры: <Группа> - выражение со значением группы справочника . |
|||
6
Chameleon1980
20.03.15
✎
09:06
|
* на всякий
|
|||
7
Злопчинский
20.03.15
✎
10:29
|
(6) всякий - правильный!
. Если ПустоеЗначение(Артикул) = 1 Тогда Возврат; КонецЕсли; ВыбранТовар = Товар.Выбран(); Спр = СоздатьОбъект("Справочник.Товары"); Спр.ВыбратьЭлементыПоРеквизиту("Артикул",СокрЛП(Артикул),0,0); ИтогоТакихЭлементов = 0; Пока Спр.ПолучитьЭлемент() = 1 Цикл Если ВыбранТовар=1 Тогда Если Спр.ПринадлежитГруппе(Товар)=0 Тогда Продолжить; КонецЕсли; КонецЕсли; ИтогоТакихЭлементов = ИтогоТакихЭлементов +1; КонецЦикла; Сообщить("Итого в справочнике "+ИтогоТакихЭлементов+" товаров."); Типа как-то так |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |