Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Индекс не входит в границы списка значений, хотя должен

v7: Индекс не входит в границы списка значений, хотя должен
Я
   NDIS HH
 
22.01.13 - 03:55
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
    РазмСпПодчШК = СписокШтрихкодов.РазмерСписка();
    Если Не (РазмСпПодчШК > 1) Тогда
    Продолжить;
    КонецЕсли; 
    Для Сч1 = 1 по РазмСпПодчШК Цикл
        ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(Сч1);
    КонецЦикла;
КонецЦикла;

СписокТоваров - 3000 элементов. На 3000 циклов 2 раза: "ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(Сч1) - Индекс не входит в границы списка значений". Как найти ошибку? Как сделать остановку отладчика по ошибке?
Что происходит в момент такой ошибки? - то же что при Продолжить?
 
 
   rphosts
 
1 - 22.01.13 - 04:21
точно нет ошибки в написании переменной РазмСпПодчШК ?
   Злопчинский
 
2 - 22.01.13 - 04:27
Перепишем по-человечески
.
Пока СписокТоваров.ПолучитьСтроку() = 1
Цикл
    РазмСпПодчШК = СписокШтрихкодов.РазмерСписка();
    Если РазмСпПодчШК <= 1
    Тогда
       Продолжить;
    КонецЕсли; 

    Для Сч1 = 1 по РазмСпПодчШК
    Цикл
        ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(Сч1);
    КонецЦикла;
КонецЦикла;
.
Возникает вопрос: что имел в виду автор, оформялля внешний цикл, если "позиция" внешнего цикла нигде внутри цикла не используется...? или я что-то не понял..?
   Злопчинский
 
3 - 22.01.13 - 04:28
странно... размер списка = 1, почему-то не обрабатывается...
чем список с одним элементом отличается от списка с ЭН элементами..? ну да ладно - может для ЭН=1 список вообще отсутсвует...
   Злопчинский
 
4 - 22.01.13 - 04:31
все очень просто - возможно (..что имел в виду автор, оформляя..) что СписокШтрихкодов - получен до внешнего цикла один раз... и успешно прошел внутри 2998 раз, а 2 раза вывалился.. потому что список СписокШтрихкодов нигде не меняется в соотв. с внешним циклом...?
   Злопчинский
 
5 - 22.01.13 - 04:31
а может я хрень пишу... утро уже...
   rphosts
 
6 - 22.01.13 - 04:40
(5) да в обоих случаях, если в списке всего 1 элемент - код из (2) не отраотает...
возможно между
   РазмСпПодчШК = СписокШтрихкодов.РазмерСписка();

и

    Для Сч1 = 1 по РазмСпПодчШК Цикл
        ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(Сч1);
    КонецЦикла;

стоит ещё код который модифицирует или список или pyfxtybt переменной РазмСпПодчШК


ТС, будь мужиком! Или сделай контрольный вывод перед снутренним циклом:
Сообщить("РазмСпПодчШК="+РазмСпПодчШК+";  СписокШтрихкодов.РазмерСписка()="+СписокШтрихкодов.РазмерСписка());

или посмотри на них в отладчике
   rphosts
 
7 - 22.01.13 - 04:40
pyfxtybt  = значение
   cw014
 
8 - 22.01.13 - 07:27
ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(Сч1-1);

Ибо ты количество перебираешь, а получение идет по индексу (то есть первый элемент = 0)
   NDIS HH
 
9 - 22.01.13 - 07:38
(8) ПолучитьЗначение() первый параметр - номер позиции в списке. Изменяется от 1 до РазмерСписка().
То есть проблема не в этом.
   NDIS HH
 
10 - 22.01.13 - 07:39
(8)
ПолучитьЗначение(<?>,)
Синтаксис:
ПолучитьЗначение(<Позиция>,<Строка>)
Назначение:
Получить значение из указанной позиции списка.
Возвращает значение из списка.
Параметры:
<Позиция> - номер позиции в списке, из которой возвращается значение (изменяется от 1 до РазмерСписка);
 
 Рекламное место пустует
   NDIS HH
 
11 - 22.01.13 - 07:44
(6) rphost, вы глубоко правы. Щас буду разбираться по вашей методике. =)
Я пробовал
Если Сч1 > РазмСпПодчШК Тогда
    Сообщить("чего-нибудь");
И вот когда это условие не отработало а ошибка осталась - я запаниковал.
   AntiBuh
 
12 - 22.01.13 - 07:50
кстати
а РазмСпПодчШК не равен 0?
   cw014
 
13 - 22.01.13 - 07:51
(9) А вы попробуйте. Если не отработает - значит не судьба
   NDIS HH
 
14 - 22.01.13 - 08:15
(12)
Если Не (РазмСпПодчШК > 1) Тогда
    Продолжить;
Не может быть меньше 2.
   1Сергей
 
15 - 22.01.13 - 08:16
(14) не может быть больше одного ващето :)
   cw014
 
16 - 22.01.13 - 09:27
(15) +1
   PALESIA
 
17 - 22.01.13 - 18:45
(0) Ниже приведен "более скоростной" аналог твоего кода, вот только на кой он такой нужен - ХЗ:

КолШтрихкодов = СписокШтрихкодов.РазмерСписка();
Если КолШтрихкодов > 1 Тогда
    ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(КолШтрихкодов);
КонецЕсли;

Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
   // от тута че-то пропущено
 
КонецЦикла;
   NDIS HH
 
18 - 23.01.13 - 18:10
(15) (16) 
Если переменная РазмСпПодчШК < 2, то фрагмент на котором возникает ошибка вообще не отрабатывается - вместо этого начинается следующее повторение цикла. (0) 

А моя проблема была в следующем
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
        Для Сч1 = 1 по РазмСпРезЗап Цикл
            ДопШтрихкод = РезультатыЗапроса.ПолучитьЗначение(Сч1, КодДляСравнения);
            Если КодДляСравнения = Спр.Код Тогда
                СписокШтрихкодов.ДобавитьЗначение(ДопШтрихкод);
                РазмСпПодчШК = СписокШтрихкодов.РазмерСписка();
                Если РазмСпПодчШК = 5 Тогда
                    Прервать;
                КонецЕсли;    
            КонецЕсли;
        КонецЦикла;
        
        Если Не (РазмСпПодчШК > 1) Тогда
            СписокШтрихкодов.УдалитьВсе();
            Продолжить;
        КонецЕсли;    
    
        Для Сч1 = 1 по РазмСпПодчШК Цикл
            ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(Сч1);    
        КонецЦикла;
        СписокШтрихкодов.УдалитьВсе();
КонецЦикла;
Переменная РазмСпПодчШК изменяется только если выполнено условие, но размер СписокШтрихкодов изменяется вне зависимости от условий на каждом витке.
Таким образом если на текущем витке условие ни разу не сработало - то значение РазмСпПодчШК осталось от предыдущего витка. Сам себя премудрил - постеснялся выкладывать всю процедуру.
   NDIS HH
 
19 - 23.01.13 - 18:14
(Вообще это "доработка" обработки выгрузки в фронт-офис  Штрих-М, с целью выгрузки не одного, а всех штрих-кодов подчиненных элементу номенклатуры.)
   Злопчинский
 
20 - 23.01.13 - 21:11
товарищ  NDIS HH!
ты понимаешь что включать какой-то код внутрь цикла и в этом коде никак не использовать данные самого цикла - это как-то сомнительно?
.
тебе понятно, что в твоем коде в (18) можно безо всякого ущерба выкинуть последнюю и первую строки - и от этого результат исполнения кода практически никак не измениятся - он выполнится всего один раз, вместо того, чтобы СОВЕРШЕННО ОДИНАКОВО выполниться N раз..?
.
или я чего-то не понимаю?
   NDIS HH
 
21 - 23.01.13 - 22:02
Злопчинский,  (18) это же отрывок.
Функция ЗагрузитьТовары(Объект, НомСекции, НомерККМ, КаталогОбмена, СписокТоваров)

    ФайлЗагрузки    = СоздатьОбъект("Текст");
    Спр = СоздатьОбъект("Справочник.Номенклатура");
   // сформируем шапку
 
    ФайлЗагрузки.ДобавитьСтроку("##@@&&");   // строка инициализации
 
    ФайлЗагрузки.ДобавитьСтроку("#");       // признак загрузки
 
    
    Спр.ПорядокНаименований();
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если (Спр.ЭтоГруппа() = 1) И (Спр.СекцияККМ <> "0") Тогда
            ФайлЗагрузки.ДобавитьСтроку(
            Строка(Спр.Код) + ";" +
            "0;"+
            Лев(СокрЛП(СтрЗаменить(Спр.Наименование,";"," ")),100)+";"+
            Лев(СокрЛП(СтрЗаменить(Спр.Наименование,";"," ")),100)+";"+
            "0;"+
            "0;"+
            "0;"+
            "0;"+
            "0;"+
            "0;"+
            "0;"+
            "0;"+
            "0;"+
            "1;"+
            "0;"+
            ?(Спр.Родитель.Выбран()=0, "0", СокрЛП(Спр.Родитель.Код)) + ";" +
            "0;"+
            СокрЛП(Спр.Уровень()) + ";" +
            "1"
            );
        КонецЕсли;
    КонецЦикла;
    
    РезультатыЗапроса = СоздатьОбъект("СписокЗначений");
    СписокШтрихкодов = СоздатьОбъект("СписокЗначений");
    КодДляСравнения = "КодДляСравнения";
    Запрос = СоздатьОбъект("Запрос");  
    ТекстЗапроса = "
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |ШтрихКод = Справочник.Единицы.ШтрихКод;
    |Код = Справочник.Единицы.Владелец.Код;
    |Группировка ШтрихКод без групп все ВошедшиеВЗапрос;
    |";
    
    Запрос.Выполнить(ТекстЗапроса);
    Пока Запрос.Группировка() = 1 Цикл
          РезультатыЗапроса.ДобавитьЗначение(Строка(Запрос.ШтрихКод), Строка(Запрос.Код));
    КонецЦикла;
    РазмСпРезЗап = РезультатыЗапроса.РазмерСписка();
    Состояние("Выполняется добавление строк в файл выгрузки. Подождите...");
    Сообщить(РезультатыЗапроса.РазмерСписка());
    СписокТоваров.ВыбратьСтроки();
    Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
        Если (Спр.НайтиПоКоду(СписокТоваров.Код, 0) = 0) или (Спр.ПометкаУдаления() = 1)
        или (Спр.ЭтоГруппа() = 1) или (Спр.Родитель.СекцияККМ = "0")  Тогда
            Продолжить;
        КонецЕсли;
        ФайлЗагрузки.ДобавитьСтроку(
        СписокТоваров.Код + ";" +                                    // 1 - код товара
 
        СписокТоваров.ШтрихКод + ";" +                                // 2 - штрихкод товара
 
        СтрЗаменить(Спр.Наименование,";"," ") + ";" +               // 3 - наименование
 
        СтрЗаменить(Спр.Наименование,";"," ") + ";" +               // 4 - наименование для кассы
 
        СокрЛП(Формат(СписокТоваров.Цена, "Ч15.2")) + ";" +         // 5 - цена
 
        СокрЛП(Формат(СписокТоваров.Количество, "Ч10.3")) + ";" +   // 6 - количество
 
        "0;" +                                                       // 7 - код схемы скидок
 
        Спр.Весовой + ";" +                                         // 8 - разрешить продажу дробного количества
 
        ?(ПустоеЗначение(Спр.Родитель) = 1, "1", Спр.Родитель.СекцияККМ) + ";" + // 9 - секция ККМ
 
        "0;" +                                                      // 10 - макс. процент скидки
 
        "0;" +                                                      // 11 - код налоговой схемы
 
        СокрЛП(Спр.Артикул) + ";" +                                 // 12 - артикул
 
        ";" +                                                       // 13 - не используется
 
        ";" +                                                       // 14 - не используется
 
        ";" +                                                       // 15 - не используется
 
        ?(Спр.Родитель.Выбран() = 0, "0", Спр.Родитель.Код) + ";" + // 16 - код родительской группы
 
        "1;" +                                                      // 17 - это не группа
 
        СокрЛП(Спр.Уровень()) + ";" +                               // 18
 
        "1"                                                         // 19
 
        ); 
        
        Если СписокТоваров.Наименование = "РК КЭТ ЯНГ МЭЙЛ пауч д/котов 0,1кг" Тогда
            Сообщить("123");
        КонецЕсли;
        
        
        Для Сч1 = 1 по РазмСпРезЗап Цикл
            ДопШтрихкод = РезультатыЗапроса.ПолучитьЗначение(Сч1, КодДляСравнения);
            Если КодДляСравнения = Спр.Код Тогда
                СписокШтрихкодов.ДобавитьЗначение(ДопШтрихкод);
                РазмСпПодчШК = СписокШтрихкодов.РазмерСписка();
                Если РазмСпПодчШК = 5 Тогда
                    Прервать;
                КонецЕсли;    
            КонецЕсли;
        КонецЦикла;
        
        Если РазмСпПодчШК < 2 Тогда
            СписокШтрихкодов.УдалитьВсе();
            Продолжить;
        КонецЕсли;    
        Для Сч1 = 1 по РазмСпПодчШК Цикл
            Сообщить(СписокТоваров.Наименование + "; СписокШтрихкодов.РазмерСписка=" + СписокШтрихкодов.РазмерСписка() + "; РазмСпПодчШК=" + РазмСпПодчШК);
            ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(Сч1);
            Если ДопШтрихкод <> СписокТоваров.ШтрихКод Тогда
                ФайлЗагрузки.ДобавитьСтроку(
                "# " +                                                  // 0 - доп.единица
 
                Спр.Код + ";" +                                         // 1 - код товара
 
                ДопШтрихКод + ";" +                                     // 2 - штрихкод товара
 
                СтрЗаменить(Спр.Наименование, ";", " ") + ";" +         // 3 - наименование
 
                СтрЗаменить(Спр.Наименование, ";", " ") + ";" +         // 4 - наименование для кассы
 
                СокрЛП(Формат(СписокТоваров.Цена, "Ч15.2")) + ";" +     // 5 - цена
 
                ";" +                                                   // 6 - не исрользуется
 
                ";" +                                                   // 7 - не исрользуется
 
                ";" +                                                   // 8 - не исрользуется
 
                ";" +                                                   // 9 - не исрользуется
 
                "1.000"                                                 // 10 - коэффициент
 
                );   
            КонецЕсли;
        КонецЦикла;
        СписокШтрихкодов.УдалитьВсе();
    КонецЦикла;
    ФайлЗагрузки.ДобавитьСтроку("$$$CLR");
    Попытка
        ФайлЗагрузки.Записать(КаталогОбмена + мИмяФайлаТоваров);
    Исключение
        ОписаниеРезультата = ОписаниеОшибки();
        Сообщить(ОписаниеРезультата);
        Возврат 0;
    КонецПопытки;
    
    Попытка
        ФайлФлага = СоздатьОбъект("Текст");
        ФайлФлага.Записать(КаталогОбмена + мФлагТоваров);
    Исключение
        ОписаниеРезультата = ОписаниеОшибки();
        Сообщить(ОписаниеРезультата);
        Возврат 0;
    КонецПопытки;
    
    Возврат 1;
КонецФункции
   Torquader
 
22 - 24.01.13 - 01:34
В УТ-шке я эту "кучу" копал, но там было интереснее, если штрих-код один, то получали значение, если несколько - то список.
Соответственно, выгружались и штрих-коды и единицы.
Но засада там в том, что если действительно есть единицы с другим количеством, то нужно их штрих-коды не перепутать - иначе потом "умная" программа запрашивает выбор из одинаковых штрих-кодов.
P.S. а самое интересное там начинается с весовыми штрих-кодами, когда нужно выгрузить данные в весы и терминал, чтобы они друг-друга понимали.
   Злопчинский
 
23 - 24.01.13 - 03:34
(21) это тебя не спасает
.
от строчки заголовка цикла
.
//
 
    Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
 //
 
.
до блока кода внутри этого цикла
.
//
 
        Для Сч1 = 1 по РазмСпРезЗап Цикл
            ДопШтрихкод = РезультатыЗапроса.ПолучитьЗначение(Сч1, КодДляСравнения);
            Если КодДляСравнения = Спр.Код Тогда
                СписокШтрихкодов.ДобавитьЗначение(ДопШтрихкод);
                РазмСпПодчШК = СписокШтрихкодов.РазмерСписка();
                Если РазмСпПодчШК = 5 Тогда
                    Прервать;
                КонецЕсли;    
            КонецЕсли;
        КонецЦикла;
 //
 
.
нет ни одного определения переменных этого блока в связи с переменной/заголовком цикла... этот код может быть безболезненно вынесен наверх, перед заголовком цикла
   Злопчинский
 
24 - 24.01.13 - 03:37
у меня стойкая уверенность что требуемую задачу при тех исходных данных которе есть в параметрах процедуры у ТС - можно решить гораздо проще по коду...
   NDIS HH
 
25 - 24.01.13 - 08:15
Злопчинский,
>нет ни одного определения переменных этого блока в связи с переменной/заголовком цикла...
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
        Если (Спр.НайтиПоКоду(СписокТоваров.Код, 0) = 0) или (Спр.ПометкаУдаления() = 1)
        или (Спр.ЭтоГруппа() = 1) или (Спр.Родитель.СекцияККМ = "0")  Тогда
            Продолжить;
        КонецЕсли;
        ФайлЗагрузки.ДобавитьСтроку(
        СписокТоваров.Код + ";" +

Таким образом Спр.НайтиПоКоду(СписокТоваров.Код, 0) определяет текущий элемент справочника Номенклатура, чтобы можно было получить отсутствующие в таблице значений СписокТоваров реквизиты. Вы об этом?

Что касается оптимизации, то я додумался только сделать все подчиненные товару штрих-коды реквизитами справочника Номенклатура. Вполне допускаю возможность более изящного решения - у меня пока мало опыта.
   NDIS HH
 
26 - 24.01.13 - 08:21
(23)
Если КодДляСравнения = Спр.Код Тогда

Вот Спр.Код меняется на каждом витке "большого" цикла.

Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
    Если (Спр.НайтиПоКоду(СписокТоваров.Код, 0) = 0) или
   Злопчинский
 
27 - 24.01.13 - 16:18
(26) ок, сорри, недоглядел


Список тем форума
Рекламное место пустует  Рекламное место пустует
Закон Брукера: Даже маленькая практика стоит большой теории.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует