Вход | Регистрация


Отбор с учетом незаполненных полей в форме

Отбор с учетом незаполненных полей в форме
Я
   vvitaly7
 
17.11.17 - 17:31
Задача:
Сейчас во внешней форме есть следуюие поля для отбора АктовСверкиВзаиморасчетов: организация, контрагент, дата начала, дата окончания, команда. По команде выводятся в форму Акты СверкиВзаиморасчетов по введенным данным: организации, контрагенту и за указанный период по дате АктаСверкиВзаиморасчетов (отбор).  Необходимо организовать следующую возможность. Если одно из 4 полей (организация, контрагент, дата начала, дата окончания) пусто, то выводятся все акты без учета этого поля (если нет орг-ии- по всем организациям, нет контрагента- по всем контрагентам, нет одной из дат- по всем датам, с учетом другой даты. Думаю  использовать возможности  функции ЗначениеЗаполненно() или  метод ПустаяСсылка().  Привожу листинг модуля внешней. Вроде, логично, без пустых полей работает. А с пустыми- нет! Прошу подсказать, где я ошибся

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

        НоваяСтрока = Объект.АктСверки.Добавить();
      НоваяСтрока.Дата = ВыборкаДетальныеЗаписи.Дата;
        НоваяСтрока.АктСверки = ВыборкаДетальныеЗаписи.Ссылка;
        НоваяСтрока.Организация  = ВыборкаДетальныеЗаписи.Организация;
        НоваяСтрока.Контрагент   = ВыборкаДетальныеЗаписи.Контрагент;
        
        
    КонецЦикла;
    
КонецПроцедуры
 
&НаКлиенте
Процедура НайтиДокументы(Команда)
    
     НайтиНаСервере();
    
КонецПроцедуры
 
 
   Lexey_
 
1 - 17.11.17 - 17:34
(0) отладчиком пройдись, всё понятно станет
   Михаил Козлов
 
2 - 17.11.17 - 17:37
Удобно делать через построитель отчета (на форме нужен его отбор). Тогда и другие условия (не равно, в группе, в списке, а также условия на реквизиты элементов отбора) сработают.
В ОФ на форму достаточно поместить табличное поле = отбору построителя.
   FIXXXL
 
3 - 17.11.17 - 17:41
(0) ошибка какая?
   Скиурус
 
4 - 17.11.17 - 17:50
Если по каким-то причинам построитель и СКД использовать не нужно, тогда можно сделать так:

        |ГДЕ
        |    (АктСверкиВзаиморасчетов.Дата >= &ДатаНачала ИЛИ ГОД(&ДатаНачала) = 1)
        |    И (АктСверкиВзаиморасчетов.Дата <= &ДатаОкончания ИЛИ ГОД(&ДатаОкончания) = 1)
        |    И (АктСверкиВзаиморасчетов.Контрагент = &Контрагент ИЛИ &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))
        |    И (АктСверкиВзаиморасчетов.Организация = &Организация ИЛИ &Орагнизация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка))";

   vvitaly7
 
5 - 17.11.17 - 18:01
Ошибка-просто ничего не выводит
   vvitaly7
 
6 - 17.11.17 - 18:07
Отладчик при незаполненном поле "Контрагент" говорит , что значение ЗначениеЗаполнено(Объект.Контрагент) Ложь, а должно быть Истина. Объект.Контрагент- не видно, чтобы было неопрелено.... А как тогда пояснить для функции ЗначениеЗаполнено() , что поле Контрагент неопределено?
   vvitaly7
 
7 - 17.11.17 - 18:10
Или просто написать какое- либо выражение, которое показывало бы, что поле "контрагент" неопределено?
   vvitaly7
 
8 - 17.11.17 - 18:13
Тогда какое?
   Ц_У
 
9 - 17.11.17 - 19:04
(8) ну можешь так
И (АктСверкиВзаиморасчетов.Контрагент = &Контрагент ИЛИ &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))
меняешь на " И 1=1 "
затем, проверяешь, заполнен контрагент или нет
Если ЗначениеЗаполнено(Контрагент) Тогда
СтрЗаменить(Запрос.Текст,"1=1","Контрагент = &Контрагент")
Конецесли;
   Ц_У
 
10 - 17.11.17 - 19:07
(6) с чего бы ИСТИНА то? Значение Заполнено? Нет = Ложь.
 
 Рекламное место пустует
   vvitaly7
 
11 - 17.11.17 - 19:16
ААААААА!!!!!!!!!!!!!!!!!!!!!!!!!!!!)) Точно!) Спасибо!) Попробую!)
   vvitaly7
 
12 - 17.11.17 - 19:17
ТщательнЕе надо!)
   Ц_У
 
13 - 17.11.17 - 19:20
АктСверкиВзаиморасчетов.Дата <= &ДатаОкончания
...
АктСверкиВзаиморасчетов.Дата между &ДатаРаз И &ДатаДва
   Ц_У
 
14 - 17.11.17 - 19:21
Что там такое вообще происходит?
   vvitaly7
 
15 - 18.11.17 - 15:03
Поставил НЕ в выражениях- все равно не работает!
Если НЕ ЗначениеЗаполнено(Объект.Контрагент)  Тогда
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"И АктСверкиВзаиморасчетов.Контрагент = &Контрагент"," ");
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"АктСверкиВзаиморасчетов.Контрагент"," ");
    
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(Объект.Организация) Тогда
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"И АктСверкиВзаиморасчетов.Организация = &Организация"," ");
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"АктСверкиВзаиморасчетов.Организация"," ");
   Ц_У
 
16 - 20.11.17 - 10:30
(15) что это?

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует