Книга знаний

Рекламное место пустует
1С:Предприятие / v8 / Объекты конфигурации / Отчеты

v8: Хитрый способ выведения нужного количества строк в регламентных отчетах

В регламентированных формах часто выводят по 5-10 строк, хотя порой нужно выводить больше строк. Рассмотрен один из вариантов решения, не самый оптимальный, но зато удобный в целях сопровождения - ничего не меняем в макетах, правки только в коде.Автор статьи: Гений 1С
Последняя редакция №1 от 29.04.08
URL: http://kb.mista.ru/article.php?id=667

Ключевые слова: регламентированная отчетность,отчет,хитрость,сопровождение


В общем в типовой форме отчета Т2 в ЗУП выводилось только 10 отпусков сотрудника, а у некоторых их могло быть штук 40, т.к. часто сотрудники ходили в отпуск на 1-2 дня.

В типовой форме было 10 секций высотой по 1 строке каждая, в каждой из них был параметр ВидОтпуска1, ВидОтпуска2, ВидОтпуска3...ВидОтпуска10

Я набросал нехитрый код, который сначала убирает все лишние дублирующиеся секции, а затем по мере надобностей клонирует первую строчку. Т.е. он ищет параметр ВидОтпуска1, по нему определяет, что это первая строка. Остальные после нее дубли удаляет, а первую строчку клонирует.

Вот как это вызывается из кода примерно:

    инд    =    0;
Пока ВыборкаРезультата.Следующий()    Цикл
    
    //...
    инд    =    инд + 1;
    
    ПроверитьНаличиеСекции(ЧетвертаяСтраницаТ2, "ВидОтпуска", Инд);
        
    // Вид отпуска
    ЧетвертаяСтраницаТ2.Параметры["ВидОтпуска"+инд] = ВыборкаРезультата.ДополнительныйОтпуск;
            
    ...            
КонецЦикла;
    
ПроверитьНаличиеСекции(ЧетвертаяСтраницаТ2, "ВидОтпуска", Инд); //Чтобы обрезать ненужное, если не было строк


Можно усовершенствовать код, например, сделать поиск по полному имени параметра. Но у меня пока и так работает.


Функция    ПроверитьНаличиеСекции(ТабДок, ИмяПараметра, КоличествоСекций, ВысотаСтроки=1)
    //Ищем по макету нужную область по имени параметра
    Строки=Новый Массив();
    Сч=1;
    Пока истина Цикл
        ТекИмяПараметра=ИмяПараметра+Формат(Сч, "ЧДЦ=0; ЧГ=");
        Область=ТабДок.НайтиТекст(ТекИмяПараметра); //ВидОтпуска
        Если Область=Неопределено Тогда
            Прервать;
        КонецЕсли;
        Строки.Добавить(Область.Верх);
        Сч=Сч+1;
    КонецЦикла;
    
    //Удаляем лишние строки. Задом наперед, чтобы сохранялся порядок строк
    Для Сч=1 По Строки.Количество() Цикл
        ТекСч=Строки.Количество()-Сч+1;
        Если ТекСч<=КоличествоСекций Тогда
            Продолжить;
        КонецЕсли;
        ТекСтрока=Строки[ТекСч-1];
        ТекОбласть=ТабДок.Область(ТекСтрока, 1, ТекСтрока, ТабДок.ШиринаТаблицы+1);
        ТабДок.УдалитьОбласть(ТекОбласть, ТипСмещенияТабличногоДокумента.ПоВертикали); //Целиком строку удаляем
    КонецЦикла;
    
    //Имеем массив строк
    Если Строки.Количество()>0 Тогда
        //Клонируем первую строчку, пока не получим нужное количество строк
        ПерваяОбласть=ТабДок.Область(Строки[0], 1, Строки[0], ТабДок.ШиринаТаблицы+1);
        Пока Строки.Количество()<КоличествоСекций Цикл
            ПоследняяСтрока=Строки[Строки.Количество()-1]+ВысотаСтроки;
            ПоследняяОбласть=ТабДок.Область(ПоследняяСтрока, 1, ПоследняяСтрока, ТабДок.ШиринаТаблицы+1);
            //Копируем первую на место последней. Целиком строку добавляем
            ТабДок.ВставитьОбласть(ПерваяОбласть, ПоследняяОбласть, ТипСмещенияТабличногоДокумента.ПоВертикали, ложь); 
            Строки.Добавить(ПоследняяСтрока);
            //Переименовываем параметры
            Для СчСтр=1 По ВысотаСтроки Цикл
                Для СчКол=1 По ТабДок.ШиринаТаблицы Цикл
                    ТекЯч=ТабДок.Область(ПоследняяСтрока+СчСтр-1, СчКол, ПоследняяСтрока+СчСтр-1, СчКол);
                    //Если это нумерной параметр
                    Если Прав(ТекЯч.Параметр,1)="1" Тогда
                        ТекЯч.Параметр=Лев(ТекЯч.Параметр, СтрДлина(ТекЯч.Параметр)-1)+Формат(КоличествоСекций, "ЧДЦ=0; ЧГ=")
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
    КонецЕсли;
КонецФункции
Закладка

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2020 | Mista.ru

Яндекс.Метрика