Каких результатов удалось достичь
Изначально, печатная форма, содержащая ~200 страниц выводилась(речь идет об именно выводе в табличный документ) > 15 минут. В результате оптимизации удалось сократить время до 1-2 минут.
Последовательность действий:
- Объявляем ТабличныйДокумент как ранее, настраиваем его свойства(Масштаб, ориентация страницы, поля);
- Объявляем еще один табличный документ, назовем его ИтоговыйТабличныйДокумент, копируем в него все свойства ранее созданного;
- Выполняем вывод одной страницы в ТабличныйДокумент, проверяем, умещается ли он или нет с помощью метода ПроверитьВывод()
- Когда вывод не умещается на странице ТабличныйДокумент, то:
- Выполняем его вывод в ИтоговыйТабличныйДокумент методом Вывести(ТабличныйДокумент)
- Очищаем ТабличныйДокумент
- Выводим шапку(если требуется) в Табличный документ
- Пункты 3-4 повторяются в цикле, как и при обычном формировании печатных форм
- В конце формирования выводим подвал в ИтоговыйТабличныйДокумент
Как это выглядит в программе
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ИнвентаризационнаяОписьВРазрезеГоловныхИзделий";
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДокумент.МасштабПечати = 90;
Макет = ПолучитьМакет("ИнвентаризационнаяОпись");
// Документ используется для вывода по страницам
ИтоговыйТабДок = Новый ТабличныйДокумент;
ЗаполнитьЗначенияСвойств(ИтоговыйТабДок, ТабДокумент);
НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;
Запрос = Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| ИнвентаризацияНЗП.Организация,
| ИнвентаризацияНЗП.Подразделение,
| ИнвентаризацияНЗП.Ссылка,
| ИнвентаризацияНЗП.Номер,
| ИнвентаризацияНЗП.Дата,
| ИнвентаризацияНЗП.Заказ,
| ИнвентаризацияНЗП.ВводитьЗаказыПоСтрокам,
| ИнвентаризацияНЗП.Заказ.Представление КАК ЗаказПредставление,
| ИнвентаризацияНЗП.Организация.Представление КАК ОрганизацияПредставление,
| ИнвентаризацияНЗП.Подразделение.Представление КАК ПодразделениеПредставление
|ИЗ
| Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП
|ГДЕ
| ИнвентаризацияНЗП.Ссылка = &ТекДок";
Запрос.УстановитьПараметр("ТекДок", СсылкаНаОбъект);
Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();
ИнфоОрг = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Организация, СсылкаНаОбъект.Дата);
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.ПечНомерДок = Шапка.Номер;
Область.Параметры.ПечДатаДок = Шапка.Дата;
Область.Параметры.ПечОрганизация = ИнфоОрг.ПолноеНаименование;
Область.Параметры.ПечПодразделение = Шапка.ПодразделениеПредставление;
Область.Параметры.КодОКПО = ИнфоОрг.КодПоОКПО;
Область.Параметры.Организация = Шапка.Организация;
Область.Параметры.Подразделение = Шапка.Подразделение;
ТабДокумент.Вывести(Область);
ОбластьТабШапка = Макет.ПолучитьОбласть("ТабШапка");
ТабДокумент.Вывести(ОбластьТабШапка);
Индекс = 0;
ВсегоТМЦ = 0;
ВсегоКолФакт = 0;
ВсегоКолОПУ = 0;
ВсегоКолОтк = 0;
КолФактСтр = 0;
СтрокНаЛисте = 5;// Изменим, подбирается опытным путем
НПП = 0;
ВсегоСтраниц = 0;
ВсегоИзделий = ДанныеДляПечати.Строки.Количество();
ОбластьПодвал = Макет.ПолучитьОбласть("ПодвалСтраницы");
Для Каждого СтрокаДЗ1 Из ДанныеДляПечати.Строки Цикл
Состояние("Производится вывод печатной формы (изделие "+ (ДанныеДляПечати.Строки.Индекс(СтрокаДЗ1) + 1) + "/" + ВсегоИзделий + "). Стр. " + ВсегоСтраниц);
Область = Макет.ПолучитьОбласть("СтрокаПродукция");
Область.Параметры.ПечНоменклатура = СтрокаДЗ1.НоменклатураПредставление;
Область.Параметры.Номенклатура = СтрокаДЗ1.Номенклатура;
Область.Параметры.ПечКолБух = Формат(СтрокаДЗ1.Количество, "ЧЦ=15; ЧДЦ=3");
Область.Параметры.ПереченьЗаказов = СтрокаДЗ1.ПереченьЗаказов;
ТабДокумент.Вывести(Область);
Для Каждого СтрокаДЗ2 Из СтрокаДЗ1.Строки Цикл
// Делаем через проверить вывод
Индекс = Индекс + 1;
ВсегоТМЦ = ВсегоТМЦ + 1;
НПП = НПП + 1;
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.ПечНомер = Формат( НПП, "ЧЦ=6; ЧН=");
Область.Параметры.ПечНоменклатура = СтрокаДЗ2.НоменклатураПредставление;
Область.Параметры.Номенклатура = СтрокаДЗ2.Номенклатура;
//Область.Параметры.ПечШифрИВЦ = Шифр;
Область.Параметры.ПечКодТМЦ = СокрЛП(СтрокаДЗ2.НоменклатураКод);
Область.Параметры.ПечКодЕИ = СтрокаДЗ2.ЕдиницаИзмеренияКод;
Область.Параметры.ПечЕИ = СтрокаДЗ2.ЕдиницаИзмерения;
Область.Параметры.ПечКолБух = Формат(СтрокаДЗ2.Количество, "ЧЦ=15; ЧДЦ=3");
// Если с подвалом не умещается - выводим подвал, начинаем новую страницу
МассивДляПроверки = Новый Массив;
МассивДляПроверки.Добавить(Область);
//МассивДляПроверки.Добавить(ОбластьПодвал);
Если ТабДокумент.ПроверитьВывод(МассивДляПроверки) = ЛОЖЬ Тогда
// Подвал страницы просили не выводить
//ОбластьПодвал.Параметры.КолНомСтр = Индекс;
//ОбластьПодвал.Параметры.ИтогКолСтр = КолФактСтр;
//ТабДокумент.Вывести( ОбластьПодвал);
Индекс = 0;
КолФактСтр = 0;
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
СтрокНаЛисте = 10; // Изменено - подбирается опытным путем Это было раньше (На первом листе 9 строк, на остальных 30)
ВсегоСтраниц = ВсегоСтраниц + 1;
// Переносим изменения в итоговый документ, очищаем оригинал, выводим шапку на след.странице
ИтоговыйТабДок.Вывести(ТабДокумент);
ТабДокумент.Очистить();
ТабДокумент.Вывести(ОбластьТабШапка);
КонецЕсли;
ОбработкаПрерыванияПользователя();// На всякий случай
ТабДокумент.Вывести(Область);
КолФактСтр = КолФактСтр + СтрокаДЗ2.Количество;
ВсегоКолФакт = ВсегоКолФакт + СтрокаДЗ2.Количество;
КонецЦикла;
КонецЦикла;
Область = Макет.ПолучитьОбласть("Итого");
Область.Параметры.ПечКолФактИтого = Формат( ВсегоКолФакт, "ЧЦ=15; ЧДЦ=3");
// Подвал страницы просили не выводить
//ТабДокумент.Вывести( Область);
//Если Индекс > 0 Тогда
// ОбластьПодвал = Макет.ПолучитьОбласть("ПодвалСтраницы");
// ОбластьПодвал.Параметры.КолНомСтр = Индекс;
// ОбластьПодвал.Параметры.ИтогКолСтр = КолФактСтр;
// ТабДокумент.Вывести( ОбластьПодвал);
//КонецЕсли;
Область = Макет.ПолучитьОбласть("Подвал");
Область.Параметры.ВсегоТМЦ = ВсегоТМЦ;
Область.Параметры.ИтогоКолОпись = ВсегоКолФакт;
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
ТабДокумент.Вывести( Область);
//УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДокумент, НомерСтрокиНачало, Новый СписокЗначений, СсылкаНаОбъект);
// Выведем всяческие подвалы
ИтоговыйТабДок.Вывести(ТабДокумент);
Бонусом идет печатная форма для УПП 1.3, в которой присутствует этот кусок кода