Оценка производительности с помощью БСП

30.06.22

Разработка - БСП (Библиотека стандартных подсистем)

В данной статье будут рассмотрены базовые возможности подсистемы "Оценка производительности" в библиотеке стандартных подсистем.

Введение

Всем привет! В новой публикации - статье для очередного практического применения, рассмотрим базовые принципы работы со "вспомогательной" подсистемой Библиотеки стандартных подсистем - "Оценка производительности".

В материале статьи я приведу два примера использования "оценки производительности" - для обычных "линейных операций" и для "длительных операций" (фоновых). Данную тему считаю интересной для оценки возможностей ваших систем. Сам довольно часто использую данных функционал.

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

Разработка примеров ведется на конфигурации Библиотеки стандартных подсистем 3.1.7.82 (далее БСП) на платформе 1С:Предприятие 8.3.20.1674. Разработка ведется на файловом варианте базы.

 

Создание новой ключевой операции, встраивание ее в объект оценки произодительности.

Для начала, я подготовлю две ключевые операции, одну из которых, затем, встрою в объект. Делается это вот таким кодом:

 
 Создание Ключевой операции

 

&НаСервере
Процедура ПодготовкаМассиваКлючевыхОперацийСервер()
	
	КлючевыеОперации = Новый Массив();
	
	КлючеваяОперация1 = Новый Структура("ИмяКлючевойОперации, ЦелевоеВремя");
	КлючеваяОперация1.ИмяКлючевойОперации = "ТестоваяКлючеваяОперация1";
	КлючеваяОперация1.ЦелевоеВремя = 1;	
	
	КлючеваяОперация2 = Новый Структура("ИмяКлючевойОперации, ЦелевоеВремя");
	КлючеваяОперация2.ИмяКлючевойОперации = "ТестоваяКлючеваяОперация2";
	КлючеваяОперация2.ЦелевоеВремя = 1;	

	
	КлючевыеОперации.Добавить(КлючеваяОперация1);
	КлючевыеОперации.Добавить(КлючеваяОперация2);

	// Записи в справочник "Ключевые операции"
	ОценкаПроизводительности.СоздатьКлючевыеОперации(КлючевыеОперации);
	
	
КонецПроцедуры	

 

 

В результате, в справочнике ключевых операций появляется запись о ней:

 

Рис.1. Созданная ключевая операция "Тестовая ключевая операция1".

 

Далее, напишем код, который будет "ловить эту операцию" в обработке проведения документа. Исходный код обработки проведения пусть выглядит вот так:

 
 Исходный код процедуры ОбработкиПроведения

 

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	СформироватьДвиженияПоМестамХранения();
	
	СформироватьБухгалтерскиеДвижения();
	
КонецПроцедуры

 

 

Теперь, "обернем" этот код в "Оценку производительности":

 
 Оборачиваем код в "Оценку производительности"

 


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
    ВремяНачалаЗамера = ОценкаПроизводительности.НачатьЗамерВремени();

	СформироватьДвиженияПоМестамХранения();
	
	СформироватьБухгалтерскиеДвижения();

    ОценкаПроизводительности.ЗакончитьЗамерВремени("ТестоваяКлючеваяОперация1",ВремяНачалаЗамера,Товары.Количество(), "Вес по табличной части ""Товары""");

	
КонецПроцедуры

 

 

для пояснения - что такое функция НачатьЗамерВремени():

 
 Функция НачатьЗамерВремени()

 

// Возвращаемое значение:
//  Число - число длиной 14 символов, время UTC начала с точностью до миллисекунд.

Функция НачатьЗамерВремени() Экспорт
	
	ВремяНачала = 0;
	
	Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда
		ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	КонецЕсли;
	
	Возврат ВремяНачала;
	
КонецФункции

 

 

а Товары.Количество() - это "вес замера", в данном случае количество записей в таблице "Товары" моего документа.

Запускаем код (проводим документ) и получаем вот такой результат (см рис.2) - запись о выполнении операции проведения "ТестоваяКлючеваяОперация1" в регистре "Замеры":

 

Рис.2. Замеры времени выполнения "Тестовой ключевой операции 1".

 

В комментарии дана информация по выполнению, в том числе версия платформы. Моя операция выполнилась за 0.02 сек. "Вес замера", равный 4 - это количество товаров в моей табличной части.

Далее, сделав несколько подобных замеров "проведений", я попробую оценить расчетный APDEX (индекс производительности операции или приложения).

 

Рис.3. Расчетный APDEX и таблица допустимых уровней операции.

 

На данном простом примере - "операции проведения", расчетный APDEХ у меня получился близким к отличному 0.929. (отличный >= 0.95).

Вот так можно оценивать скорость выполнения кода, оптимизировать его по данному индексу производительности APDEX.

 

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

 

Оценка производительности длительной операции

В этой части я попробую по-шагово объяснить использование функционала оценки производительности в длительных операциях.

Для начала создаем кнопку, на которую "вешаем" событие запуска длительной операции:

 
 "Кнопка" запуска длительной операции

 

&НаКлиенте
Процедура ВыполнитьДействие(Команда)
	ФоновоеЗадание = ВыполнитьНаСервереДЛ();
	
	НастройкиОжидания  = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	Обработчик = Новый ОписаниеОповещения("ПослеВыполнениеДействия", ЭтотОбъект);
	ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеЗадание, Обработчик, НастройкиОжидания);
	
КонецПроцедуры

 

 

Далее, опишем функцию ВыполнитьНаСервереДЛ()

 
 Запуск функции "ВыполнитьВФоне" из подсистемы "Длительные операции"

 

&НаСервере
Функция НачатьВыполнениеНаСервереДЛ()
	
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("Параметр1", 1);
		
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Замер'");
	
	Возврат ДлительныеОперации.ВыполнитьВФоне("ВыполнитьДействиеДлительныйЗамер", 
		ПараметрыПроцедуры, ПараметрыВыполнения);
	
КонецФункции

 

 

Описываем функцию ВыполнитьДействиеДлительныйЗамер() (располагаем ее в общем модуле, например)

 
 Функция "ВыполнитьДействиеДлительныйЗамер"
Процедура ВыполнитьДействие(Параметры, АдресРезультата) Экспорт
	
	ОписаниеЗамера = ОценкаПроизводительности.НачатьЗамерДлительнойОперации("ТестоваяКлючеваяОперация2");

НачатьТранзакцию();

//......

Попытка
		Для СчетчикКонтрагента = 1 По КоличествоКонтрагентов Цикл
			КонтрагентОбъект = Справочники._ДемоКонтрагенты.СоздатьЭлемент();
			
			КонтрагентОбъект.Наименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НаименованиеКонтрагента, Формат(СчетчикКонтрагента, "ЧГ="));
			КонтрагентОбъект.Записать();
			ОценкаПроизводительности.ЗафиксироватьЗамерДлительнойОперации(ОписаниеЗамера, 1, "ЗаписьКонтрагента");
			МассивОбъектов.Добавить(КонтрагентОбъект.Ссылка);
			Для СчетчикСчета = 1 По КоличествоБанковскихСчетовКонтрагента Цикл			
				СчетОбъект = Справочники._ДемоБанковскиеСчета.СоздатьЭлемент();
				СчетОбъект.Владелец = КонтрагентОбъект.Ссылка;
				СчетОбъект.Наименование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НаименованиеСчета, Формат(СчетчикКонтрагента, "ЧГ="));
				СчетОбъект.Записать();                       
				ОценкаПроизводительности.ЗафиксироватьЗамерДлительнойОперации(ОписаниеЗамера, 1, "ЗаписьБанковскогоСчета");
			КонецЦикла;
		КонецЦикла;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
	КонецПопытки;
		
	Если УдалитьСозданные Тогда
		ТаблицаКонтрагентов = Новый ТаблицаЗначений;
		ТаблицаКонтрагентов.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка._ДемоКонтрагенты"));
		ТаблицаКонтрагентов.ЗагрузитьКолонку(МассивОбъектов, "Контрагент");
		НачатьТранзакцию();
		Попытка
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить("Справочник._ДемоКонтрагенты");
			ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
			ЭлементБлокировки.ИсточникДанных = ТаблицаКонтрагентов;
			ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ссылка", "Контрагент");
			Блокировка.Заблокировать();
			Для Каждого Элемент Из МассивОбъектов Цикл
				ЭлементОбъект = Элемент.ПолучитьОбъект();
				ЭлементОбъект.Удалить();
			КонецЦикла;	
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
		КонецПопытки;
	КонецЕсли;



//......

ЗафиксироватьТранзакцию();

    ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, МассивОбъектов.Количество(), "Тесовая кличевая операция 2");


КонецПроцедуры

 

 

В данной функции я "обернул код" в НачатьЗамерДлительнойОперации и ЗакончитьЗамерДлительнойОперации. Далее, все идентично, как с "обычным" замером.

Как видите, здесь подход точно такой же. Кому интересна информация о длительных операциях - можете посмотреть у меня в статьях - пару лет назад, я достаточно подробно разбирал этот материал и приводил примеры.

Теперь, перейдем к заключению этой статьи и сделаем выводы:

 

Заключение и выводы

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

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

Небольшие рабочие примеры по последним моим статьям и другие материалы (платные и бесплатные) вы всегда можете скачать на моем гит-хабе https://github.com/quazareline

 

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

 

Прошу так же обратить внимание на другие мои актуальные материалы по существующим возможностям функционала библиотеки стандартных подсистем - разным модулям и подсистемам. Данные статьи так же пригодятся вам на практике.

 

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

Спасибо, что дочитали до этого раздела. Так же я прошу ознакомиться с рядом актуальных статей по некоторым базовым - встроенным возможностям типовой библиотеки стандартных подсистем:

 

Базовые принципы работы с регламентными заданиями подсистем БСП

Печать макета MS Word в любом документе с помощью БСП

Генерация штрихкодов с помощью БСП для программистов

Базовые приемы работы с кластером 1С при помощи БСП

Шаблоны сообщений пользователю - подсистема БСП

 

Если вас интересуют другие мои материалы по системам БСП и разработки (платные и бесплатные), то всегда вы можете связаться со мой через личку этого профиля, а так же мой телеграмм канал. Принимаются уточнения по материалу, благодарности и любые другие предложения. Всем спасибо и до новых встреч!

оценка производительности бсп типовые конфигурации стандартные подсистемы длительные операции

См. также

БСП (Библиотека стандартных подсистем) Программист Платные (руб)

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

1800 руб.

21.11.2024    3636    16    15    

18

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Расскажу, как использовать полезный функционал - инструментарий разработчика «1С:Библиотека стандартных подсистем» (БСП) в своих объектах метаданных. Статья будет полезна как шпаргалка при написании собственных объектов метаданных.

27.12.2024    3432    PROSTO-1C    15    

43

БСП (Библиотека стандартных подсистем) Программист Бесплатно (free)

Синтакс-помощник БСП - справочник по Библиотеке Стандартных Подсистем, профессиональный инструмент разработчика с интуитивно понятным интерфейсом. Читайте в статье как использовать все возможности справочника и сделать работу с БСП более комфортной и эффективной.

11.12.2024    3899    gorenski    0    

8

БСП (Библиотека стандартных подсистем) Менеджеры внешних отчетов Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

За последние лет 5 несколько раз сталкиваюсь с проблемой на разных проектах (в конфигурациях 1С:ERP, 1С:ERP УХ и многих других, основанных на БСП), когда много пользователей (около 30 тысяч) в информационной базе, время добавления доступа для пользователей занимает значительное время. Открытие списка занимает от 10 до 15 секунд, и каждое изменение списка еще примерно столько же.

1 стартмани

10.12.2024    993    Iaskeliainen    2    

7

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Некоторые нюансы, если вы захотите создавать свои расширения. Доработка отчета "Связанные документы" для отражения документов расширения. Печатные формы с шаблоном Word.

20.11.2024    3328    milkers    3    

12

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    1678    PROSTO-1C    0    

18

БСП (Библиотека стандартных подсистем) Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    1372    PROSTO-1C    4    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. TheOldGuard 12 01.07.22 08:32 Сейчас в теме
APDEX это всегда здорово, еще бы выводить рез-ты в другую ИБ)
7. kolya_tlt 89 03.07.22 21:38 Сейчас в теме
(1)
о всегда здорово, еще бы выводить рез-ты в

а разве экспорта нет во внешнюю систему?
2. quazare 3866 01.07.22 08:43 Сейчас в теме
(1) в типовых есть возможность выгружать результаты в каталог или на ftp ресурс. ну и, конечно, вы можете выгрузить их самостоятельно из регистра сведений.

вообще система толковая - предельно понятная - можно пользоваться.
user865160; +1 Ответить
3. PLAstic 296 01.07.22 10:30 Сейчас в теме
В начале и окончании замера длительной операции различается строковый идентификатор замера. Думаю, стоит поправить. И вообще, нечего сидеть до часу ночи со статьями ИС. :)
4. ivanov660 4592 01.07.22 12:32 Сейчас в теме
Сам по себе этот функционал в конфигурации довольно бюджетный и не удобный, на мой взгляд. Пару дополнений:
1. Создавать ключевую опцию совсем не обязательно, если по наименованию такой не будет, он она создастся самостоятельно (ОценкаПроизводительностиПовтИсп.ПолучитьКлючевуюОперациюПоИмени).
2. Зачем-то сделали защиту от выгрузки данных апдекс в файл, если стоит опция что это копия.
3. Надо быть осторожным с началом замера и автозавершением. Не запускайте начало на сервере, а завершение на клиенте.

И в примере функции ВыполнитьДействие, у вас перебор с транзакциями, выглядит, на мой взгляд, странно.
Andreynikus; Mizhgan42; user865160; quazare; +4 Ответить
5. quazare 3866 01.07.22 12:34 Сейчас в теме
(4) точная фраза - "функционал бюджетный" взял на заметку. "ВыполнитьДействие" - я вырвал из контекста.
6. malikov_pro 1326 01.07.22 12:43 Сейчас в теме
"Описываем функцию ВыполнитьДействиеДлительныйЗамер()" - внутри "Процедура ВыполнитьДействие()", согласуйте повествование и код пожалуйста.
user865160; rozer; +2 Ответить
8. muskul 04.07.22 02:33 Сейчас в теме
Зачем все это если и так известно что тормозит? например печать современной упд, которая сравнима с закрытием месяца
10. RustIG 1833 15.07.24 09:24 Сейчас в теме
(8) возможно долго из-за параметра печати - "По ширине странице" - если причина в этом, то это известная ошибка, и с УПД никак не связана.
9. Dermint 20.10.23 20:58 Сейчас в теме
Где нажать, чтобы проголосовать, что статья "ни о чём"? Перепечатал описание типовых процедур из БСП, дополнил пересказом из документации, и - пожалуйте в заключение (которой объемнее, чем "основной" материал) о том, как вы можете заплатить мне за мои классные статьи.
Не, возможно, другие статьи полезные, не знаю. Но после этой - нет желания проверять.
Оставьте свое сообщение