Имя: Пароль:
1C
 
Помогите разобраться с методом справочника "ПринадлежитГруппе"
0 Allan Stark
 
24.05.04
10:16
1С версия 7.7 (7.70.020)
Есть ф-ция, которая должна выдавать ставки начислений (исп. в зарплате).
Конфигурация 1С - комплексная (все компоненты)

Код ф-ции:

Функция ПолучитьСтавку(ГруппаКод, СуммаЗП)
СпрШкалаСтавок = СоздатьОбъект("Справочник.ШкалаСтавок");
СпрШкалаСтавок.ИспользоватьДату(ДатаДок);
СпрШкалаСтавок.ВыбратьЭлементы();
Пока СпрШкалаСтавок.ПолучитьЭлемент() = 1 Цикл
Если (СпрШкалаСтавок.ПринадлежитГруппе(ГруппаКод) = 1) И (СуммаЗП < СпрШкалаСтавок.Предел)
Тогда Возврат СпрШкалаСтавок.Ставка;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции

Ставки хранятся в соотв. справочнике. Поскольку ставка зависит от суммы начисленной зарплаты, нужно организовать подбор подходящей ставки внутри группы отчислений.

Все замечательно, только метод справочника "ПринадлежитГруппе" работает некорректно - не сравнивает с группой...

Помогите пожалуйста...
1 SnarkHunter
 
24.05.04
10:33
Метод ПринадлежитГруппе работает корректно... Просто его в данном контексте используют некорректно... Параметр некорректный, если уж на то пошлО...
2 Allan Stark
 
24.05.04
11:30
Хорошо.
Тогда не подскажете, как сделать так, чтоб корректно работало ?
3 Allan Stark
 
24.05.04
11:33
В документации сказано, что ему (ПринадлежитГруппе) передается параметр, "содержащий выражение со значением группы справочника".
как это интерпретировать ? Пробовал в качестве параметра и Код справочника и его Наименование - результат отрицательный...

В общем нужно сделать так, чтоб функция просматривала все элементы справочника и если элемент входит в заданную группу и значение начисления зарплаты ниже пороговой ставки - то возвращался этот Код элемента справочника ставок.
4 SnarkHunter
 
24.05.04
11:35
Это нужно интерпретировать, как "ссылка на элемент справочника"...
5 lexa
 
24.05.04
11:43
Попробуй
Функция ПолучитьСтавку(ГруппаКод, СуммаЗП)
СпрШкалаСтавок = СоздатьОбъект("Справочник.ШкалаСтавок");
СпрШкалаСтавок.ИспользоватьДату(ДатаДок);
СпрШкалаСтавок.ВыбратьЭлементы();
Пока СпрШкалаСтавок.ПолучитьЭлемент() = 1 Цикл
Если (СпрШкалаСтавок.Родитель.Код = ГруппаКод)  И (СуммаЗП < СпрШкалаСтавок.Предел)
Тогда Возврат СпрШкалаСтавок.Ставка;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
А вообще лучше передавать не ГруппаКод а Группа, как агрегатный объект, т.е.е элемент справочника
6 Allan Stark
 
24.05.04
11:43
Ну и ? Что, нужно вначале взять некую переменную и найти в нее элемент справочника, который есть группа (НайтиПоКоду) ?

Например:

...........
ЭлементГруппа = СпрШкалаСтавок.НайтиПоКоду(ГруппаКод);
Если (СпрШкалаСтавок.ПринадлежитГруппе(ЭлементГруппа) = 1) И (СуммаЗП < СпрШкалаСтавок.Предел)
Тогда Возврат СпрШкалаСтавок.Ставка;
...........

???
7 lexa
 
24.05.04
11:46
А если код не уникальный?
8 SnarkHunter
 
24.05.04
11:54
(7)А если это родитель более высокого уровня?
9 Allan Stark
 
24.05.04
11:56
Lexa

В смысле не уникальный ? Так проверить еще дополнительно с помощью .ЭтоГруппа()
А тот факт, что найдутся две группы с одинаковым кодом можно считать недействительным.

Блин, только что попробовал - все равно не работает...

Я что-то вкурить не могу, что нужно этому ".ПринадлежитГруппе(...)" подсунуть...
10 Allan Stark
 
24.05.04
11:58
Да нет у него родителя... Просто есть отдельный неподчиненный никому справочник. Называется СпрШкалаСтавок. В нем - все ставки по налогам, отчислениям и пр.
Они там внутри него отсортированы по группам: по зарплате - отдельно, налоги с предприятия - отдельно, платежи в разные фонды и пошлины - тоже отдельно...
11 lexa
 
24.05.04
12:03
Тогда уж более кооректно передавать не "Код", а "ПолныйКод", хотя правильно передавать "ссылка на элемент справочника"
12 Allan Stark
 
24.05.04
12:03
Ой, что-то не то сморозил с Родителем... :-)
Да, в принципе там 3 уровня вложенности... Наприемр в группе "зарплата" есть еще подгруппы "С предприятия" и "С сотрудника"...
13 lexa
 
24.05.04
12:06
(10)
Родитель
Значение родительской группы элемента справочника.

Синтаксис:

Родитель

Англоязычный синоним:

Parent

Описание:

Атрибут Родитель предоставляет доступ к значению родительской группы выбранного элемента справочника.

Данный атрибут может быть изменен только для объектов, созданных функцией СоздатьОбъект.

Пример:

Функция ДатьРодителя(Элем)

  // Справочник Товаров многоуровневый

  // Получая в параметре функции значение товара,

  // надо выдать имя группы товара

  Спр = СоздатьОбъект("Справочник.Товары");

  Спр.НайтиЭлемент(Элем);

  Если Спр.Уровень() > 1 Тогда

     Спр.НайтиЭлемент(Спр.Родитель);

     Возврат "Этот товар принадлежит группе " + Спр.Наименование;

  Иначе

     Возврат "Это товар первого уровня - нет родителя!";

  КонецЕсли;

КонецФункции

Все равно "Код" не является однозначным индентификатором, поэтому лучше передавать ГруппаКод, а Группа, как "ссылка на элемент справочника"
14 Allan Stark
 
24.05.04
12:08
lexa, не, как ты предложил что-то не работает...
15 SnarkHunter
 
24.05.04
12:09
(6)Проверку делай после поиска по коду - найден/не найден...

(10)Не путай Родителя и Владельца...
Я тебе речь веду о строке в (7) - (СпрШкалаСтавок.Родитель.Код = ГруппаКод)... Это быть работать, если ГруппаКод - код группы, в которой непосредственно находится элемент и упадет, если задать код группы более высокого уровня, но в которой, тем не менее, элемент находится в этой группе...
16 lexa
 
24.05.04
12:13
Функция ПолучитьСтавку(Группа, СуммаЗП)
СпрШкалаСтавок = СоздатьОбъект("Справочник.ШкалаСтавок");
СпрШкалаСтавок.ИспользоватьДату(ДатаДок);
СпрШкалаСтавок.ВыбратьЭлементы();
Пока СпрШкалаСтавок.ПолучитьЭлемент() = 1 Цикл
Если (СпрШкалаСтавок.ПринадлежитГруппе(Группа) = 1) И (СуммаЗП < СпрШкалаСтавок.Предел)
Тогда Возврат СпрШкалаСтавок.Ставка;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
17 Allan Stark
 
24.05.04
12:42
lexa, дружище, :-)

Посмотри мой самый первый пост в этой теме...
18 lexa
 
24.05.04
12:48
Ты в функцию передавай не значение реквизита Код элемента справочника, а сам элемент справочника. Покажи как ты вызываешь свою функцию и откуда берутся значения, передаваемые в эту функцию.