Имя: Пароль:
1C
1C 7.7
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;
    КонецЦикла;
    Сообщить("Итого в справочнике "+ИтогоТакихЭлементов+" товаров.");


Типа как-то так