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

14.08.20

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пакетная печать из 1С в MS Word после оптимизации
.epf 92,15Kb ver:1.0
7
7 Скачать (1 SM) Купить за 1 850 руб.
Пакетная печать из 1С в MS Word до оптимизации
.epf 85,18Kb ver:1.0
0
0 Скачать (1 SM) Купить за 1 850 руб.

Однажды появилась задача ускорить печать из 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! 15%

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

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

22200 19980 руб.

06.10.2023    15444    35    7    

70

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

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

4800 руб.

21.08.2019    20280    75    10    

24

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

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

6000 руб.

30.03.2023    6423    5    0    

7

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

Мастер пакетной печати отгрузочных и товаросопроводительных документов. Продукт оптимизирован для алкогольной продукции. Поддерживает печатные формы ТОРГ-12, счет-фактура, разделы А и Б справки к ТТН, копии сертификатов, ТТН (1-Т), а также ТН (Приложение4). Все формы заполняются автоматически, а данные в полях формы (актуально для ТН и ТТН) сохраняются для каждого документа и не требуют заполнения при повторных открытиях. Предназначена для конфигурации "1С:Управление торговлей" , ред. 10.3, ред. 11.1, "1С:Бухгалтерия предприятия, ред. 3.0". Не требует изменений конфигурации. Печать суммы акциза в с/ф, УПД и справке А. Поддержка требований торговых сетей "Метро" и "Ашан".

6000 руб.

04.04.2013    129720    142    188    

112

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

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

2280 руб.

15.04.2014    53488    53    51    

41

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

Внешние печатные формы УПД (Универсальный передаточный документ), Счет-фактура (+ корректировочный) (+ "в валюте") в редакции постановления Правительства РФ №1096 от 01.10.2024 для 1С 8 Управление торговлей 11.5, Комплексная автоматизация, Управление предприятием ERP 2.5 для документов вида "Реализация товаров и услуг", "Счет-фактура (выданный)". С данными прослеживаемости.

1 стартмани

27.09.2024    3197    359    zhuravlev_as    33    

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