Как исправить ошибку «Индекс находится за границами массива» при изменении проводок в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Торговля и дистрибуция
← На главную

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

Разбираем ошибку индексации субконто

Первая проблема, с которой мы столкнулись в исходном коде, звучит так: Индекс находится за границами массива при обращении к Запись.СубконтоКт[3]. В 1С нумерация элементов коллекции субконто начинается с 0. Если у выбранного вами счета настроено всего три вида субконто, то доступные индексы — это 0, 1 и 2. Обращение к индексу 3 является попыткой получить четвертое субконто, которого физически не существует.

Для корректной работы важно помнить:

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

Исправление ошибки поиска документа

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

Рассмотрим, как правильно реализовать поиск документа:


// Неправильный вызов (вызовет ошибку или не найдет документ)
ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("АТ000000204");

// Правильный вызов
// Второй параметр — это дата, в границах которой осуществляется поиск
ДатаПоиска = ТекущаяДата(); 
ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("АТ000000204", ДатаПоиска);

Важное примечание: Метод НайтиПоНомеру ищет документ по точному номеру и дате. Если в вашей базе есть дубли номеров или вы не уверены в точной дате, метод может вернуть не тот объект, который ожидается. Всегда проверяйте результат выполнения: Если ДокументСсылка.Пустая() Тогда ....

Алгоритм безопасного изменения проводок

Давайте соберем все знания воедино и рассмотрим правильный алгоритм корректировки записей в регистре бухгалтерии.

  1. Создание набора записей: Всегда используйте РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей() и обязательно устанавливайте отбор по регистратору.
  2. Чтение данных: Выполняйте Набор.Прочитать() для получения существующих записей.
  3. Итерация и изменение: В цикле Для каждого Запись из Набор Цикл выполняйте необходимые замены.
  4. Безопасное присвоение субконто: Используйте индексы строго в рамках допустимого диапазона. Если вы меняете счет, сначала присвойте новый счет, а затем последовательно заполните его субконто.
  5. Запись изменений: После завершения цикла вызовите Набор.Записать().

Пример корректного кода

Ниже приведен пример, как правильно модифицировать проводку с учетом всех рассмотренных нюансов:


Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
Набор.Прочитать();

Для каждого Запись из Набор Цикл
    Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01") Тогда
        Запись.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
        
        // Поиск документа с указанием даты
        ДокРеализация = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("АТ000000204", ТекущаяДата());
        
        // Проверяем, что субконто существует и документ найден
        Если Запись.СчетКт.ВидыСубконто.Количество() > 2 И Не ДокРеализация.Пустая() Тогда
            // Используем индекс 2, что соответствует третьему субконто
            Запись.СубконтоКт[Запись.СчетКт.ВидыСубконто[2].ВидСубконто] = ДокРеализация;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Набор.Записать();

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

← На главную