Як друкувати правильні звіти

Цей спосіб можна застосувати для формування красивих звітів. Наприклад, при виведенні звіту щодо руху товару, було б чудово виключити ситуації, коли інформація по одному товару починається внизу сторінки, а її продовження переходить на іншу сторінку, тоді як загальний розмір цієї інформації не перевищує третини сторінки.

Виявляється, зробити це не просто, а дуже просто

Для прикладу я взяв звіт "Відомість по Партіям ТМЦ" з типової конфігурації "Торгівля та склад" версії 9.21.

Розміщуємо на формі поряд зі списком налаштування деталізації ще один список. У цьому другому списку ми будемо відзначати, за якими угрупованнями необхідно переходити на нову сторінку, якщо вся інформація по ній не міститься на поточній.

правильні

У модулі форми звіту до кінця додаємо код (виділений кольором), який ініціалізує наш список значень.

Групування.ДодатиЗначення("Фірма","Фірма"); Угруповання.ДодатиЗначення("СтатусПартії","Статус партії"); Угруповання.ДодатиЗначення("МОЛ","МОЛ"); Угруповання.ДодатиЗначення("Постачальник","Постачальник"); Угруповання.ДодатиЗначення("Номенклатура","Номенклатура"); Угруповання.ДодатиЗначення("ВластивістьПартії","Властивість партії"); Угруповання.ДодатиЗначення("Партія","Партія"); Угруповання.ДодатиЗначення("Документ","Документи руху");

Групування. Позначка (1, 1); Угруповання.Помітка(3, 1); Угруповання.Помітка(5, 1);

спНаСторінці.ДодатиЗначення("Фірма","Фір"); спНаСторінці.ДодатиЗначення("СтатусПартії","СтП"); спНаСторінці.ДодатиЗначення("МОЛ","МОЛ"); спНаСторінці.ДодатиЗначення("Постачальник","Пост"); спНаСторінці.ДодатиЗначення("Номенклатура","Ном"); спНаСторінці.ДодатиЗначення("ВластивістьПартії","СвП"); спНаСторінці.ДодатиЗначення("Партія","Пар"); спНаСторінці.ДодатиЗначення("Документ","Док");

Синхронізуємо зміну порядку значень у двох списках, шляхом зміни відповідної процедури.

Процедура ЗмінаПорядкуГруп(НапрямокЗсуву)

ТекСтр = Групування.ПоточнаРядок (); ПослСдвигСтр = Групування.РозмірСписку() - 1; Якщо ТекСтр спНаСторінці.ЗрушитиЗначення(НапрямокЗсуву, ТекСтр); КінецьЯкщо; Інакше Попередження("Угруповання "За документами руху"" завжди знаходиться наприкінці списку і не переміщається.",60); КінецьЯкщо;

КінецьПроцедури

Прикріплюємо виведення рядків до наступних. (Не дуже зрозуміло, але кращого визначення я просто не вигадав

Для цього: відкриваємо таблицю, виділяємо всі рядки, що входять до горизонтальних секцій, і встановлюємо для них прапорець "Разом з наступним" ("Таблиця-Положення на сторінці").

Тепер звіт буде нерозривним блоком, який намагатиметься виводитися на одній сторінці. Цьому заважатиме лише закінчення сторінки. Якщо вставити в потрібних місцях свого роду "м'які роздільники", які поділять звіт на кілька нерозривних блоків, то кожен блок почнеться з нової сторінки, якщо не поміститься на поточну.

Робимо цей "м'який роздільник".

Створюємо нову секцію. Називаємо її "Перенесення".

Виділяємо рядок, вибираємо "Таблиця-Положення на сторінці" та перевіряємо, щоб опція "Разом з наступним" була відключена. Тепер цей рядок може бути останнім на сторінці у нерозривному блоці.

Трохи змінюємо процедуру виведення угруповання звіту.

Процедура ВивестиУгруповання(Запит,Ном)

Якщо Ном = Номер Угруповання (ПТМЦ) і(Запит.Це Група (Назва Угруповання) = 0) Тоді Назва Секції = Назва Секції + "К"; КінецьЯкщо;

ПечТекстРядки = Запит.ОтриматиАтрибут(НазваУгруповання); Якщо спНаСторінці.Помітка( спНаСторінці.ЗнайтиЗначення(НазваУгруповання))=1 Тоді Таб.ВивестиСекцію("Перенесення"); КінецьЯкщо; Якщо (ТипЗначенняСтор(ПечТекстРядки) = "Документ") або (ТипЗначенняСтор(ПечТекстРядки) = "Довідник") Тоді ТекРозшифрування = ПечТекстРядки; Інакше ТекРозшифрування = ""; КінецьЯкщо;

Якщо НазваГрупування = "Партія" Тоді ПечТекстРядки = СформуватиІнформаціюОПартії(ПечТекстРядки); ІнакшеЯкщо (НазваУгруповання = "ВластивістьПартії") і (ПорожнєЗначення(ПечТекстРядки) = 0) Тоді ПечТекстРядки = "" + ПечТекстРядки.Власник + ": " + СокрЛП(Печ ; ІнакшеЯкщо НазваУгруповання = "Документ" Тоді ПечТекстРядки = "" + глПоданняДокумента(ПечТекстРядки) + " (" + СокрЛП(глІнформаціяПоДокументуВЖурналі(ПечТекстРядки)) + ")"; КінецьЯкщо; ПечТекстРядки = ?(ПустоЗначення(ПечТекстРядки)=1, глПредставленняПустогоЗначення(НазваУгруповання),ПечТекстРядки); Якщо НазваУгруповання = "Документ" Тоді ДрукРядкиДокумента(Запит,Ном,НазваСекції,ПечТекстРядки, ТекРасшифровка,ТекОстС,ТекОстК); Інакше ДрукРядки(Запит,Ном,НазваСекції,ПечТекстРядки, ТекРасшифровка); КінецьЯкщо;

// якщо є більш детальне угруповання - виведемо його Якщо Кількість Угруповань > Ном Тоді ВивестиУгруповання(Запит,Ном+1); КінецьЯкщо;

КінецьПроцедури

Суть зміни: визначити момент початку виведення нового значення угруповання, за яким необхідно переносити сторінки, і вивести створений на попередньому кроці "м'який" роздільник.

Ось і всі зміни. Підсумуємо.

Нам знадобилося:

    Додати на форму додатковий елемент СписокЗначень, ініціалізувати його (вісім рядків коду) та додати ще один рядок на синхронізацію зі списком угруповань.

Змінити опцію "Разом із наступним" у всіх рядків таблиці.

Створити додаткову секцію порожню (у мене вона заповнена для наочності).

  • Додати три рядки коду для визначення необхідності та безпосередньо виведення роздільника.
  • Для простих звітів із жорстко заданими угрупованнями необхідність у пункті 1 відпадає взагалі, а в пункті 4 залишається лише один рядок, що безпосередньо виводить роздільник.

    На доопрацювання розглянутого звіту у мене пішло набагато менше часу, ніж на опис методики в цій статті, щось близько 20-30 хвилин.

    Для звіту з жорстко заданими угрупованнями описану модифікацію можна зробити буквально за п'ять хвилин.