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

СписокТоваров - 3000 элементов. На 3000 циклов 2 раза: "ДопШтрихкод = СписокШтрихкодов.ПолучитьЗначение(Сч1) - Индекс не входит в границы списка значений". Как найти ошибку? Как сделать остановку отладчика по ошибке?
Что происходит в момент такой ошибки? - то же что при Продолжить?
1 rphosts
 
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
а может я хрень пишу... утро уже...
6 rphosts
 
22.01.13
04:40
(5) да в обоих случаях, если в списке всего 1 элемент - код из (2) не отраотает...
возможно между
  РазмСпПодчШК = СписокШтрихкодов.РазмерСписка();

и

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

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


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

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

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

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

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

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

Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
       Если (Спр.НайтиПоКоду(СписокТоваров.Код, 0) = 0) или (Спр.ПометкаУдаления() = 1)
       или (Спр.ЭтоГруппа() = 1) или (Спр.Родитель.СекцияККМ = "0")  Тогда
           Продолжить;
       КонецЕсли;
       ФайлЗагрузки.ДобавитьСтроку(
       СписокТоваров.Код + ";" +

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

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

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

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