Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавить отбор в запрос через объектную модель #165

Closed
denisushakov opened this issue Dec 13, 2024 · 1 comment · Fixed by #170
Closed
Assignees
Labels
enhancement Улучшение существующей функциональности

Comments

@denisushakov
Copy link
Contributor

Добавить отбор в запрос через схемы запросов

#Область ПрограммныйИнтерфейс

@denisushakov denisushakov added the enhancement Улучшение существующей функциональности label Dec 13, 2024
@denisushakov denisushakov self-assigned this Dec 13, 2024
@denisushakov
Copy link
Contributor Author

аналог этой функции, только для секции ГДЕ

Функция ДобавитьУсловиеВЗапрос(Знач Запрос, ВыражениеУсловия, Знач ИндексЗапросаВПакете = Неопределено) Экспорт
	
	Если ТипЗнч(Запрос) = Тип("Строка") Тогда
		ТекстЗапроса = Запрос;
	ИначеЕсли ТипЗнч(Запрос) = Тип("Запрос") Тогда 
		ТекстЗапроса = Запрос.Текст;
	Иначе
		ВызватьИсключение НСтр("ru = 'Некорректный тип параметра 1';
								|en = 'Incorrect type of parameter 1'") ;
	КонецЕсли;
	
	Если Не ТипЗнч(ВыражениеУсловия) = Тип("Строка") Тогда
		ТекстЗапроса = Запрос;
		ВызватьИсключение НСтр("ru = 'Некорректный тип параметра 2';
								|en = 'Incorrect type of parameter 2'") ;
	КонецЕсли;
	
	СхемаЗапроса = Новый СхемаЗапроса;
	
	СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
	
	ИзменяемыйЗапрос = ЗапросПакетаЗапросов(СхемаЗапроса, ИндексЗапросаВПакете);
	
	Если ТипЗнч(ИзменяемыйЗапрос) = Тип("ЗапросУничтоженияТаблицыСхемыЗапроса") Тогда
		ВызватьИсключение НСтр("ru = 'Невозможно добавить параметр в запрос уничтожения таблицы.';
								|en = 'Cannot add parameter to the table removal query.'"); 
	КонецЕсли;
	
	// Подстановка выражения во все источники с параметрами
	ЧастиВыражения = Новый Массив;
	Для Каждого ОператорЗапроса Из ИзменяемыйЗапрос.Операторы Цикл 
		Для Каждого ИсточникОператора Из ОператорЗапроса.Источники Цикл
			
			ЧастиВыражения.Очистить();
			
			Подзапрос = ИсточникОператора.Источник;
			
			Если ТипЗнч(Подзапрос) = Тип("ВложенныйЗапросСхемыЗапроса") Тогда
				
				ТекстЗапросаИсточника = Подзапрос.Запрос.ПолучитьТекстЗапроса();
				ТекстЗапросаИсточника = ДобавитьУсловиеВЗапрос(ТекстЗапросаИсточника, ВыражениеУсловия);
				Подзапрос.Запрос.УстановитьТекстЗапроса(ТекстЗапросаИсточника);
				
			ИначеЕсли ТипЗнч(Подзапрос) = Тип("ТаблицаСхемыЗапроса") Тогда
				
				ПараметрыИсточника = Подзапрос.Параметры;
				КоличествоПараметров = ПараметрыИсточника.Количество();
				
				Если КоличествоПараметров = 0 Тогда
					Продолжить;
				КонецЕсли;
				
				// В виртуальных таблицах РБ 3 параметр с конца используется для условий по измерениям.
				Если СтрНачинаетсяС(ИсточникОператора.Источник.ИмяТаблицы, "РегистрБухгалтерии") Тогда
					ПоследнийПараметрИсточника = ПараметрыИсточника[КоличествоПараметров - 3];
				Иначе
					ПоследнийПараметрИсточника = ПараметрыИсточника[КоличествоПараметров - 1];
				КонецЕсли;
				
				ИсходноеВыражение = Строка(ПоследнийПараметрИсточника.Выражение);
				Если ЗначениеЗаполнено(ИсходноеВыражение) Тогда
					ЧастиВыражения.Добавить(ИсходноеВыражение);
				КонецЕсли;
				ЧастиВыражения.Добавить(ВыражениеУсловия);
				
				ПоследнийПараметрИсточника.Выражение = Новый ВыражениеСхемыЗапроса(СтрСоединить(ЧастиВыражения, " И "));
				
			КонецЕсли;
				
		КонецЦикла;
	КонецЦикла;
	
	ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
	
	// Удалим "мусор" схемы запроса
	Для НомерПоля = 1 По 9 Цикл 
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, " КАК Поле" + НомерПоля, "");
	КонецЦикла;
	
	Если ТипЗнч(Запрос) = Тип("Строка") Тогда
		Запрос = ТекстЗапроса;
	ИначеЕсли ТипЗнч(Запрос) = Тип("Запрос") Тогда 
		Запрос.Текст = ТекстЗапроса;
	КонецЕсли;
	
	Возврат Запрос;
	
КонецФункции

@denisushakov denisushakov linked a pull request Dec 19, 2024 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement Улучшение существующей функциональности
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant