Имя: Пароль:
1C
1С v8
Индекс находится за пределами массива
,
0 black_cat1305
 
30.07.13
09:36
Добрый день! Прошу вас не закидывайте меня комнями!!!! Помогите разобраться в чем дело?! Написала обработку, но при проведении выдает сообщение "индекс находится за пределами массива". Отладчиком проверяю все нормально, уже и незнаю где и в каком месте рыть(((

Вот сама обработка
Процедура СформироватьРоли(ТабДок)
    Макет = ПолучитьМакет("Макет");
    Макет.ПолучитьОбласть("Шапка|ПервыйСтолбец");
    ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка|ПервыйСтолбец"));
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                      |    ku_ФункционалПользователя.Наименование КАК Функционал
                      |ИЗ
                      |    РегистрСведений.ku_ФункционалПользователя КАК ku_ФункционалПользователя
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ku_ФункционалПользователя.Наименование";
                      
    РезультатФункционал = Запрос.Выполнить().Выгрузить();
    
         Для Каждого Функционал из РезультатФункционал Цикл
                Область = Макет.ПолучитьОбласть("Шапка|Столбец");
                Область.Параметры.Роль = Функционал.Функционал;
                ТабДок.Присоединить(Область);
                
         КонецЦикла;
            
    ТабДок.Присоединить(Макет.ПолучитьОбласть("Шапка|ПоследнийСтолбец"));
    
    ТабПользователей = Новый ТаблицаЗначений;
    ТабПользователей.Колонки.Добавить("Пользователь");
    Запрос = Новый Запрос;
    Запрос.Текст =  "ВЫБРАТЬ РАЗЛИЧНЫЕ
                    |    ku_ФункционалПользователя.Пользователь,
                    |    ku_ФункционалПользователя.Пользователь.ФизЛицо.Наименование КАК ПользовательФизЛицоНаименование
                    |ИЗ
                    |    РегистрСведений.ku_ФункционалПользователя КАК ku_ФункционалПользователя
                    |
                    |СГРУППИРОВАТЬ ПО
                    |    ku_ФункционалПользователя.Пользователь,
                    |    ku_ФункционалПользователя.Пользователь.ФизЛицо.Наименование
                    |
                    |УПОРЯДОЧИТЬ ПО
                    |    ПользовательФизЛицоНаименование Возр" ;
    
    РезультатПользователь = Запрос.Выполнить().Выгрузить();
    
    Для Каждого Пользователь Из РезультатПользователь Цикл
        НоваяСтрока = ТабПользователей.Добавить();
        НоваяСтрока.Пользователь = Пользователь;
    КонецЦикла;
        ТабПользователей.Сортировать("Пользователь Возр");    
        
       Для Каждого СтрокаТЗ из ТабПользователей Цикл
           Пользователь = СтрокаТЗ.Пользователь;
           Область = Макет.ПолучитьОбласть("Строка|ПервыйСтолбец");
           Область.Параметры.Пользователь = Пользователь.Пользователь;
           ТабДок.Вывести(Область);
           инд = 0;        
          
           Для Каждого Пользователи из РезультатПользователь Цикл
                Область = Макет.ПолучитьОбласть("Строка|Столбец");
            //???
                Значение = СодержитЛиФункц(Пользователь.Пользователь,РезультатФункционал[инд]);   // Ошибка  Индекс находится за границами массива
                инд = инд + 1;
                Область.Параметры.Функционал = Значение;
                ТабДок.Присоединить(Область);
            КонецЦикла;
                       ТабДок.Присоединить(Макет.ПолучитьОбласть("Строка|ПоследнийСтолбец"));
КонецЦикла;
    
КонецПроцедуры

Функция СодержитЛиФункц(Пользователь,РезультатФункционал)
    Запрос = Новый Запрос;
    Запрос.Текст =
            "ВЫБРАТЬ
            |    ku_ФункционалПользователя.Наименование,
            |    ku_ФункционалПользователя.Пользователь.ФизЛицо.Наименование КАК ПользовательФизЛицоНаименование
            |ИЗ
            |    РегистрСведений.ku_ФункционалПользователя КАК ku_ФункционалПользователя
            |ГДЕ
            |    ku_ФункционалПользователя.Пользователь = &Пользователь
            |    И ku_ФункционалПользователя.Наименование = &Наименование
            |
            |УПОРЯДОЧИТЬ ПО
            |    ПользовательФизЛицоНаименование Возр";
            
    Запрос.УстановитьПараметр("Пользователь",Пользователь);
    Запрос.УстановитьПараметр("Наименование",РезультатФункционал.Функционал);

    Результат = Запрос.Выполнить().Выбрать();
    Флаг = ложь;
    
    Если Результат.Количество()>0 тогда
        Флаг=Истина;
    КонецЕсли;
    
    Возврат Флаг;
КонецФункции
1 ДенисЧ
 
30.07.13
09:39
Кто угадает, в каком месте ошибка, тот получит приз! Так?
2 Maxus43
 
30.07.13
09:39
в ошибке вобще то пишется и в какой строке ошибка
3 SeraFim
 
30.07.13
09:39
количество строчек в "РезультатФункционал" меньше, чем количество строк в "РезультатПользователь"
Например в РезультатПользователь - 10 строк, а в РезультатФункционал - 5.
ты пытаешься обратиться к РезультатФункционал[9] - а его просто нету
4 SeraFim
 
30.07.13
09:40
(1) там отмечено комментарием, где ошибка))
5 SeraFim
 
30.07.13
09:41
ой, прелесть-то какая: запрос в цикле!
6 ДенисЧ
 
30.07.13
09:41
(4) Чо, я всю портянку читать долден?
7 Maxus43
 
30.07.13
09:42
(4) молодец, приз предоставит автор, как не самому ленивому)
8 Godofsin
 
30.07.13
09:42
(6) не долден, не долден )))
9 black_cat1305
 
30.07.13
09:42
тогда как мне можно обойти данную ошибку, так как в запросе РезультатПользователей может быть много пользователей, а во втором запросе РезультатФункционал меньше(((
11 black_cat1305
 
30.07.13
09:43
простите меня о великие люди 1С!!! Я только учусь
13 Godofsin
 
30.07.13
09:44
(0) А чо ты там отладчиком проверяла? Сравнивала РезультатФункционал.Количество() и инд?
14 black_cat1305
 
30.07.13
09:44
я так и знала что в ход пойдут камни
15 Godofsin
 
30.07.13
09:45
(11) Дааа.... вот это нам нравится ))))
16 Maxus43
 
30.07.13
09:45
(14) тут проблема не программирования, а логики. Ты же понимаешь причину? разное количество строк в коллекциях. Как её обойти - зависит от задачи, и простой логики
17 aka AMIGO
 
модератор
30.07.13
09:45
Гефест Starhan не отклоняйтесь от темы
18 Starhan
 
30.07.13
09:46
(14) У тебя в той строке где ошибка

Значение инд больше чем строчек в запросе - 1.
19 Starhan
 
30.07.13
09:46
(18) вывод плохо проверяла отладчиком.
20 Maxus43
 
30.07.13
09:47
в РегистрСведений.ku_ФункционалПользователя нет Пользователь?
21 black_cat1305
 
30.07.13
09:47
Это я уже поняла, что плохо проверяла, моя ошибка
22 Starhan
 
30.07.13
09:47
(18)чем строчек в таблице РезультатФункционал*
23 black_cat1305
 
30.07.13
09:48
в Регистре есть пользователь
24 Infsams654
 
30.07.13
09:48
(14) так в 1-м запросе в ТЗ надо бы еще пользователя выгрузить, а потом в том месте где ошибка искать в этом ТЗ нужного пользователя, т.к. [инд] никаким боком к нему не относится
25 black_cat1305
 
30.07.13
09:49
понятно, сейчас попробую сделать
26 Maxus43
 
30.07.13
09:50
(23) ну логично предположить что функционал надо проверять конкретного пользователя, а не всех.
СодержитЛиФункц( - зачем эта функция вобще, если уже есть список пользователей и их функционалов в одном регистре?

Или я плохо вижу, или все 3 запроса практически одинаковы, и вытащить всё можно одним
27 Godofsin
 
30.07.13
09:52
(26) +1
28 black_cat1305
 
30.07.13
09:53
я через эти запросы пытаюсь вывести отчет. Выгружаю всех пользователей и функционал и проставляю соответствующие галочки (в зависимости у пользователя какой функционал)
29 black_cat1305
 
30.07.13
09:54
поэтому запросы все почти одинаковы
30 black_cat1305
 
30.07.13
09:55
по вертикали у меня пользователи, а по горизонтали функционал
31 Maxus43
 
30.07.13
09:55
(28) я верю, но зачем 3 запроса?
Я вижу:
1. вытаскиваем функционал (игноря что там есть и пользователь)
2. тоже что и п.1 только по пользователям
3. у кажного пользователя из п.2 ПОРВЕРЯЮ есть ли функционал из п.1

Ну ты же и так знаешь уже у какого пользователя что есть.
32 Godofsin
 
30.07.13
09:56
(28) ЛевоеСоединение тебе помощь и проверка на НУЛЛ
33 Infsams654
 
30.07.13
09:56
(26)+1, (30) а у пользователя может быть несколько функционалов ?
34 black_cat1305
 
30.07.13
09:56
может быть очень много функционалов
35 Godofsin
 
30.07.13
09:57
"Функционал" в регистре сведений что из себя представляет?
36 Starhan
 
30.07.13
09:58
(31) видимо это она так пытается в отчете столбцы по функционалу вывести.
37 black_cat1305
 
30.07.13
09:59
я только новичок в этом(знаю что это не опровдание). Вы правы я пытаюсь вывести по функционалу столбцы
38 Infsams654
 
30.07.13
09:59
(34) так тогда бери всех пользователей одним запросом из РС вместе с функционалом и выводи. Если РС периодический, то на дату
39 black_cat1305
 
30.07.13
09:59
функционал - строка (наимнование профиля
)
40 Maxus43
 
30.07.13
10:00
(34) безразницы.
надо так наверно:
1. Вытащить список всех возможных функционалов.
2. вытащить список пользователей с ИХ функционалами
3. Столбцы выводишь по п.1, а по п.2 понимаешь что данный функционал есть, и ставишь в столбце крыжик.
Как то так наверно
41 black_cat1305
 
30.07.13
10:02
я все никак не соображу как мне сделать тогда 3. Столбцы выводишь по п.1, а по п.2 понимаешь что данный функционал есть, и ставишь в столбце крыжик.
42 black_cat1305
 
30.07.13
10:03
простите за мою тупость(((
43 Maxus43
 
30.07.13
10:24
ВсеФункционалы - Массив со всеми возможными. не повторяющимися
ВсеПользователи - массив со всеми порльзователями, не повторяющимися
ТаблицаЮзеров - запрос в регистру по полям Юзер и функционал.

Далее
Цикл1 - по ВсеПользователи, выводишь строку с юзером
цикл2 - по ВсеФункционалы, выводишь столбец с функционалом.
внутри цикла2
Отбор = НовыйСтруктура("Пользователь, Функционал", Юзер, Функционал);
Рез = ТаблицаЮзеров.НайтиСтроки(Отбор);
Если Рез.Количество()>0 ТОгда

этот функционал есть у юзера. Ставь крыжик, иначе нету
44 Infsams654
 
30.07.13
10:27
(41) ну наверное, надо сначала определить сколько возможных функционалов может быть, из запроса, построить из макета строку без вывода
ТабДок.Присоединить(
а затем заполнять копированием этой строки в макет с соответствующими галочками
45 black_cat1305
 
30.07.13
10:35
спасибо вам большое всем!!!
46 Maxus43
 
30.07.13
10:42
>>ну наверное, надо сначала определить сколько возможных функционалов может быть

>>ВсеФункционалы - Массив со всеми возможными. не повторяющимися
Закон Брукера: Даже маленькая практика стоит большой теории.