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

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    129742    700    390    

752

Как посмотреть итоговый запрос в отчете СКД

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

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

15.05.2024    2953    implecs_team    4    

34

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

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

11.04.2024    2619    andrey_sag    10    

32

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6300    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

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

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2291    2    Yashazz    0    

32

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

15.01.2024    7115    40    mkalimulin    32    

53

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    2015    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Запросы Россия Абонемент ($m)

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3483    52    DrZombi    54    

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