Имя: Пароль:
1C
1C 7.7
v7: Не срабатывает условие в запросе
0 Drac0
 
30.11.12
16:42
День добрый! Что-то в пятницу не получается понять, почему не срабатывает условие на реквизит табличной части в запросе:



ТекстЗапроса =
   "//{{ЗАПРОС(Выписки)
   |Период с НачДата по КонДата;
   |ОбрабатыватьДокументы Проведенные;
   |ТекДок     = Документ.Выписка.ТекущийДокумент;
       |Контрагент = Документ.Выписка.Субконто1;
   |Договор    = Документ.Выписка.Субконто2;
   |Условие(Контрагент = ТекКонтр);
   |Группировка ТекДок;
   |Группировка Контрагент;
   |Группировка Договор;
   |"//}}ЗАПРОС
   ;
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   ТЗ="";
   Запрос.Выгрузить(ТЗ,0,0);
   
   ТЗ.ВыбратьСтроку();



ТЗ оказывается пустой. Без условия все хорошо.

Заранее спасибо!
1 АЛьФ
 
30.11.12
16:44
2(0) Если без условия не пустая а с условием пустая, значит условие срабатывает. У тебя просто разные типы "Контрагент" И "ТекКонтр". ИМХО.
2 Надсмотрщик
 
30.11.12
16:44
Что такое "ТекКонтр"?
3 Ёпрст
 
30.11.12
16:46
ТекКонтр - это что?
4 Drac0
 
30.11.12
16:46
(1)(2)Ссылка на справочник контрагенты. Участвует в другом запросе, где контрагент - реквизит табличной части. Там все ок.
5 Ёпрст
 
30.11.12
16:47
больше кода..

Или перед запросом так (тест на вшивость):

ТекКонтр = ТекКонтр.ТекущийЭлемент();
6 Drac0
 
30.11.12
16:48
(5) Нету больше кода :) Только создание объекта Запрос.

Попробую.
7 Надсмотрщик
 
30.11.12
16:48
(5)+1
8 dedmoroz777
 
30.11.12
16:48
Контрагент = Документ.Выписка.Субконто1
Оригинально...
9 АЛьФ
 
30.11.12
16:49
"Документ.Выписка.Субконто1" - имеет неопределенный тип. Что там фактически?
10 Drac0
 
30.11.12
16:51
(9) Фактически может быть много чего, но в том числе и контрагенты.
11 Drac0
 
30.11.12
16:53
Уже думаю, что лучше через БИ находить, но как-то любопытство не дает забить.

(5)Кстати, это не помогло.
12 Ёпрст
 
30.11.12
16:57
(11) тогда вариантов как минимум 3 :
1.в ТекКонтр не ссылка на справочник.Контрагенты
2. в Субконто1 имеет другой тип
3. в выборке нет ни одного субконто1= текКонт
13 Надсмотрщик
 
30.11.12
17:01
Получение "ТекКонтр" из другого запроса???
14 Надсмотрщик
 
30.11.12
17:01
+ (13) Как?
15 Drac0
 
30.11.12
17:03
(12) 1. Сообщить(""+ТипЗначения(ТекКонтр)+": "+ТекКонтр.Вид());

11: Контрагенты

2. Он неопределнный. Но там есть так же и Контрагенты.

3. По оборотке есть.

(13) Реквизит формы.
16 Ёпрст
 
30.11.12
17:05
(15) а в запросе он есть, без условий ?
17 Надсмотрщик
 
30.11.12
17:08
А реквизит "Контрагент" есть на форме или в переменных формы?
18 АЛьФ
 
30.11.12
17:09
ТекстЗапроса =
   "//{{ЗАПРОС(Выписки)

   |Период с НачДата по КонДата;
   |ОбрабатыватьДокументы Проведенные;
   |ТекДок     = Документ.Выписка.ТекущийДокумент;
       |Контрагент = Документ.Выписка.Субконто1;
   |Договор    = Документ.Выписка.Субконто2;
   |Группировка ТекДок;
   |Группировка Контрагент;
   |Группировка Договор;
   |"//}}ЗАПРОС

   ;
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   ТЗ="";
   Запрос.Выгрузить(ТЗ,0,0);
   
   ТЗ.ВыбратьСтроки();

Пока ТЗ.ПолучитьСтроку() = 1 Цикл
 Если ТЗ.Контрагент = ТекКонтр Тогда
   Сообщить("ЕСТЬ!");
 КонецЕсли;
КонецЦикла;

Что выдает?
19 Drac0
 
30.11.12
17:10
(16) Есть
20 palpetrovich
 
30.11.12
17:11
(0) если
|Условие(Контрагент = ТекКонтр);
то зачем
|Группировка Контрагент;
?
21 Drac0
 
30.11.12
17:13
(18) "ЕСТЬ!"
22 Drac0
 
30.11.12
17:13
(20) от безысходности
23 Надсмотрщик
 
30.11.12
17:14
Что на (17) ?
24 palpetrovich
 
30.11.12
17:15
(22) а от безысходности функцию не хочешь добавить?
25 Drac0
 
30.11.12
17:16
(23) На форме документа? Нет. Это типовая выписка бухгалтерии.
Субконто1 при выборе счета присваевается тип Справочник.Контрагенты.
26 АЛьФ
 
30.11.12
17:16
Что-то ты недоговариваешь...
27 Drac0
 
30.11.12
17:16
(24)Счетчик, например?
28 palpetrovich
 
30.11.12
17:18
(27) да не, не обязательно функцию, эт я так
29 Drac0
 
30.11.12
17:19
(28) Но я таки добавил и ничего.
30 Drac0
 
30.11.12
17:20
(26) На форме 5 реквизитов. Два из них - задают периоды, один - контрагент и еще двое, которые не используются в этом случае. И процедура кнопки нажатие с этим запросом. Больше ничего.
31 palpetrovich
 
30.11.12
17:20
(29) проверил, при том, что ТекКонтр - реквизит на форме - все работает
Процедура Сформировать()
   Запрос = СоздатьОбъект("Запрос");    
   ТекстЗапроса = "
   |Период с НачДата по КонДата;
   |ОбрабатыватьДокументы Проведенные;
   |ТекДок     = Документ.БанковскаяВыписка.ТекущийДокумент;
   |Контрагент = Документ.БанковскаяВыписка.Субконто;
   |Условие(Контрагент = ТекКонтр);
   |Группировка ТекДок;
   |";
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   ТЗ="";
   Запрос.Выгрузить(ТЗ);
   ТЗ.ВыбратьСтроку();
КонецПроцедуры
32 Drac0
 
30.11.12
17:26
(31)



Процедура Сформировать()
   
   Запрос = СоздатьОбъект("Запрос");
   
   ТекстЗапроса =
   "//{{ЗАПРОС(Выписки)
   |Период с НачДата по КонДата;
   |ОбрабатыватьДокументы Проведенные;
   |ТекДок     = Документ.Выписка.ТекущийДокумент;
   |Контрагент = Документ.Выписка.Субконто1;
   |Условие(Контрагент = ТекКонтр);
   |Группировка ТекДок;
   |"//}}ЗАПРОС
   ;
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   ТЗ="";
   Запрос.Выгрузить(ТЗ,0,0);
   
   ТЗ.ВыбратьСтроку();
       
КонецПроцедуры



пусто.
33 Надсмотрщик
 
30.11.12
17:26
Как заполняешь ТекКонтр на форме?
34 Drac0
 
30.11.12
17:26
(31)Какой тип у субконто у вас?
35 Drac0
 
30.11.12
17:27
(33) Выбором из справочника. Стандартный. Проверял перед запросом - тип тот, что требуется.
36 Надсмотрщик
 
30.11.12
17:31
У меня это работает

ТекстЗапроса =    "//{{ЗАПРОС(Выписки)
   |Период с (НачДата) по (КонДата);
   |Док = Документ.Выписка.ТекущийДокумент;
   |Контр = Документ.Выписка.Субконто1;
   |Дог = Документ.Выписка.Субконто2;
   |Приход = Документ.Выписка.Приход;
   |Расход = Документ.Выписка.Расход;
   |ВидДвижения = Документ.Выписка.ВидДвижения.ТекущийЭлемент;
   |НазначениеПлатежа = Документ.Выписка.НазначениеПлатежа;
   |КоррСчет = Документ.Выписка.КоррСчет.ТекущийСчет;
   |ПервичныйДокумент = Документ.Выписка.ПервичныйДокумент.ТекущийДокумент;
   |ДокументПоставки = Документ.Выписка.ДокументПоставки.ТекущийДокумент;
   |НомерДокВходящий = Документ.Выписка.НомерДокВходящий;
   |ДатаДокВходящий = Документ.Выписка.ДатаДокВходящий;
   |Функция ПриходСумма = Сумма(Приход);
   |Функция РасходСумма = Сумма(Расход);
   |Группировка Контр без групп;
   |Группировка Док упорядочить по Док.ДатаДок;
   |Группировка СтрокаДокумента;
   |Условие(ВидДвижения в СзДвижений);
   |"//}}ЗАПРОС
   ;
   
   Если (Одному = 1) И (ПустоеЗначение(ВыбПартнер) = 0) Тогда
       ТекстЗапроса = ТекстЗапроса + "Условие(Контр.ПринадлежитГруппе(ТабНастройки.ПолучитьЗначение(ВыбПартнер.ПолучитьЗначение(ВыбПартнер.ТекущаяСтрока()), 3)) = 1);";
   Иначе
       ТекстЗапроса = ТекстЗапроса + "Условие(ВыбПартнеры.Принадлежит(Контр) = 1);";
   КонецЕсли;
37 Drac0
 
30.11.12
17:32
Запрос.ВключитьSQL(0);

Помогло. У меня на скуля 1с-ка ... блин, кто бы мог подумать, что это повлияет в этой ситуации.
38 palpetrovich
 
30.11.12
17:37
(34) неопределенный
39 Drac0
 
30.11.12
17:38
(38) в (37) уже разобрался, спасибо :)
40 palpetrovich
 
30.11.12
17:38
(37) фух :)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший