|
Отбор с учетом незаполненных полей в форме | ☑ | ||
---|---|---|---|---|
0
vvitaly7
17.11.17
✎
17:31
|
Задача:
Сейчас во внешней форме есть следуюие поля для отбора АктовСверкиВзаиморасчетов: организация, контрагент, дата начала, дата окончания, команда. По команде выводятся в форму Акты СверкиВзаиморасчетов по введенным данным: организации, контрагенту и за указанный период по дате АктаСверкиВзаиморасчетов (отбор). Необходимо организовать следующую возможность. Если одно из 4 полей (организация, контрагент, дата начала, дата окончания) пусто, то выводятся все акты без учета этого поля (если нет орг-ии- по всем организациям, нет контрагента- по всем контрагентам, нет одной из дат- по всем датам, с учетом другой даты. Думаю использовать возможности функции ЗначениеЗаполненно() или метод ПустаяСсылка(). Привожу листинг модуля внешней. Вроде, логично, без пустых полей работает. А с пустыми- нет! Прошу подсказать, где я ошибся &НаСервере Процедура НайтиНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | АктСверкиВзаиморасчетов.Ссылка, | АктСверкиВзаиморасчетов.Номер, | АктСверкиВзаиморасчетов.Дата, | АктСверкиВзаиморасчетов.Организация, | АктСверкиВзаиморасчетов.Контрагент |ИЗ | Документ.АктСверкиВзаиморасчетов КАК АктСверкиВзаиморасчетов |ГДЕ | АктСверкиВзаиморасчетов.Дата >= &ДатаНачала | И АктСверкиВзаиморасчетов.Дата <= &ДатаОкончания | И АктСверкиВзаиморасчетов.Контрагент = &Контрагент | И АктСверкиВзаиморасчетов.Организация = &Организация"; Запрос.УстановитьПараметр("ДатаНачала", Объект.ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", Объект.ДатаОкончания); Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент); Запрос.УстановитьПараметр("Организация", Объект.Организация); Если ЗначениеЗаполнено(Объект.Контрагент) Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"И АктСверкиВзаиморасчетов.Контрагент = &Контрагент"," "); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"АктСверкиВзаиморасчетов.Контрагент"," "); КонецЕсли; Если ЗначениеЗаполнено(Объект.Организация) Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"И АктСверкиВзаиморасчетов.Организация = &Организация"," "); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"АктСверкиВзаиморасчетов.Организация"," "); КонецЕсли; Если Объект.ДатаНачала = Неопределено Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"АктСверкиВзаиморасчетов.Дата >= &ДатаНачала"," "); КонецЕсли; Если Объект.ДатаОкончания = Неопределено Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"И АктСверкиВзаиморасчетов.Дата <= &ДатаОкончания"," "); КонецЕсли; РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи НоваяСтрока = Объект.АктСверки.Добавить(); НоваяСтрока.Дата = ВыборкаДетальныеЗаписи.Дата; НоваяСтрока.АктСверки = ВыборкаДетальныеЗаписи.Ссылка; НоваяСтрока.Организация = ВыборкаДетальныеЗаписи.Организация; НоваяСтрока.Контрагент = ВыборкаДетальныеЗаписи.Контрагент; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура НайтиДокументы(Команда) НайтиНаСервере(); КонецПроцедуры |
|||
1
Lexey_
17.11.17
✎
17:34
|
(0) отладчиком пройдись, всё понятно станет
|
|||
2
Михаил Козлов
17.11.17
✎
17:37
|
Удобно делать через построитель отчета (на форме нужен его отбор). Тогда и другие условия (не равно, в группе, в списке, а также условия на реквизиты элементов отбора) сработают.
В ОФ на форму достаточно поместить табличное поле = отбору построителя. |
|||
3
FIXXXL
17.11.17
✎
17:41
|
(0) ошибка какая?
|
|||
4
Скиурус
17.11.17
✎
17:50
|
Если по каким-то причинам построитель и СКД использовать не нужно, тогда можно сделать так:
|
|||
5
vvitaly7
17.11.17
✎
18:01
|
Ошибка-просто ничего не выводит
|
|||
6
vvitaly7
17.11.17
✎
18:07
|
Отладчик при незаполненном поле "Контрагент" говорит , что значение ЗначениеЗаполнено(Объект.Контрагент) Ложь, а должно быть Истина. Объект.Контрагент- не видно, чтобы было неопрелено.... А как тогда пояснить для функции ЗначениеЗаполнено() , что поле Контрагент неопределено?
|
|||
7
vvitaly7
17.11.17
✎
18:10
|
Или просто написать какое- либо выражение, которое показывало бы, что поле "контрагент" неопределено?
|
|||
8
vvitaly7
17.11.17
✎
18:13
|
Тогда какое?
|
|||
9
Ц_У
17.11.17
✎
19:04
|
(8) ну можешь так
И (АктСверкиВзаиморасчетов.Контрагент = &Контрагент ИЛИ &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)) меняешь на " И 1=1 " затем, проверяешь, заполнен контрагент или нет Если ЗначениеЗаполнено(Контрагент) Тогда СтрЗаменить(Запрос.Текст,"1=1","Контрагент = &Контрагент") Конецесли; |
|||
10
Ц_У
17.11.17
✎
19:07
|
(6) с чего бы ИСТИНА то? Значение Заполнено? Нет = Ложь.
|
|||
11
vvitaly7
17.11.17
✎
19:16
|
ААААААА!!!!!!!!!!!!!!!!!!!!!!!!!!!!)) Точно!) Спасибо!) Попробую!)
|
|||
12
vvitaly7
17.11.17
✎
19:17
|
ТщательнЕе надо!)
|
|||
13
Ц_У
17.11.17
✎
19:20
|
АктСверкиВзаиморасчетов.Дата <= &ДатаОкончания
... АктСверкиВзаиморасчетов.Дата между &ДатаРаз И &ДатаДва |
|||
14
Ц_У
17.11.17
✎
19:21
|
Что там такое вообще происходит?
|
|||
15
vvitaly7
18.11.17
✎
15:03
|
Поставил НЕ в выражениях- все равно не работает!
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"И АктСверкиВзаиморасчетов.Контрагент = &Контрагент"," "); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"АктСверкиВзаиморасчетов.Контрагент"," "); КонецЕсли; Если НЕ ЗначениеЗаполнено(Объект.Организация) Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"И АктСверкиВзаиморасчетов.Организация = &Организация"," "); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"АктСверкиВзаиморасчетов.Организация"," "); |
|||
16
Ц_У
20.11.17
✎
10:30
|
(15) что это?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |