что такое индекс находится за границами массива в 1с
Статьи
Ошибка «Индекс находится за пределами массива» в программах на платформе 1С Предприятие часто появляется при работе с базами данных, где имеются коллекции значений. Индекс в 1С Бухгалтерия применяется как счетчик элементов. Если в программе используются массивы, велика вероятность получения такого сообщения при выполнении кода. Рассмотрим, как он него избавиться в программах 1С 8.3.
Почему возникает ошибка
В большинстве случаев диалоговое окно с сообщением об ошибке появляется в программе 1С в том случае, если в коде идет обращение к элементу массива с использованием его индекса. Но при этом разработчик конкретного фрагмента кода не позаботился о том, чтобы проводилась проверка на его соответствие числу элементов. При выполнении какого-либо цикла возникнет ситуация, когда элементы закончатся, а программа 1С все равно будет обращаться к ним. Что и приведет к появлению сообщения.
Обнаружить ошибочный фрагмент кода легко, так как приложения на платформе 1С предприятие выводят строку кода, где оператор выполняется с ошибкой. При клике на кнопке «Подробно» в диалоговом окне программист получит нужную информацию.
Рассмотрим пример, в котором код создает массив с тремя значениями, а следующий за ним цикл имеет 10 итераций. При четвертом прохождении цикла возникнет ошибка «Индекс находится за пределами массива». Чтобы этого не допустить, необходимо либо изменить количество прохождений цикла либо добавлять условный оператор, который проверяет нахождение значений индекса в заданном диапазоне.
Обратите внимание, что в 1С Бухгалтерия и других программах на платформе 1С Предприятие индексы играют важную роль. Для получения значения индекса выделен специальный метод «Количество()». С его помощью можно работать со значениями в коллекции и получать значение конкретного элемента.
Учитывая это, следует соблюдать особую осторожность при работе с коллекциями в типовых конфигурациях. Так как внесение даже незначительных изменений неквалифицированными пользователями может привести к полной неработоспособности или серьезных ошибках в программе 1С и в учете.
Избежать этого помогут такие советы:
Заключение
Получить исчерпывающие консультации по программам 1С, получению обновлений 1С и настройке под нужны конкретного предприятия можно в компании «ГК в Приоритете». Свяжитесь с нашими сотрудниками и они помогут вам настроить программу с учетом индивидуальных потребностей и с гарантией ее работоспособности.
Индекс находится за границами массива
Проблема при создании списка значений.
А именно ошибка: «индекс находится за границами массива»
(11) Не туда сообщение отправил вроде.
Например, если пользователь выберет из списка значений Брянская, Владимирская то тогда значение территориальныйкоэффициент 1 (реквизит справочника) станет равным 1.0
Т.е. несколько значений из списка могут относится к одному числу.
Поэтому я и думаю как написать условие
Вот тут объявление нового списка
Список = Новый СписокЗначений;
Потом идёт заполнение списка выбора элемента формы, а не объявленного выше списка значений
А потом вы загружаете в список выбора объявленный, но незаполненный список значений
Элементы.ТеррРайоныРоссииИТеррКоэфф.СписокВыбора.ЗагрузитьЗначения(Список.ВыгрузитьЗначения());
Вам об этом в первом ответе и написал товарищ
Просто надо все значения добавить в объявленный Список, и уже его выгружать в список выбора элемента
(8) спасибо, понял, голова под вечер не хочет думать((
Но у меня еще вопрос.
Например, если пользователь выберет из списка значений Брянская, Владимирская то тогда значение территориальныйкоэффициент 1 (реквизит справочника) станет равным 1.0
Т.е. несколько значений из списка могут относится к одному числу.
Поэтому я и думаю как написать условие?
я пытался так, но выходит ошибка:
<Справочник.ВыборЦелесообразногоСпособаТранспортировкиНефти.Форма.ФормаЭлемента.Форма(976)>: Значение не является значением объектного типа (ВыбратьЭлемент)
Если Список.ДоступныеЗначения.ВыбратьЭлемент(«Брянская») Тогда
(16)Объясните пожалуйста поподробнее что вы имеете ввиду. Я не очень понимаю что вы именно пытаетесь мне подсказать, используя представления.
Поэтому вот это нерабочую часть код я закомментил
я пытался так, но выходит ошибка:
Если ВыбранноеЗначение = Брянская Тогда Объект.ТеррКоэфф1 = 1
Вроде так. Ведь поле списка связано с реквизитом, точнее говоря что выбрал в списке то и получишь в реквизите.
(22)в одном реквизите данные выбираются, а исходя из того что выбрано, в другом реквизите нужное значение подставляется.
Поэтому например выбрав Бурянская, Владимировская у ТеррКоэфф будет 1
Выбрав другую область (район) значение станет другим.
Я делал похоже при помощи события ОбработкаВыбора, но тогда задаваемое поле списка для выбора будет очень длинным.
Или &НаКлиенте из списка выбора выбирать по кнопке, используя ПоказатьВыборЭлемента(. )
В описание оповещения что будет я не знаю, в заголовке видимо тоже самое что и в значении при задании списка, в элементе тоже не пойму что.
Индекс находится за границами массива <Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(19813)>: СтрокаТаблицыФильтра = ТаблицаФильтрПолученияДвижений.НайтиСтроки(СтруктураПоиска)[0];
Всем привет!
Подскажите куда копать.
Индекс находится за границами массива
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(19813)>: СтрокаТаблицыФильтра = ТаблицаФильтрПолученияДвижений.НайтиСтроки(СтруктураПоиска)[0];
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(17225)>: ПреобразоватьТаблицуДвиженийВТаблицуИнтервалов(КэшКадроваяИсторияИнтервалы, ТаблицаПолученияПериодическихДанныхСотрудников, «Сотрудник», «Сотрудник», Истина);
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(4101)>: КадроваяИстория = КадроваяИстория();
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(3520)>: РазбитьСтрокиНачислений();
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(439)>: ЗаполнитьНачисленияСотрудников(Начисления);
<Документ.Отпуск.Форма.ФормаДокумента.Форма(3096)>: МенеджерРасчета.ЗаполнитьНачисленияСотрудникаЗаПериод(Объект.Сотрудник, ТаблицаНачислений, ПериодРасчетаЗарплаты);
<Документ.Отпуск.Форма.ФормаДокумента.Форма(2809)>: ЗаполнитьНачисления(МенеджерРасчета, ПериодРасчетаЗарплаты);
<Документ.Отпуск.Форма.ФормаДокумента.Форма(2547)>: ПерезаполнитьНачисленияСотрудника(,,ПерезаполнитьНачисления);
<Документ.Отпуск.Форма.ФормаДокумента.Форма(1772)>: РассчитатьНачисленияНаСервере(Истина);
Индекс находится за границами массива
Технические подробности:
Ошибка выполнения фонового задания ДлительныеОперации.ВыполнитьСКонтекстомКлиента с идентификатором a781bcaf-0bbf-49b9-9d09-bcc6edeb3875 по причине
Индекс находится за границами массива
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(19813)>: СтрокаТаблицыФильтра = ТаблицаФильтрПолученияДвижений.НайтиСтроки(СтруктураПоиска)[0];
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(17225)>: ПреобразоватьТаблицуДвиженийВТаблицуИнтервалов(КэшКадроваяИсторияИнтервалы, ТаблицаПолученияПериодическихДанныхСотрудников, «Сотрудник», «Сотрудник», Истина);
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(4701)>: ИнтервалыКадровойИстории = КадроваяИстория();
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(1519)>: ВычеркнутьНеСоответствующиеКадровомуОтбору(ТаблицаСотрудников, Отборы);
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(1492)>: ЗаполнитьВыявленнымиНачислениями(ТаблицаСотрудников, Начисления, Отборы);
<Обработка.МенеджерРасчетаЗарплаты.МодульОбъекта(569)>: Начисления = НачисленияЗарплаты(ТаблицаСотрудников, Отборы, НачисленияПериоды);
<ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль(2126)>: МенеджерРасчета.ЗаполнитьНачислениеЗарплаты(СотрудникиДляНачислений, ОтборМенеджераРасчета, СотрудникиДляУдержаний);
<Документ.НачислениеЗарплаты.МодульМенеджера(400)>: ДанныеЗаполнения = РасчетЗарплатыРасширенный.ДанныеДляЗаполненияТаблицДокумента(ОписаниеДокумента, Организация, МесяцНачисления, ДополнительныеПараметры);
<(1)>:Документы.НачислениеЗарплаты.ПодготовитьДанныеДляЗаполнения(Параметры[0],Параметры[1])
<ОбщийМодуль.ОбщегоНазначения.Модуль(5262)>: Выполнить ИмяМетода + «(» + ПараметрыСтрока + «)»;
<ОбщийМодуль.ДлительныеОперации.Модуль(1067)>: ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
<ОбщийМодуль.ДлительныеОперации.Модуль(1057)>: ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
индекс находится за границами массива
Создал список значений, генератором случайных чисел пытаюсь получить рандомное число. ГСЧ работает отлично. Но вот проблема:
У вас в массиве десять значений: 1-9 и 0!
Попробуйте исходить из этого.
(6)
та же ошибка поправил код
Индекс находится за границами массива
<ОбщаяФорма.НаСколькоДолгийМарафон.Форма(23)>: Массив[ч] = СПЗ.Получить(СЧ);
Если я правильно понял ваши хотелки, то код должен быть примерно таким:
(14) вижу, я по всякому пробовал. Новая ошибка, по вашему коду:
Значение индекса выходит за границы диапазона
<ОбщаяФорма.НаСколькоДолгийМарафон.Форма(22)>: Массив[ч-1] = СПЗ.Получить(СЧ);
по причине:
Значение индекса выходит за границы диапазона
<ОбщаяФорма.НаСколькоДолгийМарафон.Форма(22)>: Ошибка при вызове метода контекста (Получить)
Массив[ч-1] = СПЗ.Получить(СЧ);
по причине:
Значение индекса выходит за границы диапазона
Значение индекса выходит за границы диапазона
(20) я исправил, оно не пустым было, а конец в списке случайных чисел, убрал я из кода:
СПЗ.Удалить(СЧ);
ошибка осталась, не в нём было дело. а ошибка опять трындит про эту строку
Значение индекса выходит за границы диапазона
<ОбщаяФорма.НаСколькоДолгийМарафон.Форма(25)>: Массив[ч-1] = СПЗ.Получить(СЧ);
по причине:
Значение индекса выходит за границы диапазона
Вот тут у вас собака явно порылась.
(20) Код переписал полностью, ошибку про индекс исправил, гсч работает. Но картинки не перемешиваются, в этом то и проблема, которую я не знаю как исправить.
Пробую другой код: не работает.
Ффух! Даже я, закоренелый семерочник, уже разобрался (вроде бы), а вы до сих пор путаете представление и значение списка значений!
Да еще лепите лишние массивы и прочую хрень.
ГСЧ = Новый ГенераторСлучайныхЧисел();
СПЗ = Новый СписокЗначений;
СПЗ.Добавить(Элементы.Декорация2,Строка(ГСЧ.СлучайноеЧисло(1000,9999)));
СПЗ.Добавить(Элементы.Декорация3,Строка(ГСЧ.СлучайноеЧисло(1000,9999)));
СПЗ.Добавить(Элементы.Декорация4),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация5),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация6),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация7),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация8),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация9),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация10),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация11),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
индекс находится за границами массива
У меня проблема: при формировании отчета выдает ошибку «индекс находится за границами массива»
Постоянно ругается,
вот кусок модуля:
// В процедуре можно доработать компоновщик перед выводом в отчет
// Изменения сохранены не будут
Процедура ДоработатьКомпоновщикПередВыводом(ВнешниеНаборыДанных) Экспорт
Если ЗначениеЗаполнено(Счет) Тогда
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «Счет», Счет);
КонецЕсли;
Если ЗначениеЗаполнено(НачалоПериода) Тогда
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «НачалоПериода», НачалоДня(НачалоПериода));
Иначе
ТиповыеОтчеты.УстановитьПараметр(КомпоновщикНастроек, «НачалоПериода», Дата(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;
КонецЦикла;
Для Каждого Строка Из МассивСтрокДляУдаления Цикл
ОписаниеМакета.Удалить(Строка);
КонецЦикла;