Имя: Пароль:
1C
1C 7.7
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 (если правильно помню).