Фикс процедуры заполнения документа Формирование книги продаж для КА 1.1.81.3

20.01.17

Разработка - Запросы

Неоптимальный отбор с использованием ПостроителяЗапроса

В одном из обновлений от 1С доработан модуль заполнения документа Формирование записей книги продаж после чего время ожидания стало неприлично долгим. Замер производительности показал 1063,478002 (это 17 минут) - после оптимизации кода 66,239374 (1 минута).

Проблема в процедуре модуля документа РаспределитьОплатыПоДеревуСФ(). Тут в цикле создается таблица значений с помощью ПостроителяЗапроса - это результат отбора строк. Для оптимизации достаточно заменить несколько строк кода.

После внесения правок можно использовать типовой алгоритм заполнения  - для этого достаточно в комментарий документа написать " [ТиповойАлгоритмЗаполнения] " и сохранить его.

Платформа 1С 8.2, MSSQL.

Надеюсь эта маленькая правка кому-нибудь сэкономит время! :)

// Процедура вызывается из тела процедуры "ЗаполнитьРазделРеализация".
// В процессе работы процедуры общая сумма НДС, которая может быть признана
// в качестве вычета распределяется по конкретным событиям оплаты, для того
// чтобы сопоставить факт признания вычета по НДС и факт оплаты поставщику, связанный
// с этим признанием.
Процедура РаспределитьОплатыПоДеревуСФ(Дерево_НДСНачисленный, ТаблицаРезультатов, СписокСчетовФактур, РаспределенныеОплаты, ОтражатьВРеестре = Истина, ОтражатьВидНачисления = Ложь )
	
	НДСНалоговыйПериод = Неопределено;
	
	Построитель_РаспределенныеОплаты = Новый построительЗапроса();
	Построитель_РаспределенныеОплаты.ИсточникДанных = Новый ОписаниеИсточникаДанных(РаспределенныеОплаты);
	
	// Подготовка структуры отбора
	Отбор = Построитель_РаспределенныеОплаты.Отбор;
	Отбор.Добавить("СчетФактура");
	Отбор.СчетФактура.Использование = Истина;
	Отбор.Добавить("РаспределеннаяОплата");
	Отбор.РаспределеннаяОплата.ВидСравнения = ВидСравнения.Больше;
	Отбор.РаспределеннаяОплата.Значение = 0;
	Отбор.РаспределеннаяОплата.Использование = Истина;
	
	Построитель_РаспределенныеОплаты.Порядок.Добавить("ДатаОплаты");
	
	ТаблицаОплат = Новый ТаблицаЗначений();
	ТаблицаОплат.Колонки.Добавить("ДокументОплаты");
	ТаблицаОплат.Колонки.Добавить("ДатаОплаты",Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
	ТаблицаОплат.Колонки.Добавить("СуммаОплаты",Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,2)));
	
	ТаблицаИсточникаПостроителя = Построитель_РаспределенныеОплаты.ИсточникДанных.ИсточникДанных;
	МоментОпределения_ПоОтгрузке = Перечисления.МоментыОпределенияНалоговойБазыНДС.ПоОтгрузке;
	
	//[+] -> ДОБАВЛЯЕМ СВОИ ПЕРЕМЕННЫЕ
	ВремТаблицаИсточникаПостроителя = ТаблицаИсточникаПостроителя.СкопироватьКолонки();
	ИспользоватьТиповойАлгоритм     = (СтрЧислоВхождений(Ссылка.Комментарий, "[ТиповойАлгоритмЗаполнения]") > 0);
	//[+] <-
	
	Для каждого СтрокаСФ Из Дерево_НДСНачисленный.Строки Цикл
		
		ТаблицаОплат.Очистить();
		
		Если УчетНДС.ДляСчетаФактурыНеТребуетсяОплата(СтрокаСФ.СчетФактура) Тогда
			НаличиеОплатыНеТребуется = Истина;
		Иначе
			НаличиеОплатыНеТребуется = (СтрокаСФ.Строки[0].МоментОпределенияНалоговойБазыНДС = МоментОпределения_ПоОтгрузке) Или Дата >= '20080101';
			
			//[*] -> МЕНЯЕМ ТИПОВОЙ АЛГОРИТМ...
			//Отбор = Построитель_РаспределенныеОплаты.Отбор;
			//Отбор.СчетФактура.Значение = СтрокаСФ.СчетФактура;
			//Отбор.РаспределеннаяОплата.ВидСравнения = ?(СтрокаСФ.СуммаСНДС>0,ВидСравнения.Больше,ВидСравнения.Меньше);
			//
			//Построитель_РаспределенныеОплаты.Выполнить();
			//Если Построитель_РаспределенныеОплаты.Результат.Пустой() и не НаличиеОплатыНеТребуется и СтрокаСФ.СуммаСНДС	>= 0 Тогда
			//	// Оплата не обнаружена
			//	Продолжить;
			//КонецЕсли; 
			//
			//ВыборкаОплат = Построитель_РаспределенныеОплаты.Результат.Выгрузить(ОбходРезультатаЗапроса.Прямой);
			
			//...С СОХРАНЕНИЕМ ФУНКЦИОНАЛЬНОСТИ ТИПОВОГО ЗАПОЛНЕНИЯ
			//
			Если ИспользоватьТиповойАлгоритм Тогда
				Отбор = Построитель_РаспределенныеОплаты.Отбор;
				Отбор.СчетФактура.Значение = СтрокаСФ.СчетФактура;
				Отбор.РаспределеннаяОплата.ВидСравнения = ?(СтрокаСФ.СуммаСНДС>0,ВидСравнения.Больше,ВидСравнения.Меньше);
				
				Построитель_РаспределенныеОплаты.Выполнить();
				Если Построитель_РаспределенныеОплаты.Результат.Пустой() и не НаличиеОплатыНеТребуется и СтрокаСФ.СуммаСНДС	>= 0 Тогда
					// Оплата не обнаружена
					Продолжить;
				КонецЕсли; 
				
				ВыборкаОплат = Построитель_РаспределенныеОплаты.Результат.Выгрузить(ОбходРезультатаЗапроса.Прямой);
			Иначе
				ПоискОтбор   = Новый Структура();
				ПоискОтбор.Вставить("СчетФактура", СтрокаСФ.СчетФактура);
				ПоискОплат   = ТаблицаИсточникаПостроителя.НайтиСтроки(ПоискОтбор);
				ВыборкаОплат = ВремТаблицаИсточникаПостроителя.Скопировать();
				Если ПоискОплат.Количество() > 0 Тогда
					Для каждого СтрокаПоиска Из ПоискОплат Цикл
						Если СтрокаСФ.СуммаСНДС > 0 Тогда
							Если СтрокаПоиска.РаспределеннаяОплата > 0 Тогда
								СтрокаВыборки = ВыборкаОплат.Добавить();
								ЗаполнитьЗначенияСвойств(СтрокаВыборки, СтрокаПоиска);
							КонецЕсли;	
						Иначе
							Если СтрокаПоиска.РаспределеннаяОплата < 0 Тогда
								СтрокаВыборки = ВыборкаОплат.Добавить();
								ЗаполнитьЗначенияСвойств(СтрокаВыборки, СтрокаПоиска);
							КонецЕсли;	
						КонецЕсли;
					КонецЦикла;		
				КонецЕсли;
				
				Если ВыборкаОплат.Количество() = 0 Тогда
					Если (НЕ НаличиеОплатыНеТребуется И СтрокаСФ.СуммаСНДС >= 0) Тогда
						// Оплата не обнаружена
						Продолжить;
					КонецЕсли;	
				КонецЕсли;
			КонецЕсли;
			//[*] <-
				
			СуммаКПогашению = СтрокаСФ.СуммаСНДС;

			Для каждого СтрокаРаспределеннойОплаты Из ВыборкаОплат Цикл
/// ....
	
	РаспределенныеОплаты = ТаблицаИсточникаПостроителя.Скопировать();
	
КонецПроцедуры // РаспределитьОплатыПоДеревуСФ()

P.S.: ну а дальше запросы, но это уже совсем другая история...

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169256    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11390    sergey279    18    

65

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

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6338    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

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

16.08.2024    9066    user1840182    5    

28

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

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2727    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    10218    implecs_team    6    

48

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

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3623    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Tangram 161 16.02.17 18:35 Сейчас в теме
1.1.81.2 тоже самое... большое тебе спасибо!
2. Nuuq 76 16.02.17 21:42 Сейчас в теме
(1) А "на дворе" 1.1.82.2, но в типовом релизе КА ред. 1.1 без перемен :)

Пожалуйста!
3. pentaleksei 25.07.18 09:44 Сейчас в теме
Отлично работает в УПП 1.3.107.2. Спасибо
Оставьте свое сообщение