Каталог решений - Решение проблемы ПроверитьВывод() для огромных документов

Решение проблемы ПроверитьВывод() для огромных документов

Решение проблемы ПроверитьВывод() для огромных документов

В наличии

Пример того, как я ускорил вывод большого табличного документа(100+ страниц)

Категория:

Описание

Каких результатов удалось достичь

Изначально, печатная форма, содержащая ~200 страниц выводилась(речь идет об именно выводе в табличный документ) > 15 минут. В результате оптимизации удалось сократить время до 1-2 минут.

Последовательность действий:

  1. Объявляем ТабличныйДокумент как ранее, настраиваем его свойства(Масштаб, ориентация страницы, поля);
  2. Объявляем еще один табличный документ, назовем его ИтоговыйТабличныйДокумент, копируем в него все свойства ранее созданного;
  3. Выполняем вывод одной страницы в ТабличныйДокумент, проверяем, умещается ли он или нет с помощью метода ПроверитьВывод()
  4. Когда вывод не умещается на странице ТабличныйДокумент, то:
    1. Выполняем его вывод в ИтоговыйТабличныйДокумент методом Вывести(ТабличныйДокумент)
    2. Очищаем ТабличныйДокумент
    3. Выводим шапку(если требуется) в Табличный документ
  5. Пункты 3-4 повторяются в цикле, как и при обычном формировании печатных форм
  6. В конце формирования выводим подвал в ИтоговыйТабличныйДокумент

Как это выглядит в программе

    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ИнвентаризационнаяОписьВРазрезеГоловныхИзделий";
    ТабДокумент.ОриентацияСтраницы  = ОриентацияСтраницы.Портрет;
    ТабДокумент.МасштабПечати = 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, в которой присутствует этот кусок кода

has been added to your cart:
Оформление заказа