gifts2017

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

Опубликовал Владимир Поздняков (Red_Devil) в раздел Обработки - Обработка документов

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

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

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

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

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

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

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

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

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

UPDATE:

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Артем Бардюг (Йожкин Кот) 11.09.15 00:12
Актуально для конф на ОФ. Для УФ модуль проведения и так выполняется на сервере + в типовых (УФ) проведение и так выполняется в привилегированном режиме.
2. Даниил Матвеев (cargobird) 11.09.15 07:21
Интересно, увеличится ли скорость проведения, если в "привилегированный" модуль поместить запуск восстановления последовательности партионного учета?
3. Иван helpencoder.ru (ivan-helpencoder) 11.09.15 07:54
(2) cargobird, да, интересно.
А если просто написать 2 процедуры с замером скорости и потом сравнить?
4. Даниил Матвеев (cargobird) 11.09.15 08:03
(3) ivan-helpencoder, конечно.
Как сделаю, отпишусь.
5. Даниил Матвеев (cargobird) 11.09.15 09:21
(3) ivan-helpencoder, вот такая процедура, добавленная в "привилегированный" модуль:
Процедура ВыполнитьПроведениеПоПартиям(ДатаОкончания) Экспорт
	ВыбМоментВремени = Новый МоментВремени(ДатаОкончания);
	Последовательности.ПартионныйУчет.Восстановить(ДатаОкончания);
КонецПроцедуры

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

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


или

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

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

ИБ файловая/кл-серверная?
13. Артем Бардюг (Йожкин Кот) 11.09.15 10:41
(6) В типовых - да, проведение происходит без контроля прав. См. флаг "Прив. режим при проведении"/"Прив. режим при отмене проведения" в свойствах документов.
14. Александр Воронов (ya.Avoronov) 11.09.15 10:54
Зачем столько телодвижений?

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



7OH; GusevNA; valex1c; +3 Ответить 1
15. Даниил Матвеев (cargobird) 11.09.15 11:02
(12) bpc222, это был единственный замер для проверки работоспособности метода в принципе, поэтому все зависело и от состояния сервера и от активности пользователей и тому подобного. Поэтому для этого замера получилось ускорение в 3 раза. Какое будет усредненное значение - сказать не могу, для длительных тестов времени особо нет. Но буду метод внедрять, потому что даже некоторое ускорение существенно облегчит нам жизнь.

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

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


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

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

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

КонецЦикла;


...Показать Скрыть


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

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

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