admin / 02.06.2020

Индекс находится за границами массива 1С 8.х

Подобные ошибки можно увидеть при отладке программ практически на любом языке программирования или на СУБД, где фигурируют коллекции значений. В данном случае речь идет об индексе как о счетчике элементов, например, массива. Если в вашем коде используются подобные типы данных, то есть вероятность встретить ошибку и нужно уметь ее решить.

Рис.1 Индекс находится за пределами массива 1С 8.3. Системное сообщение.

Суть и решение проблемы

Чаще всего можно увидеть такое сообщение об ошибке, когда в коде идет обращение к элементу массива по индексу. И в том случае, если программист не предусмотрел проверку на количество элементов в коллекции, 1С будет получать значения. И рано или поздно наступит момент, когда в массиве элементы кончатся, а 1С продолжит пытаться получить значение. В этом случае и вылетит сообщение о том, что индекс элемента массива 1С находится за пределами.

Смотрите бесплатно
видеозаписи прошедших
мероприятий

Для разработчиков хорошо, что 1С при сообщении об ошибке позволяет просмотреть, на какой строке кода совершилось недопустимое действие. По кнопке «Подробно» вы получите информацию о том, какая команда отработала с ошибкой, где и на какой строке. Посмотрим на пример кода, который точно приведет к подобной ошибке:

МассивЗначений = Новый Массив; МассивЗначений.Добавить(«1»); МассивЗначений.Добавить(«2»); МассивЗначений.Добавить(«3»); Индекс = 0; Пока Индекс 3 цикл Сообщить(МассивЗначений); Индекс = Индекс + 1; КонецЦикла;

Здесь проблема заключается в том, что создается массив с тремя значениями. В цикле же перебираются 11 значений из массива, так как нумерация индексов элементов в коллекции начинается с 0. И данный код выведет пользователю только 3 значения, а на 4 – вызовет ошибку «Индекс за пределами массива 1С». Чтобы исправить это недоразумение, необходимо либо изменить цикл, либо добавить условие с проверкой количества элементов в массиве.

Следует отметить, что в массивах индексы играют важную роль. Помните, чтобы получить индекс массива 1С, достаточно узнать количество элементов специальным методом «Количество()» и вычесть 1. Используя их, можно добавлять значения в коллекцию, изменять их, получать значение конкретного элемента массива и удалять их.

Зная природу этой ошибки, можно сделать вывод о том, что необходимо быть очень осторожными при работе с коллекциями значений, особенно, если речь идет о типовых конфигурациях, где после небольшой правки неквалифицированным разработчиком может перестать работать абсолютно все.

  • Пользуйтесь услугами профессионалов;
  • Обязательно делайте резервные копии перед любым изменением;
  • Сделайте тестовую базу данных и тщательно проверяйте на ней все изменения.

Это три золотых правила, которые резко снизят количество подобных ошибок в конфигурации.

Конфигурация: Бухгалтерия 3.0 (3.0.23.7).Только вручную внесли остатки. При формировании Оборотно-сальдовой ведомости пишет ошибку «индекс находится за пределами массива». В отладчике останавливается на ОтчетОСВ-Модуль менеджера( на строке: ИмяПараметра = Строка(Ячейка.Элементы.Значение);).
Процедура ПередВыводомЭлементаРезультата(ПараметрыОтчета, МакетКомпоновки, ДанныеРасшифровки, ЭлементРезультата, Отказ = Ложь) Экспорт
// Отсекаем валютные группировки на счетах, по которым не ведется
// валютный учет
Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0
И ЭлементРезультата.ЗначенияПараметров.Найти(«П1») <> Неопределено
И ЗначениеЗаполнено(ЭлементРезультата.Макет)
И ПараметрыОтчета.ВременныеДанныеОтчета.МакетВалюта.Найти(ЭлементРезультата.Макет) <> Неопределено
И ЭлементРезультата.ЗначенияПараметров.П1.Значение = Null Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Если ПараметрыОтчета.ПоказательВалютнаяСумма
И ПараметрыОтчета.ВременныеДанныеОтчета.КоличествоПоказателей > 1 Тогда
КоличествоПоказателей = ПараметрыОтчета.ВременныеДанныеОтчета.КоличествоПоказателей — 1;
Иначе
КоличествоПоказателей = ПараметрыОтчета.ВременныеДанныеОтчета.КоличествоПоказателей;
КонецЕсли;
// Обрабатываем элементы, содержащие корневые счета
Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0
И ЭлементРезультата.ЗначенияПараметров.Найти(«П1») <> Неопределено
И ЗначениеЗаполнено(ЭлементРезультата.Макет)
И ПараметрыОтчета.ВременныеДанныеОтчета.МакетШапкиОтчета <> ЭлементРезультата.Макет
И ПараметрыОтчета.ВременныеДанныеОтчета.МакетПодвал <> ЭлементРезультата.Макет Тогда
//Накапливаем суммы по корневым счетам
Если ПараметрыОтчета.ВременныеДанныеОтчета.МакетСчет.Найти(ЭлементРезультата.Макет) <> Неопределено Тогда
ИдентификаторРасшифровки = ЭлементРезультата.ЗначенияПараметров.П2.Значение;
ЗначениеСчет = ДанныеРасшифровки.Элементы.ПолучитьПоля().Значение;
Если Не ЗначениеЗаполнено(ЗначениеСчет.Родитель) И Не ЗначениеСчет.Забалансовый Тогда
Для Индекс = 0 По КоличествоПоказателей — 1 Цикл
Для ПодИндекс = 1 По 6 Цикл
СтрокаМакета = МакетКомпоновки.Макеты.Макет;
Ячейка = СтрокаМакета.Ячейки;
ИмяПараметра = Строка(Ячейка.Элементы.Значение);
Значение = ЭлементРезультата.ЗначенияПараметров.Значение;
Если Не ЗначениеСчет.НалоговыйУчет И Индекс = (КоличествоПоказателей — 1)
И ПараметрыОтчета.ПоказательКонтроль Тогда
Значение = 0;
КонецЕсли;
ПараметрыОтчета.ВременныеДанныеОтчета.ЗначенияПоказателей = ПараметрыОтчета.ВременныеДанныеОтчета.ЗначенияПоказателей + Значение;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЕсли;
// Проставляем накопленные суммы в подвал отчета
ИначеЕсли ЭлементРезультата.Макет = ПараметрыОтчета.ВременныеДанныеОтчета.МакетПодвал Тогда
Для Индекс = 0 По КоличествоПоказателей — 1 Цикл
Для ПодИндекс = 1 По 6 Цикл
СтрокаМакета = МакетКомпоновки.Макеты.Макет;
Ячейка = СтрокаМакета.Ячейки;
ИмяПараметра = Строка(Ячейка.Элементы.Значение);
ЭлементРезультата.ЗначенияПараметров.Значение = ПараметрыОтчета.ВременныеДанныеОтчета.ЗначенияПоказателей;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Скажите куда глядеть? Где что не заполнено? Спасибо!

FILED UNDER : Статьи

Submit a Comment

Must be required * marked fields.

:*
:*