0. vasyak319 132 13.02.15 15:59 Сейчас в теме

Ускорение перепроведения документов

Описание незначительной доработки типовой конфигурации, которая привела к ускорению перепроведения документов на 40%.
Дорабатывалась УПП 1.3, но это должно без каких-либо изменений работать и в других конфигурациях с подобным подходом к проведению документов (КА, УТ 10)

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. cargobird 289 31.03.15 07:28 Сейчас в теме
Интересная идея, попробую...
2. tormozit 5611 31.03.15 07:47 Сейчас в теме
Рекомендую автору предупредить читателей о том, что в его реализации не предусмотрено переименование регистров. Последствия такого шага будут плачевными.
hulio; Diversus; +2 Ответить
3. cargobird 289 31.03.15 08:23 Сейчас в теме
(2) tormozit, на своей практике переименование регистров не встречал ни разу (у вас, видимо, опыта побольше). Копипастом по конфигурации размножаются самые причудливые названия, и чтобы принципиально потребовалось переименование - такого не было...
5. tormozit 5611 31.03.15 09:24 Сейчас в теме
(3) cargobird, конечно, у меня опыта побольше =) Думаете мало добавляют свои регистры и потом меняют им наименование, когда поймут, что промахнулись с именем? Тем более в 8.3.6 сейчас переименование стало заметно менее затратным из-за нового помощника.
4. Балабас 164 31.03.15 09:00 Сейчас в теме
где статистика на сколько увеличилась производительность в результате описанных изменений?
8. vasyak319 132 31.03.15 10:42 Сейчас в теме
(4) Балабас, (7) deadman66, в первой же фразе анонса. Понятно, что это не ровно 40.00000%, но точные цифры тут не имеют смысла - даже на одном и том же сервере, выделенном специально для тестирования и замера (а иначе как вообще было оценить прирост) время заметно плавает от перепроведения к перепроведению, а приводить его одно и то же состояние перед каждым тестом (делаем образ диска - перезагружаем - тестируем - восстанавливаем образ диска - перезагружаем - тестируем...) мне нафиг не упёрлось. А даже если бы упёрлось, это не помогло бы статье, так как это были бы цифры для моей базы и моего тестового сервера.
На рабочем сервере теперь возможно за ночь перепровести два месяца вместо одного - по мне так вполне достаточная характеристика доработки.
6. AlX0id 31.03.15 10:14 Сейчас в теме
Чота закрадываются сомнения насчет того, что подобный подход не ведет к постоянным блокировкам на регистре ГМ_НепустыеДвижения.. Каждый документ при записи каждого регистра в него лезет писать свои сочинения.. Или я чот недопонял?
9. vasyak319 132 31.03.15 10:51 Сейчас в теме
(6) AlX0id, (7) deadman66, были такие опасения и думал, что придётся накладывать управляемые блокировки (тут-то всё будет хорошо на 100%, ибо диапазоны разных документов не пересекаются), но то ли 1С сама их хорошо накладывает, то ли одно из двух (не было времени выяснять, отчего же всё хорошо), но проблем не возникло.
11. AlX0id 31.03.15 12:08 Сейчас в теме
(9)
Внимательно посмотрел структуру регистра - понял, что недопонял )
Думал, что в регистре привязка идет к типу документа, а не к конкретной ссылке. Тогда да - диапазоны не пересекаются, 1С и так наложит блокировку по измерениям, если для регистра применяется управляемый режим.
7. deadman66 31.03.15 10:24 Сейчас в теме
Статистика замеров где? И, да, с блокировками не возникает проблем?
10. Fox-trot 106 31.03.15 12:08 Сейчас в теме
так речь про файловый вариант?
15. vasyak319 132 31.03.15 14:34 Сейчас в теме
(10) Fox-trot, нет, но мне интересно, из чего вы сделали такой вывод.
17. Fox-trot 106 31.03.15 16:05 Сейчас в теме
(15) всю жись с 1с работал тока с трехзвенкой и когда-то сделал вывод, что количество информации = размер базы не влияет на скорость выполнения проги. такие дела
19. vasyak319 132 31.03.15 16:18 Сейчас в теме
(17) Fox-trot, ну, во-первых, конечно, влияет (другое дело, что вы могли этого не заметить), а во-вторых, всё равно непонятно - в статье про количество данных ни слова.
12. CrazyCD 14 31.03.15 13:46 Сейчас в теме
После проведения года попробую вкрячить на КОРП подобное.
А так ловите плюсик авансом =)))
13. Йожкин Кот 1066 31.03.15 13:55 Сейчас в теме
Еще можно сделать проведение док-та на сервере, чтобы не гонять наборы записей, результаты запросов к шапке и ТЧ туда-сюда. Тоже очень хорошо скажется на производительности.
14. vasyak319 132 31.03.15 14:33 Сейчас в теме
(13) Йожкин Кот, а я долгое время думал, ОбработкаПроведения всегда на сервере выполняется. Пока как-то утром не пришел и не увидел, что проведение (Операции - Проведение документов...) встало и ждёт, что я в окне предупреждения ОК нажму. Так я узнал две вещи: что один из тех парней, что дорабатывали эту конфигу, идиот (в ОбработкуПроведения Предупреждение воткнул!) и что перепроведение выполняется на клиенте, потому что иначе тот документ вылетел бы с ошибкой компиляции модуля.
Какое-то время попереписывался с Хотлайном на тему "Когда такое стало возможно", но получился, как это часто бывает, разговор с глухим.
25. Йожкин Кот 1066 01.04.15 12:32 Сейчас в теме
(14) Проведение, которое инициировано из формы или формы списка док-та для толстого клиента всегда выполняется на клиенте. Для тонкого клиента - всегда на сервере, в не зависимости от точки вызова.
26. tormozit 5611 01.04.15 12:40 Сейчас в теме
(25) Йожкин Кот, не совсем верно. Проведение стандартными командами вызывается
- для управляемой формы всегда на сервере
- для обычной формы всегда на клиенте
31. vasyak319 132 01.04.15 17:28 Сейчас в теме
(25) Йожкин Кот, теперь-то я в курсе, но ещё в 8.1 всё проводилось на сервере и такой мрачный прикол с Предупреждением в ОбработкеПроведения даже не компилировался. Там даже Сообщить сначала не компилировалось, это потом сделали очередь сообщений, которую сервер отдаёт клиенту вместе с возвратом управления.
16. Evg-Lylyk 2695 31.03.15 15:52 Сейчас в теме
Не понял зачем так
Я переписал функцию МассивРегистровНужноОчистить

Функция МассивРегистровНужноОчистить(ДокументОбъект) Экспорт

МассивРегистров = Новый Массив();
Запрос = Новый Запрос;

ДвиженияДокумента = ДокументОбъект.Метаданные().Движения;
Для Каждого Движение ИЗ ДвиженияДокумента Цикл

ИмяРегистра = Движение.ПолноеИмя();

Если ЗначениеЗаполнено(Запрос.Текст) Тогда
Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ ";
КонецЕсли;
Запрос.Текст = Запрос.Текст + "ВЫБРАТЬ ПЕРВЫЕ 1""" + ИмяРегистра + """ ИЗ " + ИмяРегистра + " ГДЕ " + ИмяРегистра + ".Регистратор = &Регистратор";
КонецЦикла;

Запрос.УстановитьПараметр("Регистратор", ДокументОбъект.Ссылка);
Результат = Запрос.Выполнить();

Возврат Результат.Выгрузить().ВыгрузитьКолонку("Поле1");

КонецФункции

вроде все теперь очищает только те регистры в которых были записи...
проверял на документе ПлатежкаИсх (5 раз проводил) ускорилось очень значительно
теперь проверяю и думаю на что это может повлиять эта доработка
Mkonst; kauksi; vasyak319; AlkB; +4 Ответить
18. vasyak319 132 31.03.15 16:16 Сейчас в теме
(16) Evg-Lylyk, у меня запрос к одной маленькой таблице (вся эта заморочка с нумерацией регистров как раз для того, чтобы она была настолько маленькой, насколько возможно), а у вас к множеству очень больших. Это тоже должно ускорить перепроведение (что вы и ощутили), так как все СУБД оптимизируют на чтение, а не на запись, но тут вопрос, чего вам нужно больше - написать покороче и постабильнее (у вашего способа нет проблем моего) или выжать из возможности максимум.
Хотя я допускаю, что ответ вопрос "какой метод быстрее" не такой однозначный и зависит от обстоятельств (мозги сервера, размер базы, характер заполненности регистров и т.п.).

Думаю, будет здорово, если вы оформите свой камент в виде статьи.
20. Evg-Lylyk 2695 31.03.15 16:29 Сейчас в теме
(18) Понятно. Думаю вашей статьи достаточно.
21. ZOMI 419 31.03.15 23:44 Сейчас в теме
Ниже привожу листинг процедуры( УПП 1.3.51, которая так возбудила возмутила автора

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


Напрашивается вопросик - а выборочное очищение регистров - чем вам не по душе?
Извините, но то что вы нагородили кто-то (через полгодика?) уберет и заюзает механизмы типовой...


anchovy; Fox-trot; +2 Ответить
22. vasyak319 132 01.04.15 09:45 Сейчас в теме
(21) ZOMI, напрашивается встречный вопросик: Вы смотрели, что на самом деле делает эта процедура при взведённом параметре ВыборочноОчищатьРегистры и в каких вообще случаях он взведён, или вы просто увидели, что есть такой параметр и решили, что вот он - золотой ключик?
23. AlX0id 01.04.15 09:49 Сейчас в теме
(21) ZOMI,
а это выборочное очищение где-то отдельно включается или само по себе работает?
24. vasyak319 132 01.04.15 10:23 Сейчас в теме
(23) AlX0id, советую посмотреть, как и откуда вызывается процедура, вызывающая эту процедуру и, до кучи, список регистров, на который влияет упомянутый флажок, хотя последнее, в общем, необязательно.
28. AlX0id 01.04.15 15:21 Сейчас в теме
(24)
Ну вот сильно не хочется по коду лазить, если честно ) Тем более, когда не знаешь, как он должен работать. Я просто интересуюсь, может быть где-то есть описание этого использования механизма на уровне пользователя/программиста/администратора - мало ли удастся облегчить людям жизнь, не утруждая свою ))
30. vasyak319 132 01.04.15 16:49 Сейчас в теме
(28) AlX0id, там немного, потому и предложил взглянуть. Если вкратце, то этот параметр, конечно, никакими настройками не управляется. Где можно (а можно в большинстве реально используемых документов, в частности - ПТиУ и РТиУ) он уже взведён. Влияние оказывает не на все, а где-то на десяток второстепенных регистров.
В общем, что имел в виду ZOMI своей цитатой процедуры (спасибо, что не модуль целиком), а также ссылкой на загадочные "механизмы типовой", по-моему даже он сейчас не в курсе.
27. capitan 1319 01.04.15 13:54 Сейчас в теме
Программисты 1С они такие ... программисты.
А те, кто не прогуливал в институте Основы программирования, знают, что каждую задачу можно (и нужно) описать формально, потом блок-схема, потом код.
Оставив за бортом код мы увидим следующее:
1. Автор подозревает, возможно небезосновательно, что документы в УПП являются регистраторами для регистров, в которых проводки не делают. Тут камень в огород 1С ибо в каждой книге по программированию написано - не добавляйте лишних регистров/регистраторов.
И тут вот хорошо бы увидеть отчет, который пройдет по конфигурации, посчитает и выведет в виде - Документ - Количество регистров где он является регистратором - Количество регистров, где реально есть проводки.
Если автор состряпает такой отчет и выложит его сюда, да еще для любой конфигурации - звезду ему во всю грудь.
Тогда можно уже аргументированно теребить 1С и/или править документ убирая регистры, где он в регистраторах не нужен.
2. Что сделал автор (надеюсь инфостарт не читают его юзеры и начальник) - он ускорил перепроведение документов, замедлив, в зависимости от количества строк табличной части документа конечно, проведение документа. Не говоря уже о взаимных блокировках регистра сведений при проведении, до которых автору конечно дела нет - он то ночью один работает. За что конечно юзеры, говорят простое человеческое спасибо.
По хорошему нужно делать регламентное задание, заполняющее регистр сведений и всю кухню с перепроведением завязывать на принак - массовое перепроведение ли это вообще. А так - оставлять возможно стандартный механизм от 1С.
3. В итоге статья получается о том, как один, даже не выпивший фанты программист, может тормознуть десяток другой пользователей.
Designer1C; Fox-trot; 7o2uYXg; +3 Ответить
29. vasyak319 132 01.04.15 16:42 Сейчас в теме
(27) capitan, бред. Расписал бы подробнее, да вот опровергать буйные фантазии мне ещё лет 10 назад скучно стало.
32. capitan 1319 01.04.15 18:39 Сейчас в теме
(29) а ты посмотри на сколько дольше стал проводиться один документ. И поймешь чему за 10 лет научился.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Технический лидер, архитектор 1С, руководитель проектов
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Ведущий 1С консультант по БГУ
Омск
зарплата от 50 000 руб. до 95 000 руб.
Полный день

Специалист внедрения и сопровождения 1С
Омск
зарплата от 25 000 руб. до 50 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Ведущий программист 1С
Омск
зарплата от 70 000 руб. до 110 000 руб.
Полный день