Перейти к содержимому


- - - - -

Помогите разобраться с массивом


Сообщений в теме: 21

#1 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 20 февраля 2012 - 06:47

Есть внешняя печ. форма "Сводная справка о стоимости НЗП" в документе "Инвентаризация НЗП".
При формировании в определенном документе выдает сообщение
"Индекс находится за границами массива НовСтр.С01001 = МассивСуммС01001[Ин];".
Вроде уже все в отладчике просмотрела, не могу понять где ошибка, помогите пожалуйста разобраться.

 Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВложенныйЗапрос.НоменклатурнаяГруппа,
| СУММА(ВложенныйЗапрос.С01001) КАК С01001,
| СУММА(ВложенныйЗапрос.С01006) КАК С01006,
...
|ИЗ
| (ВЫБРАТЬ
|  НезавершенноеПроизводствоБухгалтерскийУчетОстатки.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
|  ВЫБОР
|   КОГДА НезавершенноеПроизводствоБухгалтерскийУчетОстатки.СтатьяЗатрат В ИЕРАРХИИ (&СтатьиМатПокупные)
|	ТОГДА НезавершенноеПроизводствоБухгалтерскийУчетОстатки.СтоимостьОстаток
|   ИНАЧЕ 0
|  КОНЕЦ КАК С01001,
| ....
|";

Для Каждого Стр Из ТабЗатрат Цикл
  Если ТаблицаОпераций <> Неопределено Тогда
   СтрокиБаза = ТаблицаОпераций.НайтиСтроки(Новый Структура("НоменклатурнаяГруппа", Стр.НоменклатурнаяГруппа));
  Иначе
   СтрокиБаза = Неопределено;
  КонецЕсли;
  Если СтрокиБаза = Неопределено ИЛИ СтрокиБаза.Количество() = 0 Тогда
   Если ТабИзделий <> Неопределено Тогда
	СтрокиБаза = ТабИзделий.НайтиСтроки(Новый Структура("НоменклатурнаяГруппа", Стр.НоменклатурнаяГруппа));
	ПоказательБазы = "Количество";
   Иначе
	СтрокиБаза = Неопределено;
   КонецЕсли;
  Иначе
   ПоказательБазы = "Сумма";
  КонецЕсли;
  МассивКоэффициентов = Новый Массив;
  Если СтрокиБаза <> Неопределено Тогда
   Для Каждого Ст Из СтрокиБаза Цикл
	Если Ст[ПоказательБазы] <> 0 Тогда
	 МассивКоэффициентов.Добавить(Ст[ПоказательБазы]);
	КонецЕсли;
   КонецЦикла;
  КонецЕсли;

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

  МассивСуммС01001 = ОбщегоНазначения.РаспределитьПропорционально(Стр.С01001, МассивКоэффициентов, 2, Ложь);
  МассивСуммС01006 = ОбщегоНазначения.РаспределитьПропорционально(Стр.С01006, МассивКоэффициентов, 2, Ложь);
  МассивСуммС02000 = ОбщегоНазначения.РаспределитьПропорционально(Стр.С02000, МассивКоэффициентов, 2, Ложь);
  МассивСуммС03000 = ОбщегоНазначения.РаспределитьПропорционально(Стр.С03000, МассивКоэффициентов, 2, Ложь);
  ...

  Ин = 0;
  Для Каждого Ст Из СтрокиБаза Цикл
   НовСтр = ТабРезультат.Добавить();
   НовСтр.Номенклатура = Ст.Номенклатура;
   НовСтр.ХарактеристикаНоменклатуры = Ст.ХарактеристикаНоменклатуры;
   НовСтр.НоменклатурнаяГруппа = Стр.НоменклатурнаяГруппа;
   НовСтр.С01001 = МассивСуммС01001[Ин];
   НовСтр.С01006 = МассивСуммС01006[Ин];
   НовСтр.С02000 = МассивСуммС02000[Ин];
   НовСтр.С03000 = МассивСуммС03000[Ин];
   ....
   СтрКол = ТабИзделий.НайтиСтроки(Новый Структура("Номенклатура, ХарактеристикаНоменклатуры", Ст.Номенклатура, Ст.ХарактеристикаНоменклатуры));
   Если СтрКол.Количество() > 0 Тогда
	НовСтр.Количество = СтрКол[0].Количество;
	НовСтр.ЕдиницаИзмерения = СтрКол[0].ЕдиницаИзмерения;
   КонецЕсли;
  
   Ин = Ин + 1;
  КонецЦикла;
КонецЦикла;

Возврат ТабРезультат;



#2 Fart

    Активист


  • 377 сообщений

Отправлено 20 февраля 2012 - 07:03

,

Сообщение отредактировал Fart: 20 февраля 2012 - 07:06


#3 1cUserAndrew

    Ветеран


  • 2 692 сообщений

Отправлено 20 февраля 2012 - 07:16

Могу ошибаться, но думаю, что у Вас МассивСуммС01001 пустой. Поэтому выражение МассивСуммС01001[Ин] выдает ошибку.
Попробуйте перед этим вставить проверку массива на пустоту

Если МассивСуммС01001.Количество() = 0 Тогда  //или <>0 ... как там лучше-то...

Как приятно знать, что ты что-то узнал!

#4 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 20 февраля 2012 - 07:42

Не помогает, вроде как массив не равен нулю заход в условие, но ошибку выдает все равно

#5 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 20 февраля 2012 - 07:57

видимо дело в самом массиве МассивСуммС01001, просто пока Ин=0 проходит, а когда Ин наростили то МассивСуммС01001[Ин] выходит за пределы.

#6 uza

    1С, VBA (EXCEL), VB (.NET + WEB)


  • 1 338 сообщений

Отправлено 20 февраля 2012 - 08:00

А вы уверены, что вот тут
Для Каждого Ст Из СтрокиБаза Цикл
Размер СтрокиБаза совпадает с размером МассивСуммС03000 ???
А внутри этого цикла размер МассивСуммС03000 остается неизменным?
Строки не добавляются и не удаляются ли?

А так да, все логично. У вас МассивСуммС03000 состоит из 1го значения, а СтрокиБаза из 2,3 и более.
Первая итерация цикла работает, а вот вторая уже дает сбой.

Сообщение отредактировал uza: 20 февраля 2012 - 08:01

Не все полезно - что в БД залезло

#7 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 20 февраля 2012 - 08:15

Да, так и есть...

А как это исправить? Т.е. количество должно всегда совпадать? Нужно ставить условие, если количество разное? или не допускать разного количества?

#8 uza

    1С, VBA (EXCEL), VB (.NET + WEB)


  • 1 338 сообщений

Отправлено 20 февраля 2012 - 08:21

Тут с ходу то и не скажешь. Смотря что вам нужно. Под это и писать код.
Либо используя сумы всего, что лежит в этом массиве, либо отрабатывае только N первый строк массива.
Или:
а) все собрать в сумму
б) возвести в квадрат
в) преобразовать в строку
г) все "3" из строки заменить на "2"
д) Преобразовать обратно к числу.
е) Помножить на Рандом(0, 500)
ж) Взять первый символ после запятой и вернуть в качестве результата
:)
Не все полезно - что в БД залезло

#9 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 20 февраля 2012 - 08:25

:blink:

#10 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 20 февраля 2012 - 09:37

Я все равно не понимаю, почему они разные. Просто это все возникает только на определенной номенклатуре, при каких-то условиях.

#11 uza

    1С, VBA (EXCEL), VB (.NET + WEB)


  • 1 338 сообщений

Отправлено 20 февраля 2012 - 10:10

А вот я не понимаю почему эти массивы должны быть одинаковыми!
Поймите ДЛЯ ЧЕГО это (нечто вот это) делает программа. Отсюда поймете ЧТО делает программа, отсюда поймете ПОЧЕМУ это делает программа.
Отсюда вы поймете ЧТО НУЖНО СДЕЛАТЬ чтобы программа делала то, что вам нужно, но правок при этом было бы минимум.

Короче ОТЛАДЧИК и МОЗГ.
Мне же, например, парсить умозрительно Ваш код без бонуса - ну как то лениво, чтоли.
Не все полезно - что в БД залезло

#12 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 20 февраля 2012 - 10:41

Спасибо.

#13 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 21 февраля 2012 - 11:47

Все еще не победила эту форму. Нужна помощь.

#14 shurikvz

    Ветеран


  • 5 231 сообщений

Отправлено 21 февраля 2012 - 12:44

Чет смотрю и понять не могу: а из чего вы делаете однозначный вывод о том, что размерность массивов МассивСуммС01001, МассивСуммС01006, МассивСуммС02000, МассивСуммС03000 совпадает с количеством найденных строк в СтрокиБаза? Чет мне однозначного соответствия по количеству элементов увидеть не удается.
Now, this bell tolling softly for another, says to me: Thou must die...

#15 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 21 февраля 2012 - 12:58

у меня пока неоднозначный вывод, по этому поводу, просто других вариантов не вижу (не понимаю). И вообще закрадывается сомнение, что эта ошибка возникает на определенной номенклатуре - но тож не факт.

#16 shurikvz

    Ветеран


  • 5 231 сообщений

Отправлено 21 февраля 2012 - 13:02

KatrineKA, ну так берите отладчик и смотрите что у вас в МассивСуммС01001 и СтрокиБаза при возникновении ошибки.
Now, this bell tolling softly for another, says to me: Thou must die...

#17 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 21 февраля 2012 - 13:06

ну, я смотрю.

СтрокиБаза.Количество() = 3; Ин = 1; МассивСуммС01001 = Индекс находится за границами массива

#18 shurikvz

    Ветеран


  • 5 231 сообщений

Отправлено 21 февраля 2012 - 14:24

Сколько элементов в МассивСуммС01001? В отладчике смотрите.

Если количество не совпадает, поднимайтесь по коду выше, и смотрите как этот массив получается (на основании каких данных).
Now, this bell tolling softly for another, says to me: Thou must die...

#19 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 21 февраля 2012 - 14:40

да, все это уже просмотрела. В СтрокиБаза поподают 3 строки и две из них с нулевыми суммами, и при формировании МассиваКоэффициентов, остается только одна строка с суммой.
 МассивКоэффициентов = Новый Массив;
  Если СтрокиБаза <> Неопределено Тогда
   Для Каждого Ст Из СтрокиБаза Цикл
Если Ст[ПоказательБазы] <> 0 Тогда
  МассивКоэффициентов.Добавить(Ст[ПоказательБазы]);
КонецЕсли;
   КонецЦикла;
  КонецЕсли;

Решение проблемы:

 
....
Для Каждого Ст Из СтрокиБаза Цикл
// добавила
   Если Ст[ПоказательБазы] = 0 Тогда
    Продолжить;
   КонецЕсли;
// добавила
   НовСтр = ТабРезультат.Добавить();
   НовСтр.Номенклатура = Ст.Номенклатура;
   НовСтр.ХарактеристикаНоменклатуры = Ст.ХарактеристикаНоменклатуры;
   НовСтр.НоменклатурнаяГруппа = Стр.НоменклатурнаяГруппа;
   НовСтр.С01001 = МассивСуммС01001[Ин];
   НовСтр.С01006 = МассивСуммС01006[Ин];
   НовСтр.С02000 = МассивСуммС02000[Ин];
....


#20 shurikvz

    Ветеран


  • 5 231 сообщений

Отправлено 21 февраля 2012 - 14:49

KatrineKA, возможно я конечно ошибаюсь, поскольку не знаю логику работы, но есть предположение что хрень у вас на выходе получится: у вас в итоговую таблицу попадут не все записи из таблицы СтрокиБаза.
Это значится раз.
И два: вы уверены, что порядок элементов в СтрокиБаза и порядок полученных значений в МассивСуммС01001, МассивСуммС01006, МассивСуммС02000 совпадают? Другими словами: вы уверены что 1 строка из СтрокиБаза соответствует первой строке в МассивСуммС01001, и скажем третья строка в СтрокиБаза также соответствует 3-му значению в МассивСуммС01001?
Now, this bell tolling softly for another, says to me: Thou must die...

#21 KatrineKA

    Частый гость


  • 76 сообщений

Отправлено 21 февраля 2012 - 15:03

ну я в самом деле привела не весь пример кода, но по поводу попадания всех строк в таблицу, пока сомнени не возникало. Соответсвие тоже контролируется...

#22 shurikvz

    Ветеран


  • 5 231 сообщений

Отправлено 21 февраля 2012 - 15:12

Просмотр сообщенияKatrineKA (21 февраля 2012 - 15:03) писал:

ну я в самом деле привела не весь пример кода, но по поводу попадания всех строк в таблицу, пока сомнени не возникало.
Эм. Как так? Если у вас Ст[ПоказательБазы] = 0 то в ТабРезультат эта строка уже не попадет.
Now, this bell tolling softly for another, says to me: Thou must die...





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных