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

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

bless18
20.06.2012 13:03Прочитано: 9326
Добрый день! Спасибо за помощь в отборе всех существующих документов!
Подскажите, пожалуйста, как в данном запросе создать параметры &ДатаНачала и &ДатаОкончания?
Код 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
раскрыть надо строку и посмотреть весь запрос
Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.