Имя: Пароль:
1C
 
Правильно ли я решил задачу?
Ø (GROOVY 18.09.2014 11:37)
0 worker-good
 
18.09.14
10:51
В справочнике «Скидки» назначаются скидки на номенклатуру или группу номенклатуры. Необходимо реализовать функцию, именно как отдельную функцию на языке 1С, для определения скидки на товар. Если для номенклатурной позиции скидка не назначена, то смотреть скидку для родителя, родителя родителя и т.д. Вычисление средней/максимальной/минимальной скидки среди родителей элемента не требуется.

Можно реализовать функцию в виде рекурсии
Функция ПолучитьСкидку(СправочникСкидка)
Пока Не СправочникСкидка.Родитель =Справочники.СправочникСкидка.ПустаяСсылка() Цикл
Если  СправочникСкидка.Скидка > 0 Тогда
            Возврат СправочникСкидка.Скидка;
    КонецЕсли    
КонецЦикла;
КонецФункции
1 КонецЦикла
 
18.09.14
10:53
(0) Ептыть, давайте теперь все сюда вываливать
Работает? - молодец
2 worker-good
 
18.09.14
10:54
(1) Так не работает вроде
3 H A D G E H O G s
 
18.09.14
10:55
3 года программирования ежу под хвост.
4 КонецЦикла
 
18.09.14
10:55
Если для номенклатурной позиции скидка не назначена - вот про это забыл?
5 H A D G E H O G s
 
18.09.14
10:57
Руккурсия - плохо, лучше цикл.
Реккурсия забьет стэк и вывалит программу, цикл тупо ее повесит :-)
6 Жан Пердежон
 
18.09.14
10:57
(0) это печально
7 Злопчинский
 
18.09.14
10:58
Рекурсии в (0) не вижу
8 Злопчинский
 
18.09.14
10:59
.. и вообще - какой-то бред имхо написан
9 Михаил Козлов
 
18.09.14
10:59
Что-то рекурсии не увидел.
И условие цикла может никогда не выполниться.
10 Злопчинский
 
18.09.14
11:00
(0) и при чем здесь родители в справочнике скидок, если надо смотреть родителя дл яноменклатуры..?
11 Jokero
 
18.09.14
11:01
получить всех родителей номенклатуры

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ссылка
ИТОГИ ПО
    Ссылка ИЕРАРХИЯ

Потом обходи циклом и проверяй на нужное условие
12 worker-good
 
18.09.14
11:01
(10) Это тестовое задание, вот думаю правильно или неправильно?
13 worker-good
 
18.09.14
11:02
(10) Как правильней решить это задание?
14 боксер
 
18.09.14
11:02
(0)рекурсии нет и не нужен там цикл
15 Timon1405
 
18.09.14
11:03
(12) неправильно, ваша функция не рекурсивная
16 worker-good
 
18.09.14
11:03
(15) Это я понял, а правильно решена задача?
17 Злопчинский
 
18.09.14
11:05
я не 8-ик потому пишу тупо на клюшке
.
Функция ВернутьСкидку(Номенклатура)
  Если Номенклатура.Скидка.Выбран()=0
  Тогда
     Возврат Номенклатура.Скидка.Скидка;
  КонецЕсли;
  Если Номенклатура.Родитель.Выбран()=0
  Тогда
    Возврат 0;
  КонецЕсли;
  Возврат ВернутьСкидку(Номенклатура.Родитель);
КонецФункции;
18 Peltzer
 
18.09.14
11:06
(12) Неправильно решена.
Либо сделай как в (11), либо действительно, цикл по номенклатуре, до верхнего родителя или пока скидка ненулевая не будет найдена.
19 Злопчинский
 
18.09.14
11:06
.. вверху первое условие
Номенклатура.Скидка.Выбран()=1
20 wertyu
 
18.09.14
11:07
уже написали, что рекурсии нет?
21 боксер
 
18.09.14
11:07
Функция ПолучитьСкидку(Спр)
    Если спр.уровень()>0 Тогда
        Если спр.скидка<>0 Тогда
             возврат спр.скидка;
        иначе    
            возврат ПолучитьСкидку(Спр.родитель);
        КонецЕсли;
    иначе //нет родителя
        возврат спр.скидка;
    КонецЕсли;
КонецФункции
22 palpetrovich
 
18.09.14
11:09
(0) рекурсия это так примерно
Функция ПолучитьСкидку(СправочникСкидка)
    Если  СправочникСкидка.Скидка > 0 Тогда
        Возврат СправочникСкидка.Скидка;
    КонецЕсли    
    СправочникСкидка = СправочникСкидка.Родитель;
    Если  СправочникСкидка = Справочники.СправочникСкидка.ПустаяСсылка() Тогда
        Возврат 0;
    КонецЕсли    
    ПолучитьСкидку(СправочникСкидка)
КонецФункции

правда с учетом (10) ходьба по "СправочникСкидка" - скорее всего бред :)
23 боксер
 
18.09.14
11:12
учти скидка может быть и отрицательная (наценка)
24 Злопчинский
 
18.09.14
11:15
это одному мне кажется что
"Если для номенклатурной позиции скидка не назначена, то смотреть скидку для родителя, родителя родителя "
речь идет про родителя НОМЕНКЛАТУРЫ, ане про родителя скидки...
25 palpetrovich
 
18.09.14
11:18
(24) Не, не одному тебе. Просто непонятно что там у автора, может нетленка какая... :)
26 боксер
 
18.09.14
11:20
упростил (21) должно и так работать
Функция ПолучитьСкидку(Спр)
    Если спр.уровень()=0 или спр.скидка<>0 Тогда
        возврат спр.скидка;
    иначе
        возврат ПолучитьСкидку(Спр.родитель);
    КонецЕсли;
КонецФункции
27 Peltzer
 
18.09.14
11:22
Значения СправочникСкидка.Родитель нет, это не иерархический справочник, а подчиненный.

<code>
Функция ПолучитьСкидку(Номенклатура)
Выборка = Справочники.Скидки.Выбрать(,Номенклатура);
Если Выборка.Следующий() Тогда
Возврат Выборка.РазмерСкидки;
ИначеЕсли Номенклатура.Родитель = Неопределено Тогда
Возврат 0;
Иначе Возврат ПолучитьСкидуку(Номенклатура.Родитель);
КонецФункции
</code>
28 Jokero
 
18.09.14
11:32
(18) чейто?
дались вам эти рекурсии?

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка = &Ссылка
ИТОГИ ПО
    Ссылка ИЕРАРХИЯ
____________________________


Выборка = Запрос.Выполнить().Выбрать()

Итер = Выборка.Количество();

Пока Итер >= 0 цикл
    Скидко = Выборка[Итер].Скидка
    Если Скидко <> 0 тогда
    Возврат Скидко;
    Итер = Итер - 1;
КонецЦикла;
29 Jokero
 
18.09.14
11:35
(28) +быстро написал = конецЕсли забыл и точкузапятую