helpf.pro
Регистрация

v8: Как реализовать отбор по периоду

bless18
20.06.2012 13:03Прочитано: 10038
Добрый день! Спасибо за помощь в отборе всех существующих документов!
Подскажите, пожалуйста, как в данном запросе создать параметры &ДатаНачала и &ДатаОкончания?
Код 1C v 8.х
 
	ТекстЗапроса = "";
	Для каждого Вид Из Метаданные.Документы Цикл
		Если ТекстЗапроса<>"" Тогда
			ТекстЗапроса=ТекстЗапроса+"
			|ОБЪЕДИНИТЬ ВСЕ";
		КонецЕсли;    
		
		ТекстЗапроса = ТекстЗапроса+"
		|ВЫБРАТЬ Ссылка
		|ИЗ Документ."+Вид.Имя+" КАК Имя"	 ;
		
	ТекстЗапроса = ТекстЗапроса + ТекстУсловия;		
	КонецЦикла; 
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
	Выборка = Запрос.Выполнить().Выгрузить();

   
Yandex
Возможно, вас также заинтересует
Реклама на портале
bless18
20.06.2012 13:15Ответ № 1
Еще проблема с сортировкой результата запроса по полю Дата. Вот полный текст запроса с выводом результата в табличный документ:
Код 1C v 8.2 УП
 
	
	ТекстЗапроса = "";
	Для каждого Вид Из Метаданные.Документы Цикл
		Если ТекстЗапроса<>"" Тогда
			ТекстЗапроса=ТекстЗапроса+"
			|ОБЪЕДИНИТЬ ВСЕ";
		КонецЕсли;    
		
		ТекстЗапроса = ТекстЗапроса+"
		|ВЫБРАТЬ Ссылка
		|ИЗ Документ."+Вид.Имя+" КАК Имя"	 ;
		КонецЦикла; 
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
	Выборка = Запрос.Выполнить().Выгрузить();
		Для Каждого РезультатЗапроса Из Выборка Цикл 
		Строка = РезультатЗапроса.Ссылка;
		Позиция=Найти(Строка,"0");
		Строка=Лев(Строка,Позиция-1); 	

		Область.Параметры.Номер = РезультатЗапроса.Ссылка.Номер;
		Область.Параметры.Дата = РезультатЗапроса.Ссылка.Дата;
		Область.Параметры.Ответственный = РезультатЗапроса.Ссылка.Ответственный;
		Область.Параметры.ВидДокумента = Строка;
		ТабДок.Вывести(Область);
	КонецЦикла;   
	
	   ТабДок.Показать("СписокДокументов");
КонецПроцедуры

   

Выражение
Код 1C v 8.2 УП
 Выборка.Сортировать("РезультатЗапроса.Ссылка.Дата", Возр)   
выдает ошибку: {Отчет.ОтчетВнешний.Форма.ФормаОтчета(48)}: Ошибка при вызове метода контекста (Сортировать)
Выборка.Сортировать("РезультатЗапроса.Ссылка.Дата, Возр");
по причине:
Неверное имя колонки
bless18
20.06.2012 14:52Ответ № 2
Сделала запрос через ТаблицаДокумента:
Код 1C v 8.2 УП
 

Процедура КнопкаСформироватьНажатие(Кнопка)
	ТабДок = Новый ТабличныйДокумент;
	Макет = ПолучитьМакет("СписокДокументов");
	Область = Макет.ПолучитьОбласть("Заголовок");
	ТабДок.Вывести(Область);
	Область = Макет.ПолучитьОбласть("Строка");
	ТабДок.Вывести(Область);
	
	ТекстУсловия = "";
	Если ЗначениеЗаполнено(ДатаНачала) ИЛИ ЗначениеЗаполнено(ДатаОкончания) Тогда
		//ТекстУсловия = "
		//|ГДЕ ИСТИНА";
		Если ЗначениеЗаполнено(ДатаНачала) Тогда
			ТекстУсловия = ТекстУсловия + "
			|Выбрать
			| И ТаблицаДокумента.Дата >= &ДатаНачала ";
		КонецЕсли;
		Если ЗначениеЗаполнено(ДатаОкончания) Тогда
			ТекстУсловия = ТекстУсловия + "
			| И ТаблицаДокумента.Дата <= &ДатаОкончания ";
		КонецЕсли;
	КонецЕсли;
	
	ТекстЗапроса = "";
	Для Каждого МетаданныеДокумента Из Метаданные.Документы Цикл
		ИмяТаблицы = МетаданныеДокумента.Имя;
		ВидДокумента = ?(ЗначениеЗаполнено(МетаданныеДокумента.Синоним), МетаданныеДокумента.Синоним, ИмяТаблицы);
		// добавляем в запрос кусок запроса к таблице

		ТекстЗапроса = ТекстЗапроса +     
     "ВЫБРАТЬ
     |   ТаблицаДокумента.Номер КАК Номер,
     |   ТаблицаДокумента.Дата КАК Дата,
     |   ТаблицаДокумента.Ответственный КАК Ответственный,
     |   """+ВидДокумента+""" КАК ВидДокумента
     | ИЗ Документ."+ИмяТаблицы+" КАК ТаблицаДокумента
     |";
	 
	 	 ТекстЗапроса = ТекстЗапроса + ТекстУсловия; 
	КонецЦикла;
	// выполняем запрос  
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	
	Выборка = Запрос.Выполнить().Выгрузить();
	
	Для Каждого Строка Из Выборка Цикл	
		Область.Параметры.Номер = Строка.Номер;
		Область.Параметры.Дата = Строка.Дата;
				
		ТабДок.Вывести(Область);
	КонецЦикла;	
	
	
КонецПроцедуры

   

Все поля запроса выбираются, но на строчке останавливается выполнение процедуры по причине ошибки:
Код 1C v 8.2 УП
 Выборка = Запрос.Выполнить().Выгрузить();   
ошибка: {Отчет.Отчет1.Форма.ФормаОтчета(49)}: Ошибка при вызове метода контекста (Выполнить)
Выборка = Запрос.Выполнить().Выгрузить();
по причине:
{(7, 1)}: Синтаксическая ошибка "ВЫБРАТЬ"
<<?>>ВЫБРАТЬ
Что-то неправильно в запросе?
bless18
21.06.2012 07:40Ответ № 3
Такое чувство, что запрос не срабатывает, в Выборке при отлаживании значение колонок = ОшибкаЧтени Выражения
snfr1c
21.06.2012 13:17Ответ № 4
.Выбрать();
попробуй так
Код 1C v 8.х
 	

	Результат = Запрос.Выполнить();

	ВыборкаДетальныеЗаписи = Результат.Выбрать();

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	КонецЦикла;


   
bless18
21.06.2012 14:54Ответ № 5
Получилось ) Спасибо! Запрос все выбирает. Один нюанс не получается. Нужно реализовать возможность выбора периода:
если выбрать дату начала, то выборка осуществляется от этой даты и до последнего документа, если ввести дату окончания, то в результат попадают документы с самого раннего до даты окончания.
Возможно ли внутри запроса написать условие наподобие:
Код 1C v 8.2 УП
 
Для каждого Вид из Метаданные.Документы Цикл		
		
		Запрос.Текст=Запрос.Текст+" ВЫБРАТЬ			
		
		| "+Вид.Имя+".Ссылка КАК ДокументСсылка,               			
		|"+Вид.Имя+".МоментВремени КАК Дата			
		|   ИЗ                             			
		|       Документ."+Вид.Имя+" КАК "+Вид.Имя+"
		|   ГДЕ "+Вид.Имя+".Дата МЕЖДУ 	&ДатаНачала И &ДатаОкончания 
		|   И "+ЗначениеЗаполнено(ДатаНачала) Тогда Вид.Имя+".МоментВремени >= &ДатаНачала "+КонецЕсли;+" "+Если ЗначениеЗаполнено(ДатаОкончания) Тогда Вид.Имя+".МоментВремени <= &ДатаОкончания "+КонецЕсли;+"
					
		|ОБЪЕДИНИТЬ ВСЕ";    
				
	КонецЦикла;	



   

На синтаксис этого программа ругается. Что здесь неопознанный оператор:

{Отчет.ОтчетВнешний1.Форма.ФормаОтчета(36,41)}: Неопознанный оператор
| И "+ЗначениеЗаполнено(ДатаНачала) <<?>>Тогда Вид.Имя+".МоментВремени >= &ДатаНачала "+КонецЕсли+" "+Если ЗначениеЗаполнено(ДатаОкончания) Тогда Вид.Имя+".МоментВремени <= &ДатаОкончания "+КонецЕсли;+" (Проверка: Толстый клиент (обычное приложение))
{Отчет.ОтчетВнешний1.Форма.ФормаОтчета(36,102)}: Ожидается символ ';'
| И "+ЗначениеЗаполнено(ДатаНачала) Тогда Вид.Имя+".МоментВремени >= &ДатаНачала "+КонецЕсли+" "+<<?>>Если ЗначениеЗаполнено(ДатаОкончания) Тогда Вид.Имя+".МоментВремени <= &ДатаОкончания "+КонецЕсли;+" (Проверка: Толстый клиент (обычное приложение))
{Отчет.ОтчетВнешний1.Форма.ФормаОтчета(36,153)}: Неопознанный оператор
| И "+ЗначениеЗаполнено(ДатаНачала) Тогда Вид.Имя+".МоментВремени >= &ДатаНачала "+КонецЕсли+" "+Если ЗначениеЗаполнено(ДатаОкончания) Тогда Вид.Имя<<?>>+".МоментВремени <= &ДатаОкончания "+КонецЕсли;+" (Проверка: Толстый клиент (обычное приложение))
{Отчет.ОтчетВнешний1.Форма.ФормаОтчета(36,200)}: Неопознанный оператор
| И "+ЗначениеЗаполнено(ДатаНачала) Тогда Вид.Имя+".МоментВремени >= &ДатаНачала "+КонецЕсли+" "+Если ЗначениеЗаполнено(ДатаОкончания) Тогда Вид.Имя+".МоментВремени <= &ДатаОкончания "+КонецЕсли;<<?>>+" (Проверка: Толстый клиент (обычное приложение))
{Отчет.ОтчетВнешний1.Форма.ФормаОтчета(38,20)}: Обнаружено логическое завершение исходного текста модуля
|ОБЪЕДИНИТЬ ВСЕ";<<?>> (Проверка: Толстый клиент (обычное приложение))
Mokey
21.06.2012 17:44Ответ № 6
Код 1C v 8.2 УП
 Для каждого Вид из Метаданные.Документы Цикл		
		
		Запрос.Текст=Запрос.Текст+" ВЫБРАТЬ			
		
		| "+Вид.Имя+".Ссылка КАК ДокументСсылка,               			
		|"+Вид.Имя+".МоментВремени КАК Дата			
		|   ИЗ                             			
		|       Документ."+Вид.Имя+" КАК "+Вид.Имя+"
		|   ГДЕ "+Вид.Имя+".Дата МЕЖДУ 	&ДатаНачала И &ДатаОкончания 
		|   И "+?(ЗначениеЗаполнено(ДатаНачала), Вид.Имя+".МоментВремени >= &ДатаНачала ","")+" "+?(ЗначениеЗаполнено(ДатаОкончания), Вид.Имя+".МоментВремени <= &ДатаОкончания ","")+"
					
		|ОБЪЕДИНИТЬ ВСЕ";    
				
	КонецЦикла;   

Изменено 21.06.12 17:45:22
bless18
22.06.2012 09:56Ответ № 7
Спасибо за подсказку!
При вводе даты начала периода или даты окончания ошибка
{Отчет.ОтчетВнешний1.Форма.ФормаОтчета(38)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(7, 35)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
Код 1C v 8.2 УП
    

И АвансовыйОтчет.МоментВремени <<?>>>= &ДатаНачала

А если написать такой запрос в виде
Код 1C v 8.2 УП
 
	Запрос = Новый Запрос;    	
	Запрос.Текст="";

	Для каждого Вид из Метаданные.Документы Цикл		
		
		Запрос.Текст=Запрос.Текст+" ВЫБРАТЬ			
		
		| "+Вид.Имя+".Ссылка КАК ДокументСсылка,               			
		| "+Вид.Имя+".МоментВремени КАК Дата			
		|   ИЗ                             			
		|       Документ."+Вид.Имя+" КАК "+Вид.Имя+"
		| ГДЕ   "+Вид.Имя+".Дата МЕЖДУ 	&ДатаНачала И &ДатаОкончания
        |   И "+?(ЗначениеЗаполнено(ДатаНачала), Вид.Имя+".МоментВремени >= &ДатаНачала ","")+" 
		|   И "+?(ЗначениеЗаполнено(ДатаОкончания), Вид.Имя+".МоментВремени <= &ДатаОкончания ","")+"
		|ОБЪЕДИНИТЬ ВСЕ";    
				
	КонецЦикла;	


	//Убираем объединить все в     	
	Запрос.Текст=Сред(Запрос.Текст,1,СтрДлина(Запрос.Текст)-14);	
	//Добавляем упорядочивание
	
	Запрос.Текст=Запрос.Текст+"УПОРЯДОЧИТЬ ПО	
	|Дата";  	
	
	Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
	
	Результат = Запрос.Выполнить();   	
	Выборка = Результат.Выбрать();
	

   

Ошибка:
{Отчет.ОтчетВнешний1.Форма.ФормаОтчета(39)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(9, 1)}: Синтаксическая ошибка "ОБЪЕДИНИТЬ"
<<?>>ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ
Вроде же все правильно..
Mokey
22.06.2012 10:37Ответ № 8
так надо посмотреть получившийся текст запроса перед Выполнить(), там всё ясно будет, где ошибка
Mokey
22.06.2012 10:39Ответ № 9
а сравнивать МоментВремени и Дату нельзя, надо брать свойство МоментВремени.Дата, потому что сам МоментВремени хранит ещё и ссылку в себе.
bless18
22.06.2012 12:23Ответ № 10
Текст запроса дает значение: " ВЫБРАТЬ , а тип: Строка..А что это может значить?
Mokey
22.06.2012 15:35Ответ № 11
раскрыть надо строку и посмотреть весь запрос
Подсказка: Для редактирования своего ответа щелкните по значку (справа)
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!