Имя: Пароль:
1C
 
Отбор с учетом незаполненных полей в форме
,
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
Если по каким-то причинам построитель и СКД использовать не нужно, тогда можно сделать так:


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