Индекс находится за границами массива 1с как исправить

от admin

индекс находится за границами массива

Подскажите как решить проблему:
У меня отчет «Карточка счета» должен сворачивать информацию по регистратору. Когда я его запускаю — пишет «индекс находится за границами массива».
Вот модуль:

Перем СохраненнаяНастройка Экспорт;
Перем Расшифровки Экспорт;
Перем РежимРасшифровки Экспорт;
Перем СохранятьНастройкуОтчета Экспорт;

#Если Клиент Тогда

Функция ПолучитьПараметрыВыбораЗначенияОтбора() Экспорт

СписокПараметров = Новый Структура;
СписокПараметров.Вставить(«Дата» , КонецПериода);
СписокПараметров.Вставить(«СчетУчета» , Счет);
СписокПараметров.Вставить(«Номенклатура» , Неопределено);
СписокПараметров.Вставить(«Склад» , Неопределено);
СписокПараметров.Вставить(«Организация» , Организация);
СписокПараметров.Вставить(«Контрагент» , Неопределено);
СписокПараметров.Вставить(«ДоговорКонтрагента», Неопределено);
СписокПараметров.Вставить(«ЭтоНовыйДокумент» , Ложь);

Процедура ОбработкаИзмененияСчета(ПолнаяОбработка = Истина) Экспорт

Если ЗначениеЗаполнено(Счет) Тогда

КоличествоСубконто = Счет.ВидыСубконто.Количество();
ИмяПоляПрефикс = «Субконто»;

// Изменение представления и наложения ограничения типа значения
Для Индекс = 1 По КоличествоСубконто Цикл
Поле = СхемаКомпоновкиДанных.НаборыДанных[0].Поля.Найти(ИмяПоляПрефикс + Индекс);
Если Поле <> Неопределено Тогда
Поле.Заголовок = Счет.ВидыСубконто[Индекс — 1].ВидСубконто.Наименование;
Поле.ТипЗначения = Счет.ВидыСубконто[Индекс — 1].ВидСубконто.ТипЗначения;
КонецЕсли;
КонецЦикла;

Если ПолнаяОбработка Тогда

// Управление показателями
Если Счет.НалоговыйУчет Тогда
ДанныеОтчета.ПоказателиОтчета.БУ.Использование = Истина;
ДанныеОтчета.ПоказателиОтчета.БУ.Значение = Истина;
ДанныеОтчета.ПоказателиОтчета.НУ.Использование = Истина;
ДанныеОтчета.ПоказателиОтчета.НУ.Значение = Ложь;
ДанныеОтчета.ПоказателиОтчета.ПР.Использование = Истина;
ДанныеОтчета.ПоказателиОтчета.ПР.Значение = Ложь;
ДанныеОтчета.ПоказателиОтчета.ВР.Использование = Истина;
ДанныеОтчета.ПоказателиОтчета.ВР.Значение = Ложь;
Иначе
ДанныеОтчета.ПоказателиОтчета.БУ.Использование = Истина;
ДанныеОтчета.ПоказателиОтчета.БУ.Значение = Истина;
ДанныеОтчета.ПоказателиОтчета.НУ.Использование = Ложь;
ДанныеОтчета.ПоказателиОтчета.НУ.Значение = Ложь;
ДанныеОтчета.ПоказателиОтчета.ПР.Использование = Ложь;
ДанныеОтчета.ПоказателиОтчета.ПР.Значение = Ложь;
ДанныеОтчета.ПоказателиОтчета.ВР.Использование = Ложь;
ДанныеОтчета.ПоказателиОтчета.ВР.Значение = Ложь;
КонецЕсли;
Если Счет.Валютный Тогда
ДанныеОтчета.ПоказателиОтчета.ВалютнаяСумма.Использование = Истина;
ДанныеОтчета.ПоказателиОтчета.ВалютнаяСумма.Значение = Истина;
Иначе
ДанныеОтчета.ПоказателиОтчета.ВалютнаяСумма.Использование = Ложь;
ДанныеОтчета.ПоказателиОтчета.ВалютнаяСумма.Значение = Ложь;
КонецЕсли;
Если Счет.Количественный Тогда
ДанныеОтчета.ПоказателиОтчета.Количество.Использование = Истина;
ДанныеОтчета.ПоказателиОтчета.Количество.Значение = Истина;
Иначе
ДанныеОтчета.ПоказателиОтчета.Количество.Использование = Ложь;
ДанныеОтчета.ПоказателиОтчета.Количество.Значение = Ложь;
КонецЕсли;

Если Счет.УчетПоПодразделениям Тогда
НастройкиФормы.Вставить(«ДоступностьПодразделения», Истина);
Иначе
НастройкиФормы.Вставить(«ДоступностьПодразделения», Ложь);
КонецЕсли;

Если Не РежимРасшифровки Тогда
// Добавление неактивных отборов по субконто в соответствии с выбранным счетом
ОтборыДляУдаления = Новый Массив;
Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип(«ЭлементОтбораКомпоновкиДанных») Тогда
Если Найти(ЭлементОтбора.ЛевоеЗначение, «Субконто») > 0 ИЛИ Строка(ЭлементОтбора.ЛевоеЗначение) = «Валюта»
ИЛИ (Найти(ЭлементОтбора.ЛевоеЗначение, «Подразделение») = 1 И НЕ Счет.УчетПоПодразделениям) Тогда
ОтборыДляУдаления.Добавить(ЭлементОтбора);
КонецЕсли;
КонецЕсли;
КонецЦикла;

Для Каждого ЭлементОтбора Из ОтборыДляУдаления Цикл
КомпоновщикНастроек.Настройки.Отбор.Элементы.Удалить(ЭлементОтбора);
КонецЦикла;

Для Индекс = 1 По КоличествоСубконто Цикл
ТиповыеОтчеты.ДобавитьОтбор(КомпоновщикНастроек, ИмяПоляПрефикс + Индекс, Счет.ВидыСубконто[Индекс — 1].ВидСубконто.ТипЗначения.ПривестиЗначение(Неопределено), , Ложь);
КонецЦикла;
Если Счет.Валютный Тогда
Поле = КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора.НайтиПоле(Новый ПолеКомпоновкиДанных(«Валюта»));
ТиповыеОтчеты.ДобавитьОтбор(КомпоновщикНастроек, «Валюта», Поле.Тип.ПривестиЗначение(Неопределено), , Ложь);
КонецЕсли;

Если Не Счет.УчетПоПодразделениям Тогда
Подразделение = Неопределено;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;

Процедура ЗаполнитьНачальныеНастройки() Экспорт

Процедура СформироватьОтчет(Результат = Неопределено, ДанныеРасшифровки = Неопределено, ВыводВФормуОтчета = Истина, ВнешниеНаборыДанных = Неопределено, ВыводитьПолностью = Истина) Экспорт

Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ВыводЗаголовкаОтчета(ЭтотОбъект, Результат);
Если ВыводитьПолностью Тогда
ДоработатьКомпоновщикПередВыводом(ВнешниеНаборыДанных);
КомпоновщикНастроек.Восстановить();
НастройкаКомпоновкиДанных = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
СтандартныеОтчеты.ВывестиОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета, ВнешниеНаборыДанных, Истина, НастройкаКомпоновкиДанных);
КонецЕсли;
ВыводПодписейОтчета(ЭтотОбъект, Результат);

Если ВыводитьПолностью Тогда
// Выполним дополнительную обработку Результата отчета
ОбработкаРезультатаОтчета(Результат);

// Сохраним настройки для Истории
СтандартныеОтчеты.СохранитьНастройкуДляИстории(ЭтотОбъект);
КонецЕсли;

Процедура ПередВыводомОтчета(МакетКомпоновки) Экспорт

КоличествоПоказателей = 0;
Для Каждого Показатель Из ПоказателиОтчета Цикл
Если Показатель.Значение.Значение Тогда
КоличествоПоказателей = КоличествоПоказателей + 1;
КонецЕсли;
КонецЦикла;

// Если показатель один, то удалим столбик «Показатель»
Если КоличествоПоказателей = 1 Тогда
Для Каждого Макет Из МакетКомпоновки.Макеты Цикл
Для Каждого СтрокаМакета Из Макет.Макет Цикл
СтрокаМакета.Ячейки.Удалить(СтрокаМакета.Ячейки[4]);
КонецЦикла;
КонецЦикла;
КонецЕсли;

МакетПроводки = СтандартныеОтчеты.ПолучитьМакетГруппировкиПоПолюГруппировки(МакетКомпоновки, «Проводки», Истина);

Если МакетПроводки.Количество() = 1 Тогда
МакетПроводки = МакетПроводки[0];
ДанныеОтчета.Вставить(«МакетПроводок», МакетПроводки.Имя);
КонецЕсли;

Процедура ПередВыводомЭлементаРезультата(МакетКомпоновки, ДанныеРасшифровки, ЭлементРезультата, Отказ = Ложь) Экспорт

// В процедуре можно доработать компоновщик перед выводом в отчет
// Изменения сохранены не будут
Процедура ДоработатьКомпоновщикПередВыводом(ВнешниеНаборыДанных) Экспорт

Если ЗначениеЗаполнено(Счет) Тогда
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «Счет», Счет);
КонецЕсли;
Если ЗначениеЗаполнено(НачалоПериода) Тогда
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «НачалоПериода», НачалоДня(НачалоПериода));
Иначе
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «НачалоПериода», Дата(1, 1, 1));
КонецЕсли;
Если ЗначениеЗаполнено(КонецПериода) Тогда
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «КонецПериода», КонецДня(КонецПериода));
Иначе
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «КонецПериода», Дата(3999, 11, 1));
КонецЕсли;

//РУГАЕТСЯ НА ЭТУ СТРОЧКУ.
ТиповыеОтчеты.ДобавитьОтбор(КомпоновщикНастроек.Настройки.Структура[0].Структура[0].Структура[0].Отбор, «Регистратор»,,ВидСравненияКомпоновкиДанных.Заполнено);
//РУГАЕТСЯ НА ЭТУ СТРОЧКУ!

ТиповыеОтчеты.УстановитьПараметрВывода(КомпоновщикНастроек.Настройки.Структура[0].Структура[0], «ВыводитьОтбор», ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
ТиповыеОтчеты.УстановитьПараметрВывода(КомпоновщикНастроек.Настройки.Структура[0].Структура[0].Структура[0], «ВыводитьОтбор», ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
ТиповыеОтчеты.УстановитьПараметрВывода(КомпоновщикНастроек.Настройки.Структура[1].Структура[0], «ВыводитьОтбор», ТипВыводаТекстаКомпоновкиДанных.НеВыводить);

Если Периодичность = 0 Тогда
КомпоновщикНастроек.Настройки.Структура[0].Использование = Ложь;
КомпоновщикНастроек.Настройки.Структура[1].Использование = Истина;
Иначе
КомпоновщикНастроек.Настройки.Структура[0].Использование = Истина;
КомпоновщикНастроек.Настройки.Структура[1].Использование = Ложь;
КонецЕсли;

ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «Периодичность», Периодичность);
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «ПС», Символы.ПС);

Если ЗначениеЗаполнено(Подразделение) Тогда
ТиповыеОтчеты.ДобавитьОтбор(КомпоновщикНастроек, «Подразделение», Подразделение, ВидСравненияКомпоновкиДанных.ВИерархии);
КонецЕсли;

ЛинияСплошная = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);

ТекущийНаборПоказателей = «» + ПоказателиОтчета.БУ.Значение + ПоказателиОтчета.НУ.Значение + ПоказателиОтчета.ПР.Значение + ПоказателиОтчета.ВР.Значение + ПоказателиОтчета.ВалютнаяСумма.Значение + ПоказателиОтчета.Количество.Значение;

МассивПоказателей = Новый Массив;
МассивПоказателей.Добавить(«БУ»);
МассивПоказателей.Добавить(«НУ»);
МассивПоказателей.Добавить(«ПР»);
МассивПоказателей.Добавить(«ВР»);
МассивПоказателей.Добавить(«ВалютнаяСумма»);
МассивПоказателей.Добавить(«Количество»);

Если ТекущийНаборПоказателей <> мТекущийНаборПоказателей Тогда

МассивМакетов = Новый Массив;
МассивМакетов.Добавить(«ПериодГруппировкиЗаголовок»);
МассивМакетов.Добавить(«ОбщиеИтогиЗаголовок»);
МассивМакетов.Добавить(«ОбщиеИтогиПодвал»);
МассивМакетов.Добавить(«ПроводкиЗаголовок»);

Для Каждого ЭлементМакет Из МассивМакетов Цикл
СхемаКомпоновкиДанных.Макеты[ЭлементМакет].Макет = СтандартныеОтчеты.ПолучитьКопиюОписанияМакета(СхемаКомпоновкиДанных.Макеты[ЭлементМакет + «Образец»].Макет);
ОписаниеМакета = СхемаКомпоновкиДанных.Макеты[ЭлементМакет].Макет;

МассивСтрокДляУдаления = Новый Массив;
Индекс = 0;
Для Каждого ЭлементМассива Из МассивПоказателей Цикл
Если Не ПоказателиОтчета[ЭлементМассива].Значение Тогда
МассивСтрокДляУдаления.Добавить(ОписаниеМакета[Индекс]);
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;

Для Каждого Строка Из МассивСтрокДляУдаления Цикл
ОписаниеМакета.Удалить(Строка);
КонецЦикла;

// Обвести область
Если КоличествоСтрок > 0 Тогда
Для Индекс = 0 По 12 Цикл
ПоследняяСтрока = ?(ЭлементМакет = «ОбщиеИтогиПодвал» И Индекс < 4, 0, КоличествоСтрок — 1);
ПараметрГраницы = ТиповыеОтчеты.ПолучитьПараметр(ОписаниеМакета[0].Ячейки[Индекс].Оформление.Элементы, «СтильГраницы»);
ТиповыеОтчеты.УстановитьПараметр(ПараметрГраницы.ЗначенияВложенныхПараметров, «СтильГраницы.Сверху», ЛинияСплошная);
ПараметрГраницы = ТиповыеОтчеты.ПолучитьПараметр(ОписаниеМакета[ПоследняяСтрока].Ячейки[Индекс].Оформление.Элементы, «СтильГраницы»);
ТиповыеОтчеты.УстановитьПараметр(ПараметрГраницы.ЗначенияВложенныхПараметров, «СтильГраницы.Снизу», ЛинияСплошная);
КонецЦикла;
КонецЕсли;

Для Индекс = 1 По КоличествоСтрок — 1 Цикл
ОписаниеМакета[Индекс].Ячейки[0].Элементы.Очистить();
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[0].Оформление.Элементы, «ОбъединятьПоВертикали», Истина);
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[0].Оформление.Элементы, «Расшифровка», Неопределено, Ложь);
ОписаниеМакета[Индекс].Ячейки[1].Элементы.Очистить();
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[1].Оформление.Элементы, «ОбъединятьПоВертикали», Истина);
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[1].Оформление.Элементы, «Расшифровка», Неопределено, Ложь);
ОписаниеМакета[Индекс].Ячейки[2].Элементы.Очистить();
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[2].Оформление.Элементы, «ОбъединятьПоВертикали», Истина);
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[2].Оформление.Элементы, «Расшифровка», Неопределено, Ложь);
ОписаниеМакета[Индекс].Ячейки[3].Элементы.Очистить();
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[3].Оформление.Элементы, «ОбъединятьПоВертикали», Истина);
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[3].Оформление.Элементы, «Расшифровка», Неопределено, Ложь);
Если ЭлементМакет = «ПроводкиЗаголовок» Тогда
ОписаниеМакета[Индекс].Ячейки[5].Элементы.Очистить();
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[5].Оформление.Элементы, «ОбъединятьПоВертикали», Истина);
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[5].Оформление.Элементы, «Расшифровка», Неопределено, Ложь);
ОписаниеМакета[Индекс].Ячейки[8].Элементы.Очистить();
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[8].Оформление.Элементы, «ОбъединятьПоВертикали», Истина);
ТиповыеОтчеты.УстановитьПараметр(ОписаниеМакета[Индекс].Ячейки[8].Оформление.Элементы, «Расшифровка», Неопределено, Ложь);
КонецЕсли;
КонецЦикла;
КонецЦикла;
мТекущийНаборПоказателей = ТекущийНаборПоказателей;
КонецЕсли;

Если Не ПоказателиОтчета.БУ.Значение Тогда
ГруппаОтборов = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип(«ГруппаЭлементовОтбораКомпоновкиДанных»));
ГруппаОтборов.Использование = Истина;
ГруппаОтборов.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
Для Каждого ЭлементМассива Из МассивПоказателей Цикл
Если ЭлементМассива <> «БУ» И ПоказателиОтчета[ЭлементМассива].Значение Тогда
ТиповыеОтчеты.ДобавитьОтбор(ГруппаОтборов, ЭлементМассива + «Дт», 0, ВидСравненияКомпоновкиДанных.НеРавно);
ТиповыеОтчеты.ДобавитьОтбор(ГруппаОтборов, ЭлементМассива + «Кт», 0, ВидСравненияКомпоновкиДанных.НеРавно);
КонецЕсли;
КонецЦикла;
КонецЕсли;

Процедура ВыводЗаголовкаОтчета(ОтчетОбъект, Результат)

Процедура ВыводПодписейОтчета(ОтчетОбъект, Результат)

Функция ПолучитьТекстЗаголовка(ОрганизацияВНачале = Истина) Экспорт

ЗаголовокОтчета = «Карточка счета » + Счет + СтандартныеОтчеты.ПолучитьПредставлениеПериода(ЭтотОбъект);

Возврат ?(ОрганизацияВНачале, ЗаголовокОтчета, ЗаголовокОтчета + » » + СтандартныеОтчеты.ПолучитьТекстОрганизация(ЭтотОбъект));

Процедура ПолучитьСтруктуруПоказателейОтчета() Экспорт

ПоказателиОтчета = СтандартныеОтчеты.ПолучитьСтруктуруПоказателейОтчета(. Ложь, Истина, Истина, Ложь);
ДанныеОтчета.Вставить(«ПоказателиОтчета», ПоказателиОтчета);

// Зафиксируем заголовок отчета
ВысотаЗаголовка = Результат.Области.Заголовок.Низ;
Результат.ФиксацияСверху = ВысотаЗаголовка + 2;

// Для настройки отчета (расшифровка и др.)
Процедура Настроить() Экспорт

Процедура СохранитьНастройку() Экспорт

Если СохранятьНастройкуОтчета Тогда
СтандартныеОтчеты.СохранитьНастройку(ЭтотОбъект);
КонецЕсли;

// Процедура заполняет параметры отчета по элементу справочника из переменной СохраненнаяНастройка.
Процедура ПрименитьНастройку() Экспорт

Если СохраненнаяНастройка.Пустая() Тогда
Возврат;
КонецЕсли;

СтруктураПараметров = СохраненнаяНастройка.ХранилищеНастроек.Получить();
Если РежимРасшифровки Тогда
НастройкиФормы = СтруктураПараметров.НастройкиФормы;
Иначе
ТиповыеОтчеты.ПрименитьСтруктуруПараметровОтчета(ЭтотОбъект, СтруктураПараметров);
КонецЕсли;

Ошибка «Индекс находится за границами массива»

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

Почему возникает ошибка

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

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

Рассмотрим пример, в котором код создает массив с тремя значениями, а следующий за ним цикл имеет 10 итераций. При четвертом прохождении цикла возникнет ошибка «Индекс находится за пределами массива». Чтобы этого не допустить, необходимо либо изменить количество прохождений цикла либо добавлять условный оператор, который проверяет нахождение значений индекса в заданном диапазоне.

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

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

Избежать этого помогут такие советы:

  • Не вносите изменения в типовые конфигурации 1С без участия профессионалов;
  • Резервируйте приложения и данные перед внесением изменений в программный код;
  • Создавайте тестовую базу для работы с 1С Предприятие и тестируйте внесенные в код правки на ней.
Читать:
Как передать com объект с клиента на сервер 1с

Заключение

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

Что такое индекс находится за границами массива в 1с

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

Почему возникает ошибка

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

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

Рассмотрим пример, в котором код создает массив с тремя значениями, а следующий за ним цикл имеет 10 итераций. При четвертом прохождении цикла возникнет ошибка «Индекс находится за пределами массива». Чтобы этого не допустить, необходимо либо изменить количество прохождений цикла либо добавлять условный оператор, который проверяет нахождение значений индекса в заданном диапазоне.

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

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

Избежать этого помогут такие советы:

Заключение

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

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

Причины и способы устранения ошибки — индекс находится вне границ массива

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

Что такое индекс находится за границами массива в 1с

Закажите настройку БД 1С в IT RUSH!

Что значат, почему возникают такие ошибки?

Получение системного сообщения о том, что индекс элемента находится за границами массива или system indexoutofrangeexception, обозначает возникновение следующей ситуации:

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

Основными причинами подобных неполадок становятся такие процессы:

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

Обратитесь к специалистам

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

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

Обращаться IT RUSH — это практичное и выгодное решение:

Стоимость работ специалиста IT-Rush программиста 1С по устранению ошибки “индекс находится за границами массива 1С”- от 1800 руб./час.

индекс находится за границами массива

У меня проблема: при формировании отчета выдает ошибку «индекс находится за границами массива»

Постоянно ругается,
вот кусок модуля:

// В процедуре можно доработать компоновщик перед выводом в отчет
// Изменения сохранены не будут
Процедура ДоработатьКомпоновщикПередВыводом(ВнешниеНаборыДанных) Экспорт

Если ЗначениеЗаполнено(Счет) Тогда
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «Счет», Счет);
КонецЕсли;
Если ЗначениеЗаполнено(НачалоПериода) Тогда
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «НачалоПериода», НачалоДня(НачалоПериода));
Иначе
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «НачалоПериода», Дата(1, 1, 1));
КонецЕсли;
Если ЗначениеЗаполнено(КонецПериода) Тогда
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «КонецПериода», КонецДня(КонецПериода));
Иначе
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «КонецПериода», Дата(3999, 11, 1));
КонецЕсли;

ТиповыеОтчеты.ДобавитьОтбор(КомпоновщикНастроек.Настройки.Структура[0].Структура[0].Отбор, «ПериодГруппировки»,,ВидСравненияКомпоновкиДанных.Заполнено);
ТиповыеОтчеты.ДобавитьОтбор(КомпоновщикНастроек.Настройки.Структура[0].Структура[0].Структура[0].Отбор, «Регистратор»,,ВидСравненияКомпоновкиДанных.Заполнено);
ТиповыеОтчеты.ДобавитьОтбор(КомпоновщикНастроек.Настройки.Структура[1].Структура[0].Отбор, «Регистратор»,,ВидСравненияКомпоновкиДанных.Заполнено);

ТиповыеОтчеты.УстановитьПараметрВывода(КомпоновщикНастроек.Настройки.Структура[0].Структура[0], «ВыводитьОтбор», ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
ТиповыеОтчеты.УстановитьПараметрВывода(КомпоновщикНастроек.Настройки.Структура[0].Структура[0].Структура[0], «ВыводитьОтбор», ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
ТиповыеОтчеты.УстановитьПараметрВывода(КомпоновщикНастроек.Настройки.Структура[1].Структура[0], «ВыводитьОтбор», ТипВыводаТекстаКомпоновкиДанных.НеВыводить);

Если Периодичность = 0 Тогда
КомпоновщикНастроек.Настройки.Структура[0].Использование = Ложь;
КомпоновщикНастроек.Настройки.Структура[1].Использование = Истина;
Иначе
КомпоновщикНастроек.Настройки.Структура[0].Использование = Истина;
КомпоновщикНастроек.Настройки.Структура[1].Использование = Ложь;
КонецЕсли;

ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «Периодичность», Периодичность);
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «ПС», Символы.ПС);

Если ЗначениеЗаполнено(Подразделение) Тогда
ТиповыеОтчеты.ДобавитьОтбор(КомпоновщикНастроек, «Подразделение», Подразделение, ВидСравненияКомпоновкиДанных.ВИерархии);
КонецЕсли;

ЛинияСплошная = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);

ТекущийНаборПоказателей = «» + ПоказателиОтчета.БУ.Значение + ПоказателиОтчета.НУ.Значение + ПоказателиОтчета.ПР.Значение + ПоказателиОтчета.ВР.Значение + ПоказателиОтчета.ВалютнаяСумма.Значение + ПоказателиОтчета.Количество.Значение;

МассивПоказателей = Новый Массив;
МассивПоказателей.Добавить(«БУ»);
МассивПоказателей.Добавить(«НУ»);
МассивПоказателей.Добавить(«ПР»);
МассивПоказателей.Добавить(«ВР»);
МассивПоказателей.Добавить(«ВалютнаяСумма»);
МассивПоказателей.Добавить(«Количество»);

Если ТекущийНаборПоказателей <> мТекущийНаборПоказателей Тогда

МассивМакетов = Новый Массив;
МассивМакетов.Добавить(«ПериодГруппировкиЗаголовок»);
МассивМакетов.Добавить(«ОбщиеИтогиЗаголовок»);
МассивМакетов.Добавить(«ОбщиеИтогиПодвал»);
МассивМакетов.Добавить(«ПроводкиЗаголовок»);

Для Каждого ЭлементМакет Из МассивМакетов Цикл
СхемаКомпоновкиДанных.Макеты[ЭлементМакет].Макет = СтандартныеОтчеты.ПолучитьКопиюОписанияМакета(СхемаКомпоновкиДанных.Макеты[ЭлементМакет + «Образец»].Макет);
ОписаниеМакета = СхемаКомпоновкиДанных.Макеты[ЭлементМакет].Макет;

МассивСтрокДляУдаления = Новый Массив;
Индекс = 0;
Для Каждого ЭлементМассива Из МассивПоказателей Цикл
Если Не ПоказателиОтчета[ЭлементМассива].Значение Тогда
МассивСтрокДляУдаления.Добавить(ОписаниеМакета[Индекс]);
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;

Для Каждого Строка Из МассивСтрокДляУдаления Цикл
ОписаниеМакета.Удалить(Строка);
КонецЦикла;

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

Что такое индекс находится за границами массива в 1сИндекс находится за границей массива
Есть код, где хочу удалить 1 символ. Длинна массива 24. Через функцию StreangBuilder.Remove(23,1).

Индекс находится вне границ массива
При компиляции выдает ошибку: Индекс находится вне границ массива. Причем если заполнить файл.

Индекс находится вне границ массива
Я не могу понять в чём проблема.. Думал что с циклом, посмотрел на него, вроде всё нормально, потом.

Для удаления нужно перебирать массив с конца

ну значит находится за границами массива. поставь точку остановки. посмотри, какой у тебя массив остался. чему равен счётчик.

уо май. я ТЗ не прочел. Ты прав Polax
сорри
Я просто скопипастил и дописал не думая

Добавлено через 11 секунд
я параллельно отчет делаю

Она вычисляется один РАЗ перед началом цикла

Добавлено через 3 минуты

Индекс находится вне границ массива
string productsSplit = lineSplit.Split(‘,’); for (int i = 0; i spec = new.

Что такое индекс находится за границами массива в 1сИндекс находится вне границы массива
Помогите пожалуйста) Ниже есть код, он достаточно длинный но вопрос чисто по единственному массиву.

Индекс находится вне границ массива
Здравствуйте. Подскажите, как исправить ошибку при парсинге. if (oneOid.Split(‘=’).Trim() ==.

Индекс находится вне границ массива
Нужно организовать вывод текстового файла постранично( т.е. по 25 строчек на экран) по нажатию.

Ошибка «Значение индекса выходит за границы диапазона»

Данная ошибка возникает в случае обращения к несуществующему элементу универсальной коллекции (массива, списка или таблицы значений) по ошибочному индексу.
Индекс всегда должен находиться в пределах диапазона: от 0 до количества элементов коллекции минус единица. Например, если в массиве 3 элемента, то самый младший из них будет иметь индекс = 0, а самый последний — индекс = 2.

Давайте рассмотрим на примерах, как правильно работать с коллекциями, чтобы такие ошибки не возникали.

Работаем с массивом программно без ошибок:

Индекс элемента массива должен находиться в пределах от 0 до значения, возвращаемого методом ВГраница():

Работаем со списком значений программно без ошибок:

Индекс элемента списка значений должен находиться в пределах от 0 до значения, возвращаемого методом Количество() минус 1:

Related Posts