Фикс процедуры заполнения документа Формирование книги продаж для КА 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С.

15500 руб.

02.09.2020    184738    1029    403    

968

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

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

2 стартмани

06.02.2025    2201    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5734    artemusII    11    

23

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

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

18.10.2024    13140    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

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

11.10.2024    8220    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3193    PROSTO-1C    0    

23

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

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

16.08.2024    10802    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Tangram 164 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. Спасибо
Оставьте свое сообщение