Как ускорить групповое проведение документов до 40%, используя привилегированный режим

10.09.15

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

Простейшая обработка, позволяющая сократить время группового проведения документов.

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

Наименование Файл Версия Размер
Проведение на сервере
.epf 13,69Kb
53
.epf 1.0 13,69Kb 53 Скачать

Возможно, прозвучит банально, но при проведении документов анализируются права пользователей + RLS. От этого можно избавиться и ускорить проведение документов, для этого необходимо лишь добавить 1 общий модуль с галкой "привилегированный".
В данной обработке показан пример полного выноса проведения на сервер + без контроля прав.

В моем случае это привело к 40% уменьшению времени проведения по сравнению с проведением в типовой "Групповая обработка справочников и документов".

Плюс в таком режиме абсолютно неважно, насколько слабая машина на клиенте, она используется лишь для запуска, далее N часов работает сервер.

Необходимо создать общий модуль "НаСервереПривилегированный" , проставить в нем галки "Сервер" и "Привилегированный" и поместить следующий код:

Процедура ПровестиНаСервере(ДатаНачала, ДатаОкончания, Организация, МассивВидовДокументов) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = "";
	
	Для Каждого ВидДокумента Из МассивВидовДокументов Цикл
		
		НовыйТекст = СформироватьТекстЗапроса(ВидДокумента);
		Запрос.Текст = Запрос.Текст + НовыйТекст;
		
	КонецЦикла;
	
	Запрос.Текст = Лев(Запрос.Текст, СтрДлина(Запрос.Текст)-16);
	
	Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
	Запрос.УстановитьПараметр("Организация", Организация);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		
		ДокументСсылка = Выборка.Ссылка;
		ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
		Попытка
			ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
		Исключение
		КонецПопытки;
		
	КонецЦикла;
	
КонецПроцедуры

Функция СформироватьТекстЗапроса(ВидДокумента)
	
	НовыйТекст = "ВЫБРАТЬ
	|	 " + ВидДокумента + ".Ссылка
	|ИЗ
	|	Документ." + ВидДокумента + " КАК " + ВидДокумента + "
	|ГДЕ
	|	" + ВидДокумента + ".Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
	|	И " + ВидДокумента + ".Организация = &Организация
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|";
	Возврат НовыйТекст;
	
КонецФункции

Далее в режиме предприятия открыть мою обработку, выбрать там типы документов и запустить проведение.

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

UPDATE:

Как написал в комментариях //infostart.ru/profile/180217/ он попробовал вынести в привилегированный режим проведение по партиям, это дало прирост производительности в 3 раза!

Процедура ВыполнитьПроведениеПоПартиям(ДатаОкончания) Экспорт
    Последовательности.ПартионныйУчет.Восстановить(ДатаОкончания);
КонецПроцедуры

Проведение документов ускорение.

См. также

Как эффективно настроить autovacuum в Postgres для 1С

HighLoad оптимизация Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Кто не любит убирать мусор? Думаю, практически все, а вот в Postgres это обязательный ритуал для эффективной работы. Как эффективно настроить уборку за 1С в Postgres, можно прочитать в этой статье и еще раз задуматься о бесплатности Postgres.

05.08.2023    3393    1CUnlimited    4    

43

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    7391    Филин    37    

92

Простой способ проверки быстродействия

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

Простой (а точнее, мегапростой) способ проверки быстродействия, когда очень важно его, быстродействие, улучшить

10.04.2023    2953    vkrivov@yandex.ru    15    

35

Пример многопоточной обработки (БСП)

HighLoad оптимизация БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

13.02.2023    7490    4    echo77    8    

83

Нагрузочное тестирование в 1С:ERP

HighLoad оптимизация Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

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

02.11.2022    5104    Tavalik    23    

36
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Йожкин Кот 1006 11.09.15 00:12 Сейчас в теме
Актуально для конф на ОФ. Для УФ модуль проведения и так выполняется на сервере + в типовых (УФ) проведение и так выполняется в привилегированном режиме.
EvgenAEY; ily1704; wowik; herfis; +4 Ответить
6. Red_Devil 176 11.09.15 09:21 Сейчас в теме
(1) у нас УПП 1.3, УТ 10.3 все на обычных формах, поэтому пришлось использовать. Получается в управляемых формах проведение происходит уже без контроля прав?
adhocprog; +1 Ответить
13. Йожкин Кот 1006 11.09.15 10:41 Сейчас в теме
(6) В типовых - да, проведение происходит без контроля прав. См. флаг "Прив. режим при проведении"/"Прив. режим при отмене проведения" в свойствах документов.
28. EvgenAEY 2 24.04.20 18:10 Сейчас в теме
(1) Блин, автор статьи, зачем путаете пользователей вашей обработки, зачем указали что все конфигурации и все платформы, для Бухгалтерии 3.0 это точно не применимо!
2. cargobird 306 11.09.15 07:21 Сейчас в теме
Интересно, увеличится ли скорость проведения, если в "привилегированный" модуль поместить запуск восстановления последовательности партионного учета?
3. ivan-helpencoder 11.09.15 07:54 Сейчас в теме
(2) cargobird, да, интересно.
А если просто написать 2 процедуры с замером скорости и потом сравнить?
4. cargobird 306 11.09.15 08:03 Сейчас в теме
(3) ivan-helpencoder, конечно.
Как сделаю, отпишусь.
5. cargobird 306 11.09.15 09:21 Сейчас в теме
(3) ivan-helpencoder, вот такая процедура, добавленная в "привилегированный" модуль:
Процедура ВыполнитьПроведениеПоПартиям(ДатаОкончания) Экспорт
	ВыбМоментВремени = Новый МоментВремени(ДатаОкончания);
	Последовательности.ПартионныйУчет.Восстановить(ДатаОкончания);
КонецПроцедуры

дала ускорение примерно в 3 раза по сравнению со штатным.
Adiga126; adhocprog; ivan-helpencoder; valex1c; Red_Devil; +5 Ответить
7. Red_Devil 176 11.09.15 09:25 Сейчас в теме
(5) в 3 раза?) лихо. Можно добавить в статью
adhocprog; cargobird; +2 Ответить
8. cargobird 306 11.09.15 09:28 Сейчас в теме
(5) старый косячник, переменную объявил, но не использовал)
Но вот еще один момент.
При такой обработке служебные сообщения не выводятся (поскольку все делается а сервере), но после того, как код будет выполнен, все накопленные сообщения разом появятся в окне служебных сообщений.
9. Red_Devil 176 11.09.15 09:33 Сейчас в теме
(8) я сообщения вобще не использую, у меня только перед началом и после окончания выводится сообщение. Так с правильной переменной разница во времени проведения есть?
10. cargobird 306 11.09.15 09:37 Сейчас в теме
(9) дата окончания в любом случае использовалась та, которая надо, так что все верно. Из приведенной процедуры можно выкинуть вторую строку с объявлением переменной, суть не изменится и на скорость это не повлияет. Так что ускорение есть.
11. cargobird 306 11.09.15 10:29 Сейчас в теме
(9) исправь, пожалуйста, в статье.
Надо заменить приведенный кусок кода на любой из этих:

Процедура ВыполнитьПроведениеПоПартиям(ДатаОкончания) Экспорт
    ВыбМоментВремени = Новый МоментВремени(ДатаОкончания);
    Последовательности.ПартионныйУчет.Восстановить(ВыбМоментВремени);
КонецПроцедуры


или

Процедура ВыполнитьПроведениеПоПартиям(ДатаОкончания) Экспорт
    Последовательности.ПартионныйУчет.Восстановить(ДатаОкончания);
КонецПроцедуры
12. bpc222 1962 11.09.15 10:38 Сейчас в теме
(5) cargobird,

Замеры-то верно производили? В 3 раза - не малое значение ускорения...

ИБ файловая/кл-серверная?
adhocprog; valex1c; +2 Ответить
15. cargobird 306 11.09.15 11:02 Сейчас в теме
(12) bpc222, это был единственный замер для проверки работоспособности метода в принципе, поэтому все зависело и от состояния сервера и от активности пользователей и тому подобного. Поэтому для этого замера получилось ускорение в 3 раза. Какое будет усредненное значение - сказать не могу, для длительных тестов времени особо нет. Но буду метод внедрять, потому что даже некоторое ускорение существенно облегчит нам жизнь.

База в клиент-серверном варианте.

Тест: простая обработка
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнитьОбычно(Кнопка)
	Последовательности.ПартионныйУчет.Восстановить(ДатаОкончания);
КонецПроцедуры
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнитьПривилеги­рованно(Кнопка)
	Привилегированный.ВыполнитьПроведениеПоПартиям(ДатаОкончания);
КонецПроцедуры


Замер производительности средствами конфигуратора.
Второй замер дал ускорение в 2 раза. Но и это нам очень хорошо.
18. AlX0id 13.09.15 09:52 Сейчас в теме
(5) cargobird,
А конфа-то хоть какая? Смотрю, в УПП все модули типовые по партионному учету и так уже серверные и привилегированные..
19. cargobird 306 14.09.15 07:01 Сейчас в теме
(18) AlX0id, УТ 10.3
14. ya.Avoronov 115 11.09.15 10:54 Сейчас в теме
Зачем столько телодвижений?

УстановитьПривилегированныйРежим(Истина);
...
ПроцедурыПроведения();
...
УстановитьПривилегированныйРежим(Ложь);



adhocprog; slitov; 7OH; GusevNA; valex1c; +5 Ответить
16. Red_Devil 176 11.09.15 11:12 Сейчас в теме
(14) "В клиент-серверном варианте при выполнении на клиенте данный метод не выполняет никаких действий." (с) Синтаксис помощник.
Получается обработку проведения все равно на серверный модуль выносить надо, получится то-же самое, что в моем примере.
adhocprog; 1059; Йожкин Кот; +3 Ответить
17. valex1c 11.09.15 16:01 Сейчас в теме
Спасибо , помогло :)
50 документов реализация
до - 3.15 мин
после - 1,21 мин.
ivan-helpencoder; +1 Ответить
20. WKBAPKA 214 14.09.15 09:20 Сейчас в теме
Хорошо, если можно просто взять и установить галку привилигированного режима. А если в модуле проведения куча разных ссылок на другие общие модуля, которые на сервер так просто не перенесешь, тогда беда.
21. Red_Devil 176 14.09.15 09:38 Сейчас в теме
(20) не надо в действующем модуле галку ставить. Надо создать свой модуль для этих целей.
22. ekaruk 4794 16.09.15 08:09 Сейчас в теме
Думаю, проще поставить галку в свойствах документа "Проводить в привелигированнои режиме".
Эффект тот же будет.
adhocprog; artbear; +2 Ответить
23. cargobird 306 16.09.15 08:19 Сейчас в теме
(22) ekaruk, это если отдельные документы тормозят (у нас, например, самый "тяжелый" документ это возврат товаров от покупателя).
А групповую обработку проще отправить в привилегированный модуль.
24. nafa 657 16.09.15 09:20 Сейчас в теме
Не понял вообще ничего, и причем тут ОФ и УФ. В типовой торговле 10.3 у роли Администратор нет никаких рлс. То есть можно просто запустить от админа и все тут.
Если же запускать от пользователя, то РЛС должны проверсться. Если проверять не надо - так отключите вообще их.
Что касаемо переносан на сервер - где вообще такой анахронизм нашелся, чтобы по сети 1С пускать ? Терминальные сервера для этого существуют. Когда сервер 1С и терминальный сервер рядом и связаны 1Гб то разницы где выполняется код нет, за исключением конф где отдельные Кулибины поковырялись.
25. Red_Devil 176 16.09.15 09:24 Сейчас в теме
(24) В теории у администратора эффекта быть не должно однако у нас прирост производительности 40%. Где тут логика неизвестно.. какие-то проверки все равно выполняются.
26. cargobird 306 02.10.15 13:35 Сейчас в теме
Еще в копилку опыта...
Запуск стандартного восстановления последовательности партионного учета в УТ 10.3 в сеансе, открытом непосредственно на самом SQL-сервере уже дал значительный прирост скорости.
Применение обработки, использующей приведенный в статье способ, дал ускорение в среднем еще на 5%.
27. Ekovichev 799 14.03.16 14:45 Сейчас в теме
Также хотелось бы отметить еще один прием.
При обработке большого количества однотипных документов в различных конфах есть проверки в подписках на события на дату запрета изменения, на права текущего пользователя править, записывать, удалять документ.

Возможно проверить документ 1 раз для пользователя и результат поместить в дополнительные свойства объекта. В процедуре подписки прочесть доп. свойства объекта и не делать лишних телодвижений:)
Пример:
сРазрешениеНаОперацииСДокументами = Новый Соответствие;
		
//Получим проверку заране для каждого из типов документа.
Для Каждого Строка ИЗ МассивСсылок Цикл
	Если сРазрешениеНаОперацииСДокументами[Строка.ТипДокумента] = Неопределено Тогда
		ОтказПоОперации = Ложь;
		Софт_ОбщегоНазначения.ПроверитьРазрешениеНаЗаписьДокументаПоДатеЗапрета(Строка.Ссылка, ОтказПоОперации, РежимЗаписиДокумента.ОтменаПроведения);
		сРазрешениеНаОперацииСДокументами[Строка.ТипДокумента] = Новый Структура("РазрешениеНаЗаписьДокументаПоДатеЗапрета", НЕ ОтказПоОперации);
	КонецЕсли;

       ДокОбъект = Строка.Ссылка.ПолучитьОбъект();
      Если сРазрешениеНаОперацииСДокументами[Строка.ТипДокумента] <> Неопределено Тогда
		ДокОбъект.ДополнительныеСвойства.Вставить("ГрупповаяОбработка",
                                                                                          сРазрешениеНаОперацииСДокументами[Строка.ТипДокумента].РазрешениеНаЗаписьДокументаПоДатеЗапрета);
	КонецЕсли;						
	ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);

КонецЦикла;


Показать


Процедура Софт_ОбщегоНазначения.ПроверитьРазрешениеНаЗаписьДокументаПоДатеЗапрета(...) - подписочная процедура при отмене проведения документов из моей конфы.

В самой процедуре подписке вставить такую затычку:

	
Попытка
        Если Источник.ДополнительныеСвойства.ГрупповаяОбработка Тогда Возврат; КонецЕсли;
	Исключение;
	КонецПопытки;
Оставьте свое сообщение