При программном изменении записей регистра бухгалтерии разработчики часто сталкиваются с двумя типами ошибок: системным исключением при обращении к субконто и невозможностью найти нужный документ. Рассмотрим подробно, почему возникают эти проблемы и как их правильно устранить.
Первая проблема, с которой мы столкнулись в исходном коде, звучит так: Индекс находится за границами массива при обращении к Запись.СубконтоКт[3]. В 1С нумерация элементов коллекции субконто начинается с 0. Если у выбранного вами счета настроено всего три вида субконто, то доступные индексы — это 0, 1 и 2. Обращение к индексу 3 является попыткой получить четвертое субконто, которого физически не существует.
Для корректной работы важно помнить:
ВидыСубконто хранит описания видов субконто для текущего счета.СчетКт, имейте в виду, что коллекция субконто для записи автоматически очищается, так как структура аналитики у нового счета отличается от старого.Вторая проблема заключается в использовании метода НайтиПоНомеру. В коде автора была допущена ошибка: метод вызывался только с одним аргументом, тогда как синтаксис платформы 1С требует обязательной передачи даты интервала.
Рассмотрим, как правильно реализовать поиск документа:
// Неправильный вызов (вызовет ошибку или не найдет документ)
ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("АТ000000204");
// Правильный вызов
// Второй параметр — это дата, в границах которой осуществляется поиск
ДатаПоиска = ТекущаяДата();
ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("АТ000000204", ДатаПоиска);
Важное примечание: Метод НайтиПоНомеру ищет документ по точному номеру и дате. Если в вашей базе есть дубли номеров или вы не уверены в точной дате, метод может вернуть не тот объект, который ожидается. Всегда проверяйте результат выполнения: Если ДокументСсылка.Пустая() Тогда ....
Давайте соберем все знания воедино и рассмотрим правильный алгоритм корректировки записей в регистре бухгалтерии.
РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей() и обязательно устанавливайте отбор по регистратору.Набор.Прочитать() для получения существующих записей.Для каждого Запись из Набор Цикл выполняйте необходимые замены.Набор.Записать().Ниже приведен пример, как правильно модифицировать проводку с учетом всех рассмотренных нюансов:
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
Набор.Прочитать();
Для каждого Запись из Набор Цикл
Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01") Тогда
Запись.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
// Поиск документа с указанием даты
ДокРеализация = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("АТ000000204", ТекущаяДата());
// Проверяем, что субконто существует и документ найден
Если Запись.СчетКт.ВидыСубконто.Количество() > 2 И Не ДокРеализация.Пустая() Тогда
// Используем индекс 2, что соответствует третьему субконто
Запись.СубконтоКт[Запись.СчетКт.ВидыСубконто[2].ВидСубконто] = ДокРеализация;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Набор.Записать();
Придерживаясь этих правил, вы избежите классических ошибок разработчика при работе с регистрами 1С и обеспечите стабильность кода при изменении настроек счетов в Плане счетов.