|
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) ок, сорри, недоглядел
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |