Имя: Пароль:
1C
1С v8
Индекс находится за границами массива
0 amadeus2010
 
16.05.12
12:35
Добрый день есть файл ексель с колонкой День посещения и числовым значением от 1 до 7 (дни недели).Загружаю этот файл в 1С документ.Вот этот код:
     

DAY = ?(ЕстьНеЦифрыВСтроке(СокрЛП(Лист.Cells(ПоСтрокам,4).Value)) , 0, Число(СокрЛП(Лист.Cells(ПоСтрокам,4).Value)));
       
Если DAY=0  Тогда
               Строка.ДеньПосещения=Перечисления.ДниПосещения.ПустаяСсылка();
               Иначе    
               Строка.ДеньПосещения=Перечисления.ДниПосещения[DAY-1];
               КонецЕсли;


Интереса ради ввел например число 24,потому что пользователь также может ввести любое число.Естественно программа выдала такую ошибку:

{Документ.К_ЗакреплениеКлиентов.Форма.ФормаДокумента(285)}: Индекс находится за границами массива
               Строка.ДеньПосещения=Перечисления.ДниПосещения[DAY-1];

Как можно обойти такую ошибку.
1 Error pro
 
16.05.12
12:36
(0) Посмотреть Перечисления.ДниПосещения, явно там не все заполнено
2 Mort
 
16.05.12
12:38
Мда...
3 del123
 
16.05.12
12:38
если DAY < 6 тогда по рукам пользователю)
4 Галахад
 
гуру
16.05.12
12:38
?(day > 7, 0, day)
5 del123
 
16.05.12
12:38
(3) ой >
6 Fish
 
16.05.12
12:39
(0) Подумать головой и написать правильно условие :))
7 cViper
 
16.05.12
12:40
try{
}catch(ArrayIndexOutOfBoundsException ex){
}
8 cViper
 
16.05.12
12:41
Отлавливай и сообщай об ошибке пользователя.
9 amadeus2010
 
16.05.12
12:45
В принципе можно использовать такую конструкцию

DAY = ?(ЕстьНеЦифрыВСтроке(СокрЛП(Лист.Cells(ПоСтрокам,4).Value)) , 0, Число(СокрЛП(Лист.Cells(ПоСтрокам,4).Value)));
       
           Если DAY=0  Тогда
               Строка.ДеньПосещения=Перечисления.ДниПосещения.ПустаяСсылка();
               Иначе    
               Попытка    
               Строка.ДеньПосещения=Перечисления.ДниПосещения[DAY-1];
               Исключение Предупреждение("Указан неправильный день недели!" )
КонецПопытки;
               КонецЕсли;
10 Mort
 
16.05.12
13:00
Т.е. когда 0 все пучком, а когда 24 неправильный день недели? Это раз.
А два - использовать тут исключение, это, простите, ПЦ.
11 amadeus2010
 
16.05.12
14:55
я так думаю можно сделать Если DAY>0 Тогда...
Кстаи вопрос по ходу дела.Как можно в обработке проведения проверить заполнено поле табличного документа или нет.Если не заполнено то выдать сообщение о ошибке. Я пытался в коде сделать следующее.Написал в модуле формы Ошибка=0 как переменная

НачальнаяСтрока=2;
   Ошибка=0;

   Для ПоСтрокам = НачальнаяСтрока По КоличествоИспользуемыхСтрок +1 Цикл
   //    Индикатор    = ПоСтрокам/КоличествоИспользуемыхСтрок*100;
   //        
       Если Лист.Cells(ПоСтрокам,2).Value = Неопределено Тогда
           Продолжить;
       КонецЕсли;
               
       Строка                = Контрагенты.Добавить();
       Строка.Контрагент= ОбщегоНазначения.ПолучитьКонтрагентаПоКодуОракл(формат(Число(ВРег(СокрЛП(Лист.Cells(ПоСтрокам,1).Value))), "ЧГ=0"));
       Если  ПустаяСтрока(Строка.Контрагент) Тогда
             Предупреждение("Заполните поле Контрагент "+Строка.Контрагент+" В строке "+(ПоСтрокам-1));
             КонецЕсли;
           
       Строка.Ордтейкер = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(ВРег(СокрЛП(Лист.Cells(ПоСтрокам,2).Value)));
       Если ПустаяСтрока(Строка.Ордтейкер) Тогда
            Предупреждение("Укажите имя и фамилию ордертейкера "+Строка.Ордтейкер+" В строке "+(ПоСтрокам-1));
            Строка.Ордтейкер=Справочники.СотрудникиОрганизаций.ПустаяСсылка();
       КонецЕсли;

           
       
       Строка.Департамент = Справочники.Подразделения.НайтиПоНаименованию(СокрЛП(Лист.Cells(ПоСтрокам,3).Value));
       Если Строка.Департамент.Родитель.Наименование<>"Коммерческий департамент"  Тогда
               Предупреждение("Укажите правильный департамент "+Строка.Департамент+" В строке "+(ПоСтрокам-1));
               Строка.Департамент=Справочники.Подразделения.ПустаяСсылка();                              
            КонецЕсли;
           
       DAY = ?(ЕстьНеЦифрыВСтроке(СокрЛП(Лист.Cells(ПоСтрокам,4).Value)) , 0, Число(СокрЛП(Лист.Cells(ПоСтрокам,4).Value)));
       
           Если DAY=0  Тогда
               Строка.ДеньПосещения=Перечисления.ДниПосещения.ПустаяСсылка();
               Иначе    
               Попытка    
               Строка.ДеньПосещения=Перечисления.ДниПосещения[DAY-1];
           Исключение Предупреждение("Указан неправильный день недели!" );
               КонецПопытки;
               КонецЕсли;
           //Если ПустаяСтрока(Строка.ДеньПосещения) Тогда
           //    Предупреждение("Не заполнено поле Дни посещения! "+Строка.ДеньПосещения+" В строке "+(ПоСтрокам-1));
           //    
           //КонецЕсли;

       
       ОбработкаПрерыванияПользователя();
   КонецЦикла;

и в Обработка проведения

Если Ордтейкер=0 тогда
       Предупреждение("Не заполнено поле Ордтейкер!");
       Отказ=Истина;
       КонецЕсли;
       
       Если Департамент=0 Тогда
           Предупреждение("Не заполнено поле Департамент!");
           Отказ=Истина;
       КонецЕсли;

как уже можно догадаться документ проводиться без проверки на поставленные условия
12 cViper
 
16.05.12
15:11
(11)Может просто Ордтейкер!=0
13 cViper
 
16.05.12
15:19
Думаю что ордертейкер переводится как  продавец.
14 amadeus2010
 
16.05.12
16:02
в модуле документа вместо (11) поставил

           
       Строка.Ордтейкер = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(ВРег(СокрЛП(Лист.Cells(ПоСтрокам,2).Value)));
       Если ПустаяСтрока(Строка.Ордтейкер) Тогда
            Предупреждение("Укажите имя и фамилию ордертейкера "+Строка.Ордтейкер+" В строке "+(ПоСтрокам-1));
            Строка.Ордтейкер=Справочники.СотрудникиОрганизаций.ПустаяСсылка();
             Отказ=Истина;
       КонецЕсли;

и обработке проведения:

Если Отказ тогда
       Предупреждение("Не заполнены необходимые данные,документ не будет проведен!");
       
       КонецЕсли;
документ все равно проводится даже если есть незаполненные поля.Есть какая стандартная процедура проверки на незаполненные поля в табличной части документа и отказ в проведении если условие не выполняется? Что наподобие
Если Строка.Ордтейкер.Пустая() тогда Предупреждение("Не заполнены необходимые данные,документ не будет проведен!"); Отказ=Истина; Возврат; КонецЕсли;
15 hhhh
 
16.05.12
16:13
а в какой процедуре находится это

Отказ = Истина; ?
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой