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

10.09.15

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Проведение на сервере
.epf 13,69Kb ver:1.0
55
55 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

UPDATE:

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

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

Готовое решение

Синхронизация и обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData

Правила в универсальном формате обмена для для последних версий конфигураций 1C. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.


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

См. также

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

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

24.06.2024    5163    ivanov660    12    

56

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

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

06.06.2024    9287    Evg-Lylyk    61    

44

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

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

13.03.2024    5110    spyke    28    

49

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

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

13.03.2024    7591    vasilev2015    20    

42

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

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

2 стартмани

15.02.2024    12459    241    ZAOSTG    82    

115

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

Принимать, хранить и анализировать показания счетчиков (метрики) в базе 1С? Почему бы нет? Но это решение быстро привело к проблемам с производительностью при попытках построить какую-то более-менее сложную аналитику. Переход на PostgresSQL только временно решил проблему, т.к. количество записей уже исчислялось десятками миллионов и что-то сложное вычислить на таких объемах за разумное время становилось все сложнее. Кое-что уже практически невозможно. А что будет с производительностью через пару лет - представить страшно. Надо что-то предпринимать! В этой статье поделюсь своим первым опытом применения СУБД Clickhouse от Яндекс. Как работает, что может, как на нее планирую (если планирую) переходить, сравнение скорости работы, оценка производительности через пару лет, пример работы из 1С. Все это приправлено текстами запросов, кодом, алгоритмами выполненных действий и преподнесено вам для ознакомления в этой статье.

1 стартмани

24.01.2024    5687    glassman    18    

40

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

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    14099    doom2good    49    

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

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

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


или

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

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

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

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

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


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

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



adhocprog; slitov; 7OH; GusevNA; valex1c; +5 Ответить
16. Red_Devil 181 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 215 14.09.15 09:20 Сейчас в теме
Хорошо, если можно просто взять и установить галку привилигированного режима. А если в модуле проведения куча разных ссылок на другие общие модуля, которые на сервер так просто не перенесешь, тогда беда.
21. Red_Devil 181 14.09.15 09:38 Сейчас в теме
(20) не надо в действующем модуле галку ставить. Надо создать свой модуль для этих целей.
22. ekaruk 4975 16.09.15 08:09 Сейчас в теме
Думаю, проще поставить галку в свойствах документа "Проводить в привелигированнои режиме".
Эффект тот же будет.
adhocprog; artbear; +2 Ответить
23. cargobird 308 16.09.15 08:19 Сейчас в теме
(22) ekaruk, это если отдельные документы тормозят (у нас, например, самый "тяжелый" документ это возврат товаров от покупателя).
А групповую обработку проще отправить в привилегированный модуль.
24. nafa 661 16.09.15 09:20 Сейчас в теме
Не понял вообще ничего, и причем тут ОФ и УФ. В типовой торговле 10.3 у роли Администратор нет никаких рлс. То есть можно просто запустить от админа и все тут.
Если же запускать от пользователя, то РЛС должны проверсться. Если проверять не надо - так отключите вообще их.
Что касаемо переносан на сервер - где вообще такой анахронизм нашелся, чтобы по сети 1С пускать ? Терминальные сервера для этого существуют. Когда сервер 1С и терминальный сервер рядом и связаны 1Гб то разницы где выполняется код нет, за исключением конф где отдельные Кулибины поковырялись.
25. Red_Devil 181 16.09.15 09:24 Сейчас в теме
(24) В теории у администратора эффекта быть не должно однако у нас прирост производительности 40%. Где тут логика неизвестно.. какие-то проверки все равно выполняются.
26. cargobird 308 02.10.15 13:35 Сейчас в теме
Еще в копилку опыта...
Запуск стандартного восстановления последовательности партионного учета в УТ 10.3 в сеансе, открытом непосредственно на самом SQL-сервере уже дал значительный прирост скорости.
Применение обработки, использующей приведенный в статье способ, дал ускорение в среднем еще на 5%.
27. Ekovichev 825 14.03.16 14:45 Сейчас в теме
Также хотелось бы отметить еще один прием.
При обработке большого количества однотипных документов в различных конфах есть проверки в подписках на события на дату запрета изменения, на права текущего пользователя править, записывать, удалять документ.

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

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

КонецЦикла;


Показать


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

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

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