Имя: Пароль:
1C
 
БП 3.0. Ошибка при формировании отчета "Главная книга"
0 Alex Проблемный
 
06.10.21
14:11
1С:Предприятие 8.3 (8.3.19.1229)
БП 3.0.101.19
Серверная на SQL

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

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

Технические подробности:
Ошибка выполнения фонового задания ДлительныеОперации.ВыполнитьСКонтекстомКлиента с идентификатором 14631ba4-bec2-4cd7-b755-17be67088665 по причине
Индекс находится за границами массива
{Отчет.ГлавнаяКнига.МодульМенеджера(1070)}:    ОбщиеОстатки   = ДеревоОстатков.Строки[0];
{Отчет.ГлавнаяКнига.МодульМенеджера(808)}:            СтрокаОстатков = ПолучитьСтрокуИзДереваОстатков(ПараметрыОтчета, СтруктураПараметров, ВыборкаПоПериодам.Период);
{Отчет.ГлавнаяКнига.МодульМенеджера(481)}:        ВывестиПериоды(ПараметрыОтчета, ОбщийИтог, СтруктураПараметров, Новый Соответствие, БазовыйУровеньВыборки);
{Отчет.ГлавнаяКнига.МодульМенеджера(77)}:        ВывестиСчет(ПараметрыОтчета, ВыборкаПоСчетам, СтруктураПараметров, ВыводитьЗаголовок);


См. также журнал регистрации.
{ОбщийМодуль.ДлительныеОперации.Модуль(695)}:    ВызватьИсключение ТекстОшибки;
{Отчет.ГлавнаяКнига.Форма.ФормаОтчета.Форма(669)}:    Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);
{Отчет.ГлавнаяКнига.Форма.ФормаОтчета.Форма(624)}:        Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда "

По коду понял что
Процедура ЗаполнитьТаблицуРазвернутыхОстатков(ПараметрыОтчета, СтруктураПараметров)

Формирует и выполняет запрос:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ОстаткиИОбороты.Период КАК Период,
    ОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокДт КАК СуммаРазвернутоКонДт,
    ОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокКт КАК СуммаРазвернутоКонКт,
    ОстаткиИОбороты.СуммаНачальныйРазвернутыйОстатокДт КАК СуммаРазвернутоНачДт,
    ОстаткиИОбороты.СуммаНачальныйРазвернутыйОстатокКт КАК СуммаРазвернутоНачКт, ОстаткиИОбороты.Счет, ОстаткиИОбороты.Субконто1, ОстаткиИОбороты.Субконто2
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, , Счет В (&Субсчета), , Организация = &Организация) КАК ОстаткиИОбороты

УПОРЯДОЧИТЬ ПО
    Период
ИТОГИ
    СУММА(СуммаРазвернутоКонДт),
    СУММА(СуммаРазвернутоКонКт),
    СУММА(СуммаРазвернутоНачДт),
    СУММА(СуммаРазвернутоНачКт)
ПО
    ОБЩИЕ, Период ПЕРИОДАМИ(Месяц, , ), Счет ИЕРАРХИЯ, Субконто1, Субконто2
    
С парамерами:
НачалоПериода = 01.01.2019  0:00:00
КонецПериода = 31.01.2019 23:59:59
Организация = ООО
Субсчета = 76.05
    
и получает пустую таблицу в последствии к которой по коду идёт обравщение по индексу и падает в ошибку.

Если смотреть оборотку по счету 76.05, то в ней нет записей, а по 76.АВ есть

Как решить проблему?
1 hhhh
 
06.10.21
14:17
(0) ну ты попал. Этот отчет наверно с 2005 года никто и не открывал.
2 Alex Проблемный
 
06.10.21
14:38
(1) а что с ней не так? или её уже не используют? Мб есть аналог?
3 Alex Проблемный
 
06.10.21
14:57
Решил так:

Добавить в расширение "Вместо" (Модуль менеджера отчета ГлавнаяКнига(1070))

Функция ПолучитьСтрокуИзДереваОстатков(ПараметрыОтчета, СтруктураПараметров, ДатаПоиска)
ДеревоОстатков = СтруктураПараметров["ДеревоОстатков"];
    
    ДатаОстатков = ?(ДатаПоиска = NULL, ПараметрыОтчета.НачалоПериода, ДатаПоиска);
    
    //{[+](фрагмент ДОБАВЛЕН), 06.10.2021 14:46:15 - Проверка на пустую таблицу
    Если Не ДеревоОстатков.Строки.Количество() Тогда
        Возврат Неопределено;        
    КонецЕсли;    
    //} 06.10.2021 14:46:32
    
    ОбщиеОстатки   = ДеревоОстатков.Строки[0];
    СтрокаОстатков = ОбщиеОстатки.Строки.Найти(ДатаОстатков, "Период", Ложь);
    
    // Строки на данную дату не нашли. Будем искать строки с более ранними датами.
    Если СтрокаОстатков = Неопределено Тогда
        
        Для Каждого стр Из ОбщиеОстатки.Строки Цикл
            
            Если стр.Период = NULL Тогда
                Продолжить;
            КонецЕсли;
            
            Если стр.Период <= ДатаОстатков Тогда
                СтрокаОстатков = стр;
            КонецЕсли;
            
        КонецЦикла;
        
    КонецЕсли;
    
    Возврат СтрокаОстатков;
Независимо от того, куда вы едете — это в гору и против ветра!