Имя: Пароль:
1C
1C 7.7
v7: Запрос по строкам документа
,
0 1CLOH
 
20.10.11
13:35
Осваиваю язык запросов.
Задача - найти все документы определенного типа, содержащие в табличной части определенную партию товара.

Нижеприведенный код просто выдает все документы за период без разницы, содержится ли в нем партия или нет...
В справочнике партий физически такой элемент есть.

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

В чем ошибся ?
1 sanja26
 
20.10.11
13:44
Партия - реквизит документа или Табличной части?
2 1CLOH
 
20.10.11
13:45
Реквизит табличной части
3 1Сергей
 
20.10.11
13:48
|Партия = Документ.ВозвратПоставщику.Партия;
4 1CLOH
 
20.10.11
13:51
(3)

Пробовал, запрос тогда ничего не возвращает, хотя за период документ такого типа с контрольной партией есть.
5 1CLOH
 
20.10.11
13:51
Бинарник 1С - 27-й
6 viktor_vv
 
20.10.11
13:51
Че-то я сомневаюсь.

ласЭлемент117 = "" ;
Если Спр.НайтиПоКоду("117",0) = 1 Тогда
ласЭлемент117 = Спр.ТекущийЭлемент();
Иначе
  Сообщить("Ну нету элемента с кодом 117") ;
  Возврат ;
КонецЕсли ;

|Условие (Партия = ласЭлемент117);
7 sanja26
 
20.10.11
13:52
Если реквизит ТЧ, то и проверять надо реквизит строки
8 Волесвет
 
20.10.11
13:56
не получается запросом, делай без него
9 1Сергей
 
20.10.11
13:57
Кстати. Не знаю как у Вас, в Вашей базе. А у нас серии кодов у партий в пределах подчинения. А значит "Спр.НайтиПоКоду("117",0);" - полный бред
10 1CLOH
 
20.10.11
13:57
(8)
А на кой тогда зарезервированное слово "СтрокаДокумента" в языке запросов ? Но при его использовании 1С-ка ругается...
11 1CLOH
 
20.10.11
13:58
(9)
Да и в той на которой учусь - тоже бред, но пример выше ведь учебный, просто на правильность построения запроса.
12 filh
 
20.10.11
13:58
в функцию вынеси
13 1Сергей
 
20.10.11
13:58
(11) на то он и пример. А партий с кодом "117" может быть больше одной
14 viktor_vv
 
20.10.11
13:59
(13) + 1.
15 1CLOH
 
20.10.11
13:59
(13) одна она там, сам руками создал в процессе эксперимента приходным документом
16 1CLOH
 
20.10.11
14:00
(12) в функцию ? я думал они для вычисления итогов и прочего, а не для заглядывания в табличные части документов. Можно пример ?
17 1CLOH
 
20.10.11
14:02
Мда, говорили мне бывалые люди, что в 7-ке язык запросов - полный глюков бред, но чтоб настолько...
18 Волесвет
 
20.10.11
14:02
(10) это предопределенная группировка
19 1Сергей
 
20.10.11
14:03
(15) Судя по вопросу ты не очень опытный семерошник. И я на твоем месте не был бы так уверен в этом
20 viktor_vv
 
20.10.11
14:03
(17) Откуда там глюки. У всех нормально работает, у одного тебя не работает.
21 Волесвет
 
20.10.11
14:03
|Партия = Документ.ВозвратПоставщику.ТекущийДокумент.Партия; - бред


|Условие (Партия = Спр.ТекущийЭлемент()); -  имхо хрень
22 viktor_vv
 
20.10.11
14:04
Так еще проверь.

ласЭлемент117 = "" ;
Если Спр.НайтиПоКоду("117",0) = 1 Тогда
ласЭлемент117 = Спр.ТекущийЭлемент();
Сообщить(""+ласЭлемент117.Владелец);
Иначе
  Сообщить("Ну нету элемента с кодом 117") ;
  Возврат ;
КонецЕсли ;
23 viktor_vv
 
20.10.11
14:08
А еще лучше кинь на форму реквизит диалога, выбери там партию вручную и в условие вставь. Чтоб быть увереным что условие отрабатывается.
24 1CLOH
 
20.10.11
14:08
(22) вывело наименование элемента справочника (контрольную партию) и наименование элемента из спр. ТМЦ в качестве владельца
25 1Сергей
 
20.10.11
14:09
(24) а должно было вывести только Владельца
26 Волесвет
 
20.10.11
14:11
партиск="";
СпрП = СоздатьОбъект("Справочник.партии");
Если СпрП.НайтиПоКоду("117",0) = 1 Тогда
партиск = СпрП.ТекущийЭлемент();
Иначе
  Сообщить("Не найдено") ;
  Возврат ;
КонецЕсли ;

 
ЗапросПоДокументам = СоздатьОбъект("Запрос");
   
ТекстЗапроса =
"
|Период с ДатаПН по ДатаВП;
|ДокументВП = Документ.ВозвратПоставщику.ТекущийДокумент;
|Партия = Документ.ВозвратПоставщику.Партия;
|Группировка ДокументВП;
|Условие (Партия = партиск);
";
27 1CLOH
 
20.10.11
14:11
(25) сори, у меня в Сообщить был указан вывод и элемента и владельца
28 1Сергей
 
20.10.11
14:12
(26) оно может найти не ту партию
29 ЧеловекДуши
 
20.10.11
14:13
(28)Это уже детали кодов... неважно
30 viktor_vv
 
20.10.11
14:13
А у тебя тип значения реквизита партия какой в документе ?
31 Волесвет
 
20.10.11
14:13
(28) может)
32 1Сергей
 
20.10.11
14:13
(27) допустим, ты нашел партию. Попробуй
|Группировка Документ;
|Группировка СтрокаДокумента;
33 Волесвет
 
20.10.11
14:14
имхо ТС троль
34 1CLOH
 
20.10.11
14:20
(33) Я не троль, а ученик.

(23) Если кинуть на форму выбор партии - тогда запрос работает.
В справочнике Партий всего до 200 элементов, только что пересмотрел все - элемент с кодом 177 только один.

В чем причина ?
35 Erhov_egor
 
20.10.11
14:20
что означает твой ник 1CLOH?
36 1CLOH
 
20.10.11
14:21
Пересмотрел естественно в режиме вывода всех элементов и групп
37 1CLOH
 
20.10.11
14:22
(35) При чем тут мой ник ? В данном случае означает мой уровень знаний в 1С.
38 Erhov_egor
 
20.10.11
14:23
(37)юморной парень
39 1Сергей
 
20.10.11
14:23
(36) покажи получившийся код
40 1CLOH
 
20.10.11
14:23
сейчас
41 viktor_vv
 
20.10.11
14:23
(34) В этом : Если Спр.НайтиПоКоду("117",0) = 1 Тогда
42 viktor_vv
 
20.10.11
14:24
(36) Какие еще группы в справочнике партий ?
43 Erhov_egor
 
20.10.11
14:26
кто нибудь удалит элемент справочника и работать не будет,объявляй перем и присвой че надо
44 1CLOH
 
20.10.11
14:40
Прошу прощения, отвлекли.

(39)
Спр = СоздатьОбъект("Справочник.партии");
//ИскомаяПартия = Спр.НайтиПоКоду("117",0);
ИскомаяПартия = ВыборПартии;
//Сообщить("------ " + Спр.ТекущийЭлемент());
   
ЗапросПоДокументам = СоздатьОбъект("Запрос");
   
ТекстЗапроса =
"
|Период с ДатаПН по ДатаВП;
|ДокументВП = Документ.ВозвратПоставщику.ТекущийДокумент;
|Партия = Документ.ВозвратПоставщику.Партия;
|Группировка ДокументВП;
|Условие (Партия = ИскомаяПартия);";
   
ЗапросПоДокументам.Выполнить(ТекстЗапроса);
Пока ЗапросПоДокументам.Группировка("ДокументВП") = 1 Цикл
  Сообщить(ЗапросПоДокументам.ДокументВП + " --- " + ЗапросПоДокументам.Партия);
КонецЦикла;

(42) В типовой бухконфигурации (на которой учусь) справочник партий сделан двухуровневым. Для чего - не знаю.
45 Erhov_egor
 
20.10.11
14:41
выборпартии че такое?
46 1CLOH
 
20.10.11
14:42
(23) попросил выкинуть на форму поле выбора партии руками, это еге идентификатор
47 Erhov_egor
 
20.10.11
14:44
ну и че работает?
48 Erhov_egor
 
20.10.11
14:44
че еще нужно то?
49 1CLOH
 
20.10.11
14:44
Фрагмент кода выше - работает нормально.

Если партию подставлять путем "...НайтиПоКоду()" - вроде как находит, но в запросе использует непонятно как, т.к. выводятся ВСЕ документы за период
50 viktor_vv
 
20.10.11
14:45
А теперь вот так.

//ИскомаяПартия = Спр.НайтиПоКоду("117",0);
ИскомаяПартия = "" ;
Если Спр.НайтиПоКоду("117",0) = 1 Тогда
ИскомаяПартия = Спр.ТекущийЭлемент();
Сообщить(""+ИскомаяПартия.Владелец);
Иначе
  Сообщить("Ну нету элемента с кодом 117") ;
  Возврат ;
КонецЕсли ;

//ИскомаяПартия = ВыборПартии;
//Сообщить("------ " + Спр.ТекущийЭлемент());
51 Erhov_egor
 
20.10.11
14:47
а еще че надо?все работает же,разница тебе из справочника брать или из диалога,вообще нах диалог не нужен просто переменная туда значение ручками пишешь и все готово
52 Erhov_egor
 
20.10.11
14:48
а ответ тебе был дан еще в (6) на (49)
53 1CLOH
 
20.10.11
14:49
(50) вывело наименование "ТестовыйТовар" - это элемент из спр. ТМЦ, к которому подчинен данный элемент из спр. партий...

(51) Мне нужно, т.к. например при удалении приходного документа при партионном учете по логике нужно удалять и партию, которую он создает с проверкой присутствия данной партии в расходных документах...

Ладно, давайте пожалуй отдохнем.
54 viktor_vv
 
20.10.11
14:51
Так запрос-то отработал ? Просто если до этого ты так делал : //ИскомаяПартия = Спр.НайтиПоКоду("117",0); То в Искомая патия у тебя число 1 было.
55 1Сергей
 
20.10.11
14:51
(53) ну, дык. Эта партия должна храниться в приходном документе. Зачем её искать по коду?
56 1Сергей
 
20.10.11
14:53
(54) Кстати, да. Откуда у него эта строчка взялась не понятно
57 1CLOH
 
20.10.11
14:53
(54) убивая себя об стену...

Таки да. Вот блин. переменная ИскомаяПартия получается хранила результат поиска, а не искомый элемент справочника.

Все, разобрались.
Всем спасибо :-)
58 viktor_vv
 
20.10.11
14:54
(57) Твою ж мать ... :).
59 Erhov_egor
 
20.10.11
14:55
(55)я думаю вопрос закрыт
60 1CLOH
 
20.10.11
15:10
Так точно, закрыт. Прошу прощения что морочил всем голову, глаз замылился, код перед глазами уже плывет.
61 1CLOH
 
20.10.11
15:44
Прошу прощения, есть еще один вопрос.
Как в запросе перечислить несколько типов документов, подлежащих просмотру на наличие в их табличной части определенной партии ?

|ИскомыйДокумент = Документ.ВозвратПоставщику.ТекущийДокумент,
|   Документ.РасходнаяНакладная.ТекущийДокумент;

Так ?
62 viktor_vv
 
20.10.11
15:47
Да. И остальные переменные также описывай (партии).