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

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 оптимизация Программист 1C:ERP Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    5265    ivanov660    48    

51

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

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

18.02.2025    8109    ivanov660    39    

61

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

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

24.06.2024    10536    ivanov660    13    

64

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

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

06.06.2024    16507    Evg-Lylyk    73    

46

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

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

13.03.2024    8109    spyke    29    

54

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

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

13.03.2024    11437    vasilev2015    22    

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

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