Оптимизация пакетной печати из 1С в MS Word

14.08.20

Задачи пользователя - Пакетная печать

Опыт оптимизации пакетной печати из 1С ЗУП 3.1 в MS Word. Об осторожности использования БСП. Внешние обработки: до и после оптимизации.

Скачать файлы

Наименование Файл Версия Размер
Пакетная печать из 1С в MS Word после оптимизации
.epf 92,15Kb
7
.epf 1.0 92,15Kb 7 Скачать
Пакетная печать из 1С в MS Word до оптимизации
.epf 85,18Kb
0
.epf 1.0 85,18Kb Скачать

Однажды появилась задача ускорить печать из 1С в документы MS Office Word. Формирование документов происходит около 60-90 секунд.

Программы: «1С:Зарплата и управление персоналом, редакция 3.1.14.98», MS Office Word 2016.

Много ранее я работал с печатью в MS Word, и проблем с производительностью не возникало, но и шаблон был всего один, и заполнение каждого параметра было прописано кодом, и БСП не использовалось.

В данном же случае: внешняя обработка печатает 3 шаблона, вызывается функция БСП для каждого шаблона; соответственно, параметры заполняются в функции БСП.

Я запустил замер производительности конфигуратором, чтобы посмотреть, какие именно строки занимают более всего времени.

Результат замера

В топе находятся строки кода, которые работают с шаблоном MS Word через COM-соединение. Суммарно первые строки занимают время: 20+14+12+6+6+6 = 64 секунды — это почти 60% времени. Если удастся сократить это время хотя бы на половину, но эффект уже будет заметен.

Разбираем каждую строку.

Строка №1.

Первая строка (Object.Select();) выполняется 219 раз — это достаточно много. Возникает вопрос: почему так много раз она выполняется? Может, в шаблонах так много параметров? Суммарно в шаблонах оказалось 95 параметров. Смотрим стек вызовов и находим причину столь частого выполнения кода.

На уровень раньше видим цикл.

Значит, в переменную ДанныеОбъекта передается излишне больше параметров, чем на самом деле необходимо.

Смотрим, откуда передается столько параметров, т.е. еще на уровень раньше.

Переменная Данные передана, поэтому переходим еще на уровень раньше.

Снова передача переменной Данные, поэтому снова переходим на уровень раньше.

 

Это процедура ПечатьМакета. В данном случае то, что передавалось в предыдущих переменных Данные — это значение переменной лПараметры (тип Соответствие), которое заполняется запросом, но заполняется всевозможными данными, нужными и ненужными, после чего вызывается процедура БСП.

Первая неоптимальность найдена — передача в процедуру БСП заранее лишнего количества параметров. Решить данную ситуацию можно просто: передать только необходимое количество параметров, которые используются в шаблоне.

Далее если вернуться еще на уровень раньше, то видим самое начало — процедура Печать.

Процедура Печать выполняет печать трех шаблонов, иными словами, три раза вызывает одну и ту же процедуру ПечатьМакета, в которой одна из неоптимальностей уже найдена.

Решено так: отдельная процедура заполняет только нужные параметры, ничего лишнего.

Немного про особенность замены.

На сайтах предлагается следующий вариант замены:

Процедура ЗаменитьНестабильно(знач Object, Параметр, Значение, ДополнитьПараметрОтличСимволами = Истина) 
	СтрокаПоиска = ?(ДополнитьПараметрОтличСимволами, "{v8 " + Параметр + "}", Параметр);
  	СтрокаЗамены = Строка(Значение);
	Попытка
 		Object.Find.Execute(СтрокаПоиска,,,,,,,,,Значение, 2);
	Исключение
		ОпОш = ОписаниеОшибки();
		ЗаписьЖурналаРегистрации("ЗаменаПарамтровWord", УровеньЖурналаРегистрации.Ошибка, , ОпОш, ОпОш);
	КонецПопытки;
КонецПроцедуры 

Однако этот способ показал свою нестабильность следующим образом:

Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (0x80020005)

И более никакой информации, никаких подробностей; в интернете искать можно долго и безрезультатно; исследовать можно тоже долго и безрезультатно.

Поэтому замена выполнена типовой процедурой.

Строка №2.

Перейдем ко второй топовой времязатратной строке замера:

Handler.НастройкиСтраницыМакета.Вставить(ИмяНастройки, COMОбъект.ActiveDocument.PageSetup[ИмяНастройки]);

Смотрим, в каком именно месте она вызывается.

Вызывается эта строка 69 раз в типовой функции ПолучитьМакетMSWord, получающей макет MSWord. Так как шаблон MS Word сохранен в макете с уже заранее настроенными параметрами, то в данном случае вызываемая строка просто лишняя. Исключая данную строку, функционал остается прежним и сокращается время формирования на 14 секунд.

Строка №3.

Теперь рассмотрим третью времязатратную строку:

COMОбъект = Новый COMОбъект("Word.Application");

Смотрим, в каком именно месте она вызывается.

Объект COM создается три раза в той же типовой функции ПолучитьМакетMSWord.

Однако COM объект MS Word способен работать с несколькими документами MS Word, поэтому в данном случае создаются лишние COM объекты, на которые затрачивается время.

Решение: создание только одного COM объекта, с помощью которого заполняются все три шаблона. Решена эта ситуация кешированием COM соединения следующим образом.

Строка №4.

Четвертая строка аналогична третьей:

COMОбъект = Новый COMОбъект("Word.Application");

Но вызывается данная строка в типовой функции ИнициализироватьПечатнуюФормуMSWord тоже три раза.

Возникает вопрос: если в типовой функции ПолучитьМакетMSWord уже создан COM объект, то почему же вызывается типовая функция ИнициализироватьПечатнуюФормуMSWord, в которой тоже создается COM объект?

По стеку вызовов находим процедуру, в которой вызывается функция ИнициализироватьПечатнуюФормуMSWord, и попадаем во внешнюю обработку.

По коду видно, похоже, была попытка обойтись средствами БСП, пренебрегая производительностью, так как вызваны две функции, создающие COM объект, и обе функции в цикле.

В данном случае функцию ИнициализироватьПечатнуюФормуMSWord можно исключить, используя только переменную Макет.

Строка №5.

Рассмотрим пятую времязатратную строку.

Поиск = COMСоединение.Selection.Find;

Строка вызывается три раза в типовой функции ПолучитьПозициюНачалаОбласти перед непосредственным поиском и заменой.

Так как достаточно использовать типовую процедуру Заменить, которая выполняет замену параметров по всему документу, то функцию ПолучитьПозициюНачалаОбласти можно исключить.

После оптимизации кода получаем следующий замер.

Результат оптимизации — всего 14-16 секунд вместо 90.

Во вложении к публикации обработки до и после оптимизации.

 

Выводы

  1. Нельзя сразу использовать функции БСП. Это влияет на производительность. Нужно смотреть функцию БСП и предусматривать влияние при ее использовании.
  2. Функции БСП содержат код, который может быть лишним при решении конкретной задачи, в результате лишний код влияет на производительность.

оптимизация MS Word работа с пакетная печать из в Печать ЗУП обработка быстрая COM несколько кэширование кэш кеш Wordd

См. также

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7333    22    6    

39

Программа групповой печати чеков ККМ Атол и Штрих из текстового файла, поддержка 54-ФЗ от 01.07.19

Пакетная печать ККМ Кассовые операции Загрузка и выгрузка в Excel Россия Бухгалтерский учет Платные (руб)

Предназначена для групповой печати чеков. Что печатать в теле чека описано в текстовом файле с разделителем запятая (CSV) Подходит для любого языка программирования который умеет записывать в текстовый файл

2000 руб.

26.07.2019    24962    38    17    

23

Групповая печать чеков из банковской выписки с настройкой (БП 3.0)

Пакетная печать Банковские операции Кассовые операции Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Платные (руб)

Обработка для групповой печати чеков ККМ с настройкой, загруженных из банковской выписки. На основании документа Поступление на расчетный счет!

4800 руб.

21.08.2019    19817    69    10    

23

Журнал учета ТТН (исходящих и от поставщика) для Бухгалтерии предприятия, редакция 3.0

Пакетная печать Документооборот и делопроизводство (СЭД) Оптовая торговля Печатные формы Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обработка содержит новую форму Транспортной накладной с 01.01.2021 г. (в ред. Постановления Правительства РФ от 30.11.2021 № 2116) В отличие от внешних печатных форм, подключаемых к документу реализации, позволяет вести отдельный журнал документов. Дополнительным преимуществом является возможность формирования документов за поставщика.

2280 руб.

15.04.2014    52569    50    50    

38

Групповая пакетная печать документов "Реализация товаров и услуг" и связанных с ними "Счетов-фактур"

Пакетная печать Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Работаете с сетями, у каждой из которых свои требования к оформлению документов? Клиент попросил перепечатать документы за год? Печатаете по 100-500 документов в день, тогда эта обработка Вам просто необходима. Данная обработка позволит Вам сэкономить время при больших объемах печати документов по отгрузке товаров и не только.

1000 руб.

29.09.2016    35803    20    5    

22

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Пакетная выгрузка стандартных бухгалтерских отчетов

Пакетная печать Регламентированный учет и отчетность Файловый обмен (TXT, XML, DBF), FTP Загрузка и выгрузка в Excel Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Быстрое формирование сразу нескольких видов стандартных бухгалтерских отчетов - .Анализ счета, Карточка счета, Оборотно-сальдовая ведомость по счету, Отчет по проводкам. В периоды проведения проверок со стороны ФНС в деятельности предприятий часто возникает необходимость предоставления сведений из бухгалтерского учета. Обработка сократит время на формирование отчетов бухгалтеру.

6000 руб.

30.03.2023    6076    4    0    

6

Печать на стороне сервера при помощи Ghostscript

Инструментарий разработчика Пакетная печать Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Пример выполнения печати на принтер на сервере 1С используя библиотеку Ghostscript

1 стартмани

17.10.2022    4026    19    prog-1s    1    

8
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. malikov_pro 1292 14.08.20 11:03 Сейчас в теме
Тема интересна, есть ли у Вас желание реализовать в виде расширения под БСП и опубликовать в git?
При вставке в word файл встречал некорректные параметры вставки, что сносило стили, добавил бы в вашу наработку.
unknown181538; +1 Ответить
2. rusmil 262 14.08.20 12:30 Сейчас в теме
Просто "спортивный интерес", сколько у Вас ушло времени на анализ программного кода и оптимизацию для ускорения?
4. info1i 223 15.08.20 14:45 Сейчас в теме
(2) На одну обработку у меня ушло около 10 часов, а обработок было несколько. Но это число ни о чем не говорит: ни со стороны уровня, ни со стороны спорта.
Невозможно соревноваться в разных средах. Один и тот же программист часто выполняет одну и ту же задачу за разное время, так как среды отличаются. Спортивный интерес можно воспроизвести только в одинаковых условиях (одинаковой среде).
Нужно учитывать много факторов, влияющих на трудозатраты.
5. info1i 223 15.08.20 19:46 Сейчас в теме
(1) Предложение позитивное по поводу создания совместного расширения на гитхабе. Однако есть некоторые опасения о бесполезности на будущее.
1) Вот представьте: создали мы расширение под БСП; а в следующем n-релизе "типовые" разработчики переместили код в новые модули и функции вообще перестроили до неузнаваемости так, что заново все придется делать; и наши с вами труды насмарку.
И такое безобразие я наблюдаю уже на протяжении лет 5, поэтому рискованно основывать свои разработки на БСП.
2) Другое дело - это без БСП-основы разработка расширения, содержащего отдельные модули, работающие с Word; код стабильно находится в одном и том же месте, никто его не ломает; конечно, это можно.
Вы за второй вариант?
unknown181538; rusmil; +2 Ответить
3. SlavaKron 14.08.20 13:59 Сейчас в теме
Хорошее расследование. Я бы и так не доверил БСП работу с Word.Application. Мне кажется, БСП с ее избыточным формализмом не подходит для работы с ком-объектами, когда любое обращение к внешнему объекту должно быть сведено до минимума.
П.С. Советую включить сглаживание шрифтов – берегите глаза!
Оставьте свое сообщение