При ведении учета в программных продуктах «1С:Предприятие» (в частности, в конфигурациях для государственного сектора, таких как «Бухгалтерия государственного учреждения») пользователи и программисты периодически сталкиваются с неприятной ошибкой: «Индекс находится за границами массива». Особенно часто эта проблема заявляет о себе при проведении регламентных документов переноса остатков по счетам материальных запасов (МЗ) и основных средств (ОС), например, при изменении типа учреждения и смене КФО.
В этой статье мы подробно разберем техническую природу этой ошибки, проанализируем, почему она возникает на стыке программного кода и реальных учетных данных, а также предложим пошаговые практические рекомендации по ее устранению.
Для начала выясним причину сбоя на уровне программного кода. Ошибка «Индекс находится за границами массива» означает, что программа пытается обратиться к элементу коллекции (массива, соответствия или строк таблицы значений) по порядковому номеру (индексу), которого физически не существует в этой коллекции.
В «1С» индексация элементов всегда начинается с нуля. Это значит, что если в массиве содержится N элементов, то допустимыми будут индексы от 0 до N-1. Если же массив оказывается абсолютно пустым (количество элементов равно 0), то любая попытка прочитать или записать данные в элемент с индексом [0] немедленно вызовет аварийное завершение работы системы.
Рассмотрим фрагмент кода, который непосредственно приводит к ошибке при проведении документа ИзменениеКФО_МЗ:
МассивСтрокОстатков = ТабРезультат.НайтиСтроки(СтруктураПоиска);
Если МассивСтрокОстатков.Количество = 0 Тогда
ТекстСообщения = "Номенклатура """ + СтрокаТЧ["Номенклатура"] + """ не хватает. Остаток - 0";
Возврат Истина;
КонецЕсли;
СтрокаОстатка = МассивСтрокОстатков[0];
Проанализируем этот алгоритм по шагам:
НайтиСтроки() выполняет поиск в таблице результатов по определенным критериям (номенклатура, склад, МОЛ, КФО и т.д.), которые передаются в переменной СтруктураПоиска.Если МассивСтрокОстатков.Количество = 0 Тогда.... Однако здесь допущена критическая синтаксическая неточность. В платформе «1С:Предприятие» у объекта Массив нет свойства Количество. Количество элементов определяется исключительно через метод (функцию) Количество() со скобками.МассивСтрокОстатков.Количество в некоторых режимах выполнения платформы возвращает значение Неопределено или приводит к неявной ошибке, из-за чего проверка Если ... Тогда попросту пропускается.СтрокаОстатка = МассивСтрокОстатков[0];. Поскольку массив пуст, обращение к нулевому элементу вызывает исключение «Индекс находится за границами массива», и документ отказывается проводиться.Для исправления этой программной недоработки в конфигураторе код необходимо привести к следующему виду:
МассивСтрокОстатков = ТабРезультат.НайтиСтроки(СтруктураПоиска);
Если МассивСтрокОстатков.Количество() = 0 Тогда
// Корректный вызов метода с круглыми скобками
ТекстСообщения = "Номенклатура """ + СтрокаТЧ["Номенклатура"] + """ не хватает. Остаток - 0";
Возврат Истина;
КонецЕсли;
СтрокаОстатка = МассивСтрокОстатков[0];
Однако даже после исправления кода документ все равно не проведется, если в базе данных отсутствуют нужные остатки. Программа просто выдаст информационное сообщение вместо аварийного завершения. Поэтому главная задача — разобраться, почему система не находит остатки в базе данных.
Документы по изменению КФО и переносу остатков обычно создаются не вручную, а автоматически с помощью специализированных обработок — «Помощника переноса остатков при изменении типа учреждения». На момент формирования документов помощник видит остатки в системе и успешно заполняет табличные части. Но при последующей попытке проведения документов возникает сбой.
Выделим основные бизнес-причины, из-за которых реальные остатки на счетах учета (например, на счете 105 «Материальные запасы» или 43 «Готовая продукция») перестают соответствовать данным в документе:
НайтиСтроки() возвращает пустой массив.Рассмотрим детальный алгоритм действий, позволяющий локализовать и устранить проблему без изменения программного кода конфигурации.
Прежде всего необходимо детально проанализировать, что именно числится на счетах учета на дату проведения переноса. Сформируйте отчет «Оборотно-сальдовая ведомость по счету» (например, по счету 105) на дату переноса (например, 31.12.2011) со всеми возможными группировками:
Сверьте полученный отчет с табличной частью документа, вызывающего ошибку. Данные должны совпадать до копейки и до единицы измерения. Обратите особое внимание на наличие пустых субконто в ОСВ.
Если учет по ИФО в вашей организации не ведется, проверьте параметры переноса данных в Стартовом помощнике. Часто при его работе в таблицах сопоставления КФО и ИФО формируются скрытые пустые строки. Выполните следующие действия:
Если в базе данных производились корректировки «задним числом», ручное исправление строк в уже сформированном документе переноса КФО может занять слишком много времени и привести к новым ошибкам. Наиболее надежный способ решения:
Изменение КФО МЗ.Если визуальный анализ данных не приносит результатов, вы можете использовать механизм отладки платформы для точечного выявления проблемного элемента. Пройдите по следующим шагам:
СтрокаОстатка = МассивСтрокОстатков[0];).СтруктураПоиска.Совместное использование детального анализа учетных данных в Оборотно-сальдовой ведомости и штатных механизмов отладки платформы «1С» позволяет оперативно решить проблему и успешно завершить процедуру переноса остатков при изменении типа учреждения.