Имя: Пароль:
1C
1C 7.7
v7: SQL запрос.Ошибка в INNER JOIN.
0 Последняя_
Надежда
 
30.03.12
10:27
Есть вот такой запрос, который формирует sql-запрос на выборку данных о документе Корректировочный счет-фактура, но не работает корректно. Если закомментировать INNER JOIN и поправить select - работает, но в дальнейшем ступорится. Явно что-то не так делаю...
Код:
если ВидДокумента="КорректировочныйСчетФактура" тогда
тзСтрДок = "
|SELECT
|"+?(етКоличество=0,"","$ДокС.Количество as Количество,") +"
|"+?(етКоличествоДоИзменения=0,"","$ДокС.КоличествоДоИзменения as КоличествоДоИзменения,") +"
|"+?(етЦенаДоИзменения=0,"","$ДокС.ЦенаДоИзменения as ЦенаДоИзменения,") +"
|"+?(етСуммаДоИзменения=0,"","$ДокС.СуммаДоИзменения as СуммаДоИзменения,") +"
|"+?(етСуммаНДСДоИзменения=0,"","$ДокС.СуммаНДСДоИзменения as СуммаНДСДоИзменения,") +"
|"+?(етЦена=0,"","$ДокС.Цена as Цена,") +"
|"+?(етСумма=0,"","$ДокС.Сумма as Сумма,") +"
|"+?(етСтавкаНДС=0,"","$ДокС.СтавкаНДС as СтавкаНДС,") +"
|"+?(етСуммаНДС=0,"","$ДокС.СуммаНДС as СуммаНДС,") +"
|"+?(етНоменклатура=0,"","СпрНом.Code as Номенклатура,") +"            
| ДокС.IdDoc
|FROM
| $ДокументСтроки."+ВидДокумента+ " as ДокС    
|"+?(етНоменклатура=0,"","INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.ID=$ДокС.Наименование")+"
|WHERE ДокС.IDDOC = '"+ИдДок+"'
|";
1 ДенисЧ
 
30.03.12
10:29
мокажи результирующий запрос, а не эту мешанину условий...
2 viktor_vv
 
30.03.12
10:31
И в чем выражается некорректность работы ?
3 viktor_vv
 
30.03.12
10:31
И что значит "работает - но в дальнейшем ступорится" поподробнее?
4 spock
 
30.03.12
10:32
ну круто, ни чего не выводит чтоли? :)

СпрНом.ID=$ДокС.--->Наименование<---
5 andrewks
 
30.03.12
10:32
INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.ID=$ДокС.Наименование

мне одному это кажется странным?
6 andrewks
 
30.03.12
10:33
(4) о, значит, не одному
7 viktor_vv
 
30.03.12
10:33
Все-таки есть вероятность, что там таки ссылка :).
8 andrewks
 
30.03.12
10:34
(7) оптимист!
9 МихаилМ
 
30.03.12
10:34
замените
СпрНом.ID=$ДокС.Наименование


СпрНом.ID=$ДокС.номенклатура
10 Последняя_
Надежда
 
30.03.12
10:34
SELECT
$ДокС.Количество as Количество,
$ДокС.КоличествоДоИзменения as КоличествоДоИзменения,
$ДокС.ЦенаДоИзменения as ЦенаДоИзменения,
$ДокС.СуммаДоИзменения as СуммаДоИзменения,
$ДокС.СуммаНДСДоИзменения as СуммаНДСДоИзменения,
$ДокС.Цена as Цена,
$ДокС.Сумма as Сумма,
$ДокС.СтавкаНДС as СтавкаНДС,
$ДокС.СуммаНДС as СуммаНДС,
СпрНом.Code as Номенклатура,            
ДокС.IdDoc
FROM
$ДокументСтроки.КорректировочныйСчетФактура as ДокС    
INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.ID=$ДокС.Наименование
WHERE ДокС.IDDOC = '"+ИдДок+"'
11 Последняя_
Надежда
 
30.03.12
10:35
(5)(9) И так тоже не воспринимает. выводит пустую таблицу.
12 andrewks
 
30.03.12
10:35
конфа какая?
13 Последняя_
Надежда
 
30.03.12
10:36
рс.выполнитьинструкцию(тзСтрДок).ВыбратьСтроку();
{\\ПРЕДПРИНИМАТЕЛЬ\EXTFORMS\ЗАГРУЗКАДАННЫХ.ERT(1382)}: Meta name parser error: поле таблицы не найдено "$ДокС.Номенклатура"
14 Последняя_
Надежда
 
30.03.12
10:37
+(13) у документа КорректировочныйСчетФактура  нету реквизита Номенклатура!
15 andrewks
 
30.03.12
10:39
(14) вот именно об этом я и хотел тебе наменкуть
16 Последняя_
Надежда
 
30.03.12
10:39
(15) поэтому там и Наименование!
17 el-gamberro
 
30.03.12
10:40
откуда запрос взял?
номенклатура видимо в табличной части. так то тебе 2 джойна понадобятся
18 viktor_vv
 
30.03.12
10:40
(8) Ну я с утра пытаюсь в позитивном русле думать :). Боюсь не получится :).
19 el-gamberro
 
30.03.12
10:41
офигеть девочка симпатичная :))
20 andrewks
 
30.03.12
10:43
(16) а там точно есть то, что тебе нужно?
21 Последняя_
Надежда
 
30.03.12
10:43
(3) без INNER JOIN работает, но передает в процедуру, которая обрабатывает номенклатуру, код из таблицы, а не представление объекта.
22 viktor_vv
 
30.03.12
10:44
А так

INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.Descr=$ДокС.Наименование")

Правда там длина может не совпадать. Тогда так, потормознее.

INNER JOIN $Справочник.Номенклатура as СпрНом ON RTrim(СпрНом.Descr)=RTrim($ДокС.Наименование)")
23 andrewks
 
30.03.12
10:45
там рекв неопред. типа
24 el-gamberro
 
30.03.12
10:46
(23) Тогда INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.id = right($ДокС.Наименование,9)
25 viktor_vv
 
30.03.12
10:46
(21) Не может оно без join код номенклатуры выбрать.
26 Последняя_
Надежда
 
30.03.12
10:49
(22) пустая таблица
(24) тоже пустая таблица
27 Последняя_
Надежда
 
30.03.12
10:51
(25) может, если в селекте ему явно задать вместо  СпрНом.Code as Номенклатура   - $ДокС.Наименование as Наименование,
28 el-gamberro
 
30.03.12
10:52
(27) так а в реквизите Наименование товар ставится?
29 el-gamberro
 
30.03.12
10:52
(27) это не поможет
30 antoneus
 
30.03.12
10:54
у реквизита Наименование тип какой?
31 antoneus
 
30.03.12
10:55
а, (23) не увидел
32 antoneus
 
30.03.12
10:56
если неопределенного типа тогда

ON СпрНом.id = substring($ДокС.Наименование, 7, 9)
33 el-gamberro
 
30.03.12
10:58
(32) 1. чем это отличается от right($ДокС.Наименование,9)?
2. твой код работать не будет если тип неопределенный. а если просто справочник то будет
34 viktor_vv
 
30.03.12
11:00
(33) Тем что так ИД получается для неопределенного типа. А так как в (24) это для Date_Time_IDDOC .
35 viktor_vv
 
30.03.12
11:02
Вот как выглядит в базе.

'B1  20   AL8           '
36 antoneus
 
30.03.12
11:02
(33)
1. читаем про то, как в таблицах хранятся значения неопределенного типа.
2. ну да, можно и нужно достраивать до полного id, я просто пнул в нужном направлении
37 el-gamberro
 
30.03.12
11:03
(35) о как. мей би :) уже забыл
38 Последняя_
Надежда
 
30.03.12
11:04
(32) табличка заполнилась. показался код номенклатуры. но уже дальше обработка этого кода не пошла, но уже хоть какое-то движение )))
39 viktor_vv
 
30.03.12
11:05
Добавь в Select

|СпрНом.ID as [Номенклатура $Справочник.Номенклатура]

или какой там вид справочника.
40 viktor_vv
 
30.03.12
11:07
Теоретически можешь не джойнить, а в селект добавить

substring($ДокС.Наименование, 3, 9) as [Номенклатура $Справочник]
41 antoneus
 
30.03.12
11:10
(40) а не ubstring($ДокС.Наименование, 3, 13) as [Номенклатура $Справочник] ?
42 spock
 
30.03.12
11:10
ну если уж блюсти все приличия, то сабстрингом можно огребстись. С некоторой большой вероятностью может быть, что в этом реквизите могут быть идентификаторы разных видов справочников, но с одним ID.

Отсюда вывод:
- заменить inner на left (несколько, так как там наверняка еще ОСы и еще чего-нить);
- использовать coalesce или case end для получения ТМЦ в select-листе;
43 viktor_vv
 
30.03.12
11:12
(41) Да конечно.
44 Последняя_
Надежда
 
30.03.12
11:12
Спасибо Вам большое за   substring($ДокС.Наименование,7,9) !!! оно как раз то, что нужно берет (вывод в таблице). Теперь дальше буду его отслеживать!
45 viktor_vv
 
30.03.12
11:15
(44) Ты таки добей добей вид, а то точно огребешь.

ON ($ВидСправочника39.Номенклатура+СпрНом.id) = substring($ДокС.Наименование, 3, 13)
46 viktor_vv
 
30.03.12
11:15
(45)+ Это если тебе только номенклатура нужна.
47 Последняя_
Надежда
 
30.03.12
11:32
Так, с этим все понятно. Но есть еще одно НО!
Получили мы код Номенклатуры, обработали, так его же теперь еще надо обратно вернуть в неопределенный тип!!!
48 Последняя_
Надежда
 
30.03.12
11:33
Чтобы в документ он стал
49 Z1
 
30.03.12
11:42
(48)
в поле select точно также
$ВидСправочника39.Номенклатура+СпрНом.id
или тебе надо из языка 1с

Если там хранишь только номенклатуру только один спраочник то переходи
с  char(13) на char(9) и работать быстрее будет
и писать легче
и памяти меньше занимает
50 Последняя_
Надежда
 
30.03.12
11:53
(49) не совсем поняла.
51 Z1
 
30.03.12
11:53
в 49 надо вместо 39 36 ( скопировал с поста выше)
т.е должно быть так
$ВидСправочника36.Номенклатура+СпрНом.id
52 Z1
 
30.03.12
11:53
(50) что именно  ???
53 Последняя_
Надежда
 
30.03.12
11:55
это же не к последнему моему вопросу?
54 Z1
 
30.03.12
11:58
Tcли есть ТекТовар элемент спр.Номенклатыра то поле из 1с заполнить надо так

meta = СоздатьОбъект("MetaDataWork");
Док1.Наименование = Глоб_meta.ЗначениеВДлиннуюСтрокуБД(ТекТовар);
55 viktor_vv
 
30.03.12
11:58
(47) Я вот не поймк никак, что вы с этим кодом делаете ? В чем обработка заключается. И что вам надо в документ вернуть ?
56 Z1
 
30.03.12
12:00
(55) наверное хранит в поле id справочника
почему нет ?
57 Последняя_
Надежда
 
30.03.12
12:05
(47) в общем так. обработка по переносу документов из ТиС в Предприниматель. Суть ее: из Пред-ля запускаем обработку, подключаемся к ТиС, выбираем период и типы документов, которые нужно перенести. далее переносятся документы параллельно заполняя справочники позициями из документов, если таковых еще нет в Пред-ле. как-то так. Просто в этих Корр.счет-фактурах не номенклатура, а наименование с неопределенным типом, что портит всю картину.

хотя, сейчас появилась идея обойти это... попробую пока.
58 viktor_vv
 
30.03.12
12:08
(57) У вас там не наименование с неопределенным типом, а реквизит с идентификатором "Наименование" в котором хранится ссылка на элемент в базе в формате для неопределенного типа значения.
59 viktor_vv
 
30.03.12
12:10
А заполнить значение неопределенного типа в документе можно, только сначала назначитьТип() для реквизита Наименование, потом просто присваивате этому реквизиту значение элемента справочника.
60 Последняя_
Надежда
 
30.03.12
12:12
(59) Спасибо! Вот этого сейчас как раз и не хватило! сама-то не додумалась бы )))
61 viktor_vv
 
30.03.12
12:16
(59) Хотя НазначитьТип() это для элементов формы вроде. Не помню точно сейчас.
62 Последняя_
Надежда
 
30.03.12
12:18
(61) да там много для чего эсть такой метод. Но что-то я не соображу куда его воткнуть )))))
63 Последняя_
Надежда
 
30.03.12
12:21
а никак по другому нельзя заполнить реквизит неопределенного типа значением неопределенного типа?
64 viktor_vv
 
30.03.12
12:22
Покажите где вы присваиваете значение реквизиту "наименование" документа.
65 Последняя_
Надежда
 
30.03.12
12:28
Если (Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти("Наименование").Выбран()=1) и (спПарам.Получить("етНоменклатура")=1) Тогда    
Док.Наименование = СтрДок.Наименование;
КонецЕсли;
66 Последняя_
Надежда
 
30.03.12
12:29
в данном случае в СтрДок.Наименование записан параметр неопределенного типа
67 viktor_vv
 
30.03.12
12:35
Док.НазначитьТип("Наименование","Справочник.Номенклатура") ;
Док.Наименование = СтрДок.Наименование;
68 viktor_vv
 
30.03.12
12:36
И еще что покажет, если
Сообщить(""+СтрДок.Наименование);
Док.НазначитьТип("Наименование","Справочник.Номенклатура") ;
Док.Наименование = СтрДок.Наименование;
69 Последняя_
Надежда
 
30.03.12
12:51
сделала 2 варианта:
1. когда в СтрДок.Наименование = "B1  2C   L17           " (неопределенный тип)
2. когда в СтрДок.Наименование = "00027259" (код товара)
В обоих случаях пусто!
70 viktor_vv
 
30.03.12
13:05
Ну е мое.

Простой вариант.
// только это вынести наверх перед циклом
СпрНом = СоздатьОбъект("Справочник.Номенклатура");

// это уже
Если СпрНом.НайтиПоКоду(СтрДок.Наименование,0) = 1 Тогда
  Док.НазначитьТип("Наименование","Справочник.Номенклатура") ;
  Док.Наименование = СпрНом.ТекущийЭлемент();    
КонецЕсли ;
71 Последняя_
Надежда
 
30.03.12
13:14
Ура! работает! Пойду тестить. (70) Спасибо огромнейшее!