|
|
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;
КонецЦикла;
Сообщить("Итого в справочнике "+ИтогоТакихЭлементов+" товаров.");
Типа как-то так
|
|
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший