|
v7: Работа с Таблицей значений | ☑ | ||
---|---|---|---|---|
0
kletelson
28.08.13
✎
10:20
|
Добрый день! Пишу отчет в Зик7.7.
Имеется Таблица значений с колонками:"Категория", "Подразделение" "Должность". Она получено запросом из справочника. Нужно по известным подразделению и должности сотрудника определять категорию. Через метод Таблица.НайтиЗначение(ТабНач.Подразд, СтрПодр,"Подразделение") могу искать только по одному реквизиту, а нужно сразу по 2-м. Как проще сделать? |
|||
1
Ёпрст
28.08.13
✎
10:21
|
(0) составной реквизит + поиск
ну а быстрее, индексированную тз использовать |
|||
2
chelentano
28.08.13
✎
10:21
|
(0) перебором
|
|||
3
kletelson
28.08.13
✎
10:22
|
(1) а поподробней?
|
|||
4
kletelson
28.08.13
✎
10:25
|
(2) перебором боюсь долго получится , т.к. изначально беру данные из журнала зарплата(более 1000 сотров) из них вытягиваю подр-е, должность сотра
|
|||
5
Ёпрст
28.08.13
✎
10:25
|
(3) а что именно не ясно ?
|
|||
6
chelentano
28.08.13
✎
10:26
|
(4) ты спросил, как проще, а не как лучше
|
|||
7
Ёпрст
28.08.13
✎
10:26
|
проще, индексированную тз и метод группировать в ней, + вывод рекурсивный потом.
|
|||
8
kletelson
28.08.13
✎
10:27
|
(6) понятно)
|
|||
9
PuhUfa
28.08.13
✎
10:28
|
>>Нужно по известным подразделению и должности сотрудника определять категорию
Для чего? А то может лучше сделать это еще на стадии "Она получено запросом из справочника" |
|||
10
Shaman100M
28.08.13
✎
10:32
|
ТЗ.Сортировать("Подразделение,Должность");
ТекСтрока=0; Если ТЗ.НайтиЗначение(ИскомоеПодразделение,ТекСтрока,"Подразделение") = 1 Тогда Для Счт=ТекСтрока По ТЗ.КОличествоСтрок() Цикл ТЗ.ПолучитьСтрокуПоНомеру(Счт); Если ТЗ.Подразделение <> ИскомоеПодразделение Тогда Прервать; КонецЕсли; Если ТЗ.Должность = ИскомаяДолжность Тогда Возврат ТЗ.Категория; КонецЕсли; КонецЦикла; КонецЕсли; // если точно по постановке задачи - поиск по подразделению + перебор по должности или наоборот, в зависимости от того, какое множество значений меньше. |
|||
11
kletelson
28.08.13
✎
10:34
|
(10) понял, большое спасибо!
|
|||
12
Shaman100M
28.08.13
✎
10:36
|
+ (10) ну или сразу, исключить из поиска ТЗ, оставлять "висеть" переменную запроса, а из него:
Если Запрос.Получить(ИскомоеПодразделение,ИскомаяДолжность) = 1 Тогда Возврат Запрос.Категория; КонецЕсли; |
|||
13
PuhUfa
28.08.13
✎
10:39
|
(12) это, кстати, написано в ЖКК в качестве примера -) там как раз выбирается Должность и категория -)
|
|||
14
kletelson
28.08.13
✎
10:44
|
(13) а ЖКК - это что такое? может там еще что полезное по 7-ке
|
|||
15
ДенисЧ
28.08.13
✎
10:46
|
(14) Там много полезного :-)
http://www.forum.mista.ru/rules.php#dict |
|||
16
НЕА123
28.08.13
✎
10:48
|
(10)
ТЗ.Сортировать("Подразделение *,Должность *"); быстрее будет. |
|||
17
kletelson
28.08.13
✎
10:48
|
(12) точно , это самый быстрый вариант наверно будет, еще раз спасибо)
|
|||
18
Serginio1
28.08.13
✎
10:50
|
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019
Функция глНайтиЗначениеВТз(Тз,Значение,ИмяКолонки) Экспорт стр=0; Если Тз.НайтиЗначение(Значение,стр,ИмяКолонки)=1 Тогда Тз.ПолучитьСтрокуПоНомеру(стр); Возврат 1; КонецЕсли; Возврат 0; КонецФункции // глНайтиЗначениеВТз ТзПоиск=ГлСгруппироватьПоПолюБыстро(Тз,"Подразделение"); Если глНайтиЗначениеВТз(ТзПоиск,Подразделение,"Подразделение")=1 Тогда ТзГр=ТзПоиск.ТзПоГруппе; Если глНайтиЗначениеВТз(ТзГр,Должность,"Должность")=1 Тогда Возврат ТзГр.Категория |
|||
19
Serginio1
28.08.13
✎
10:51
|
Ну или двоичный поиск по сортированной тз
|
|||
20
Serginio1
28.08.13
✎
10:57
|
Для сравнения лучше использовать дополнительную тз в которой
заполнять искомые значение и текущие и сортировкой определять какая запись больше или меньше Процедура ДобавитьРеквизиты(Тз,ТзТемп,Индекс,Резулт,СписокПолей) Для сч=1 По СписокПолей.РазмерСписка() Цикл Поле=СписокПолей.ПолучитьЗначение(сч); Значение=ТзТемп.ПолучитьЗначение(ТзТемп.НомерСтроки,Поле); Тз.УстановитьЗначение(индекс,Поле,Значение); КонецЦикла; Тз.ПолучитьСтрокуПоНомеру(Индекс); Тз.Резулт=Резулт; КонецПроцедуры Функция Сравнение(ТзДляСравнений,Тз1,Тз2,СписокПолей,СпзСписокПолей) Если ТзРавны(Тз1,тз2,СпзСписокПолей)=1 Тогда Возврат 0; КонецЕсли; ДобавитьРеквизиты(ТзДляСравнений,Тз1,1,-1,СпзСписокПолей); ДобавитьРеквизиты(ТзДляСравнений,Тз2,2,1,СпзСписокПолей); ТзДляСравнений.Сортировать(СписокПолей); ТзДляСравнений.ПолучитьСтрокуПоНомеру(1); Возврат ТзДляСравнений.Резулт; КонецФункции |
|||
21
Эльниньо
28.08.13
✎
13:06
|
(4) 1000 строк ТЗ ни о чём.
|
|||
22
Ganiev
28.08.13
✎
13:38
|
в (7) написал правильно тебе! Ну или перебором через таблицусравнения!
|
|||
23
ADirks
29.08.13
✎
07:37
|
кстати да, 1000 строк - фигня.
дихотомический поиск начинает давать выигрыш на объёмах > 5000 (если правильно помню). |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |