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; ЧГ=")
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецФункции |