Небольшой кейс оптимизации. Ускоряем печать табеля УПП

15.09.22

База данных - HighLoad оптимизация

Будет проведено небольшое расследование производительности без профайлера и трансляторов запроса. Вместо всего этого, ограничимся набором ИР от Tormozit. Дисклеймер: результат не гарантирован, у нашей базы своя специфика, у вас эффект может быть другим.

Файлы

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

Наименование Скачано Купить файл
(только для физ. лиц)
Печатная форма табеля ускоренная
.epf 31,46Kb
2 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Итак, начнем с того, что включим Замер производительности из Конфигуратора при печати табеля. Находим узкое место, благо, что оно есть, и ставим там точку остановки.

 

 

 

Запускаем печать табеля ещё раз, попадаем на точку остановки, жмём Shift-F9 (или Меню - Отладка - Вычислить выражение), выполняем команду:

"ВнешниеОбработки.Создать("<Путь к вашему ИР>\ирПортативный.epf", Ложь).От(ЗапросТабель)",

 

 

открываем консоль с запросом. Можно, на всякий случай, сохранить его в файл. В консоли запускаем запрос на выполнение, 

 

 

перейдем на закладку "Запрос результат", нажмем пункт меню "Статистика MSSQL"

 

 

Здесь, возможно, придется ввести данные для доступа к MSSQL. Важно не перепутать, вводим администраторские данные для входа именно в MSSQL, а не 1С

 

 

Мы получим список всех запросов, которые выполнились во время работы нашего суперзапроса. Находим среди них самый тяжелый (например, по столбцу Tot CPU Time) щелкаем на нем, далее Открыть план,

 

 

смотрим на План выполнения запроса и.... ничего интересного я там не нашел, индексы на месте.

Ладно, пойдем другим путем. Смотрим на текст запроса в столбце "Текст запроса мета" и находим этот кусок в главном тексте запроса. В нашем случае, это создание таблицы "ВТГрафикиРаботыПоВидамВремени".

 

 

Глаз сразу цепляется за "Объединить все" в подзапросе. Вспоминаем по многочисленным публикациям, что подзапрос должен быть как можно проще, желательно одна небольшая временная таблица.

ОК, так и сделаем. Создадим на всякий случай копию запроса и уже там заменим объединение двух временных таблиц на одну новую. Можно сделать  это руками, но мы воспользуемся возможностями инструмента "Конструктор запроса ИР".

 

 

Найдем слева нашу таблицу "ВТГрафикиРаботыПоВидамВремени", справа отбор. Провалимся в наш отбор и преобразуем Запрос во временную таблицу 

 

 

Долее, все сохраняем (Ок - Ок), запускаем на исполнение и вуаля, ускорение более, чем в 3 раза в консоли запроса.

 

 

В Замере производительности 

 

 

Внимание, во время манипуляций "Консоль запроса ИР" проставит кучу мусорных условий типа "Истина И". И я не знаю, как их разом убрать.

 

Табель побольше, другая организация

Проверим другой табель. Сначала всё то же самое, узкое место в этой же строке. Пройдя по проторенной дорожке, найдем медленный запрос. Здесь это уже другой запрос, смотрим его план выполнения. 

 


Бросается в глаза большой объем передаваемых данных, полмиллиона записей в небольшом табеле. По аналогии, находим нужное место в тексте запроса, это создание временной таблицы "ВТНеобработанныеПлановыеНачисленияРаботниковОрганизаций".

 

Там мы видим слабый фильтр по огромному регистру ПлановыеНачисленияРаботниковОрганизаций -

"И ПлановыеНачисленияРаботниковОрганизаций.Период <= &КонецПериода".

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

     "И ПлановыеНачисленияРаботниковОрганизаций.Период <= &КонецПериода

     И НЕ(ПлановыеНачисленияРаботниковОрганизаций.ПериодЗавершения < &НачалоПериода

И ПлановыеНачисленияРаботниковОрганизаций.ДействиеЗавершения = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить))"

Поток данных снизился

 

 

выигрыш составил 4 секунды.

Вау, мы великолепны? Нет, мы ещё не рассмотрели самые большие табели.

 

Самый большой табель.

На больших табелях эффект от нашей оптимизации почти незаметен, так как узким местом является другая строка.

 

 

Это известная проблема метода ПроверитьВывод. Есть хорошее описание и способы решения на здесь на ИС . Идея в том, что завести еще один, вспомогательный Табличный документ и проверять вывод на нем и регулярно очищать его. Потому что, на больших табличных документах проверка вывода идет намного-намного, просто экспоненциально медленнее.

Итак, в начале процедуры "СформироватьМакет" создаем новый Табличный документ

Если Не ПроцедурыУправленияПерсоналомПереопределяемый.РегламентированныйКалендарьЗаполнен(НачалоПериода, КонецПериода, Истина) Тогда
	Если Режим = "Табель" Тогда 
		Возврат;
	КонецЕсли;
КонецЕсли;

ДокументРезультат.Очистить();

///+++
_ДокументРезультат = Новый ТабличныйДокумент;						
ЗаполнитьЗначенияСвойств(_ДокументРезультат, ДокументРезультат);	
///+++
	

Везде, где встречается "ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();" добавляем две строки

Если Не ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ДокументРезультат, ОбластьДанныхСтрока) Тогда
	ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
	///+++
	_ДокументРезультат.Вывести(ДокументРезультат);		
	ДокументРезультат.Очистить();
	///+++
	ДокументРезультат.Вывести(ОбластьДанныхКолонтитул);
КонецЕсли;

 

Если Не ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ДокументРезультат, ОбластьДанныхПодвал) Тогда
	ПоследняяСтрокаЛиста = ДокументРезультат.ПолучитьОбласть(ДокументРезультат.ВысотаТаблицы - 3,,ДокументРезультат.ВысотаТаблицы,);
	ДокументРезультат.УдалитьОбласть(ДокументРезультат.Область(ДокументРезультат.ВысотаТаблицы - 3,,ДокументРезультат.ВысотаТаблицы,),);
	ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
	///+++
	_ДокументРезультат.Вывести(ДокументРезультат);
	ДокументРезультат.Очистить();
	///+++
	ДокументРезультат.Вывести(ОбластьДанныхКолонтитул);
	ДокументРезультат.Вывести(ПоследняяСтрокаЛиста);
КонецЕсли;

 

Ну и в конце процедуры "СформироватьМакет" тоже добавим несколько строк.

	///+++
	_ДокументРезультат.Вывести(ДокументРезультат);		
	ДокументРезультат.Очистить();
	ДокументРезультат = _ДокументРезультат;				
	///+++
КонецПроцедуры // СформироватьОтчет()

В результате, на табеле в 150 -200 сотрудников ускорение печати в 3 раза,

 

 

на табеле в 400 сотрудников - в 4 раза

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

В качестве иллюстрации и для сравнения с типовой прилагаю модифицированную печатную форму, проверена на УПП 1.3.186.1 и ЗУП КОРП 2.5.175.1.

Вступайте в нашу телеграмм-группу Инфостарт

Оптимизация Ускорение Табель УПП ЗУП2.5 ПечатнаяФорма

См. также

HighLoad оптимизация Программист 1С v8.3 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    5485    ivanov660    39    

59

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    8080    ivanov660    13    

60

HighLoad оптимизация Программист 1С v8.3 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    13388    Evg-Lylyk    69    

45

HighLoad оптимизация Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    6466    spyke    29    

52

HighLoad оптимизация Программист 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    9648    vasilev2015    22    

44

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

5 стартмани

15.02.2024    16123    310    ZAOSTG    100    

121
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 15.09.22 10:52
Сообщение было скрыто модератором.
...
2. Steelvan 308 15.09.22 11:27 Сейчас в теме
Коробка оптимизации ?
4. TMV 4 11.10.22 07:19 Сейчас в теме
(2)
Прикрепленные файлы:
3. Painted 49 15.09.22 12:39 Сейчас в теме
(2) Дык, чемодан же, че-мо-дан.
Коробка - это бокс.
TMV; SerVer1C; +2 Ответить
5. tormozit 7292 15.10.22 22:58 Сейчас в теме
"Консоль запроса ИР" проставит кучу мусорных условий типа "Истина И". И я не знаю, как их разом убрать.

У подсистемы есть чат как раз для таких коротких вопросов. Эти фрагменты добавляет "конструктора запроса ИР", а не "Консоль запросов ИР". Поэтому надо в настройках конструктора отключить флажок "Иерархический стиль логических выражений".
Прикрепленные файлы:
6. tormozit 7292 15.10.22 23:04 Сейчас в теме
Локализация тяжелых участков запроса в консоли запросов ИР бегло описана в разделе "Отладка подзапросов" статьи "Отладка логики запроса в консоли запросов ИР" https://infostart.ru/1c/articles/1355985/
Оставьте свое сообщение