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

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем KatrineKA, 20 фев 2012.

  1. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Есть внешняя печ. форма "Сводная справка о стоимости НЗП" в документе "Инвентаризация НЗП".
    При формировании в определенном документе выдает сообщение
    "Индекс находится за границами массива НовСтр.С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. Максим
    Offline

    Максим Опытный в 1С

    Регистрация:
    28 фев 2008
    Сообщения:
    684
    Симпатии:
    7
    Баллы:
    29
  3. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Могу ошибаться, но думаю, что у Вас МассивСуммС01001 пустой. Поэтому выражение МассивСуммС01001[Ин] выдает ошибку.
    Попробуйте перед этим вставить проверку массива на пустоту

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

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Не помогает, вроде как массив не равен нулю заход в условие, но ошибку выдает все равно
  5. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    видимо дело в самом массиве МассивСуммС01001, просто пока Ин=0 проходит, а когда Ин наростили то МассивСуммС01001[Ин] выходит за пределы.
  6. uza
    Offline

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

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

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

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Да, так и есть...

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

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

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Тут с ходу то и не скажешь. Смотря что вам нужно. Под это и писать код.
    Либо используя сумы всего, что лежит в этом массиве, либо отрабатывае только N первый строк массива.
    Или:
    а) все собрать в сумму
    б) возвести в квадрат
    в) преобразовать в строку
    г) все "3" из строки заменить на "2"
    д) Преобразовать обратно к числу.
    е) Помножить на Рандом(0, 500)
    ж) Взять первый символ после запятой и вернуть в качестве результата
    :)
  9. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
  10. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Я все равно не понимаю, почему они разные. Просто это все возникает только на определенной номенклатуре, при каких-то условиях.
  11. uza
    Offline

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

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

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

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Спасибо.
  13. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Все еще не победила эту форму. Нужна помощь.
  14. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Чет смотрю и понять не могу: а из чего вы делаете однозначный вывод о том, что размерность массивов МассивСуммС01001, МассивСуммС01006, МассивСуммС02000, МассивСуммС03000 совпадает с количеством найденных строк в СтрокиБаза? Чет мне однозначного соответствия по количеству элементов увидеть не удается.
  15. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    у меня пока неоднозначный вывод, по этому поводу, просто других вариантов не вижу (не понимаю). И вообще закрадывается сомнение, что эта ошибка возникает на определенной номенклатуре - но тож не факт.
  16. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    KatrineKA, ну так берите отладчик и смотрите что у вас в МассивСуммС01001 и СтрокиБаза при возникновении ошибки.
  17. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    ну, я смотрю.

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

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Сколько элементов в МассивСуммС01001? В отладчике смотрите.

    Если количество не совпадает, поднимайтесь по коду выше, и смотрите как этот массив получается (на основании каких данных).
  19. TopicStarter Overlay
    KatrineKA
    Offline

    KatrineKA Опытный в 1С

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

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

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    KatrineKA, возможно я конечно ошибаюсь, поскольку не знаю логику работы, но есть предположение что хрень у вас на выходе получится: у вас в итоговую таблицу попадут не все записи из таблицы СтрокиБаза.
    Это значится раз.
    И два: вы уверены, что порядок элементов в СтрокиБаза и порядок полученных значений в МассивСуммС01001, МассивСуммС01006, МассивСуммС02000 совпадают? Другими словами: вы уверены что 1 строка из СтрокиБаза соответствует первой строке в МассивСуммС01001, и скажем третья строка в СтрокиБаза также соответствует 3-му значению в МассивСуммС01001?

Поделиться этой страницей