Имя: Пароль:
1C
 
Типизация ДокументОснование 1с++
0 Franchiser
 
13.11.23
19:13
Есть запрос:
SELECT distinct
Журнал.docno
, $ПартииРНПТСтроки.Артикул Артикул
, SubString(Журнал.$ОбщийРеквизит.ДокументОснование,5,9)  as [ДокументОснование $Документ]
, Журнал.IDDOC as Партия
,IsNull(МПЗ.DESCR,'') as НаименованиеТовара
FROM _1SJOURN AS Журнал With (NOLOCK)
	INNER JOIN $ДокументСтроки.ПартииРНПТ AS ПартииРНПТСтроки With (NOLOCK) ON Журнал.IDDOC = ПартииРНПТСтроки.IDDOC
	Left JOIN $Справочник.МПЗ as МПЗ (nolock) on $ПартииРНПТСтроки.Артикул = $МПЗ.КодСистемы
WHERE Журнал.DATE_TIME_IDDOC Between :ДатаН and :ДатаК~


Нужно в результате запроса вывести типизированное поле ДокументОснование, которое может быть трех типов документа.
Что написать в ДокументОснование_вид?
1 AAA
 
13.11.23
18:59
Журнал.IdDocDef      AS [Документ_вид]
Примерно так
2 FN
 
13.11.23
19:06
В результатах должна быть колонка ДокументОснование_вид, в которой должен быть вид документа в виде числа.
Получить его можно приджойнив еще раз журнал.
Ну или попробуй просто SubString(Журнал.$ОбщийРеквизит.ДокументОснование,1,9) - тоже должно подойти.
3 FN
 
13.11.23
19:14
опечатался, надо SubString(Журнал.$ОбщийРеквизит.ДокументОснование,1,13)
4 Franchiser
 
13.11.23
19:28
Пример документа основания:
"  3X L2VEJ   "
Вид это "  3X", но его нужно как-то преобразовать в десятичный вид, ну или связывать еще раз с журналом через IDDOC и там уже получать IDDOCDEF из  Журнала Основания, что не хотелось бы.
5 Franchiser
 
13.11.23
19:32
Есть какая-то функция в 1с 7.7 которая получить из
"3X" значение "141"? т.е. переведет из 36-чной системы счисления в 10-чную.
6 Franchiser
 
13.11.23
19:33
(2) про дополнительный джойн журнала способ знаю.
7 FN
 
13.11.23
20:03
"  3X L2VEJ   " - такая строка 1срр прекрасно типизируется в  $Документ
8 FN
 
13.11.23
20:04
(5)_StrToId(строка) и _IdToStr(число)
9 Franchiser
 
13.11.23
20:08
(8) мне в запросе sql нужно
10 FN
 
13.11.23
20:19
(9) ну можно так

create function [dbo].[StrToID](@Res36 char(9))
    returns int as
    begin
        declare @j int
        declare @Deci int
        DECLARE @Arr36 char(36)
        select @Arr36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        select @Deci = 0
        select @j = 1
        while @j <= len(ltrim(rtrim(@Res36)))
        begin
        if @j <> 1
            select @Deci = @Deci*36
            select @Deci = @Deci + charindex(substring(ltrim(rtrim(@Res36)), @j,1),@Arr36) -1
            select @j = @j+1
        end
        return(@Deci)
    end
GO


Но для типизации этого не нужно. У тебя все для типизации
11 AAA
 
13.11.23
20:30
Написал ерунду, невнимательно прочел (0). Как вариант, если видов основания немного, то можно сделать служебный справочник с видами основания {Код36, Имя} и с ним связать вид основания (первые 4 символа из реквизита запроса)
12 AAA
 
13.11.23
20:45
а вообще разве LEFT((Журнал.$ОбщийРеквизит.ДокументОснование,4) это не то что надо? Давненько не писал запросы, но по моему это оно и есть. Им и типизируете
13 ADirks
 
14.11.23
07:01
(0) в данном случае можно написать
Журнал.$ОбщийРеквизит.ДокументОснование  as [ДокументОснование $Документ]

ид13 нормально типизируется как $Документ и без доп.поля с IdDocDef
14 Franchiser
 
14.11.23
10:23
(12) нет так не типизируется, т.к. там не десятичное значение получается
(13) выдает ошибку, что нет типизирующего поля
15 Franchiser
 
14.11.23
10:27
Если написать
LEFT((Журнал.$ОбщийРеквизит.ДокументОснование,4) as ДокументОснование_вид то запрос зависает.
16 ADirks
 
14.11.23
10:44
(14) занятно... а версия 1С++ какая?
у меня 3.2.4.1
и уже даже не вспомню, когда (в каких версиях) последний раз видел ругачку про типизирующее поле.

(15) ну так
Журнал.IDDocDef as ДокументОснование_вид
не надо никаких джойнов и преобразований
17 Franchiser
 
14.11.23
11:44
Журнал.IDDocDef это вид не основания а текущего документа
18 Franchiser
 
14.11.23
11:47
у меня 3.2.4.0
19 AAA
 
14.11.23
12:05
Мне кажется, что надо писать не ДокументОснование_Вид. а документ_Вид
но может и ошибаюсь, это вопрос к разработчикам. Но попробуйте
20 Salimbek
 
14.11.23
12:07
А что выдаст?
select '  3X L2VEJ   '  as [ДокументОснование $Документ]
21 Salimbek
 
14.11.23
12:09
(19) Не, там должно быть так:
{Документ|Document}     

    Char(13);
    Char(9) - Идентификатор объекта, кроме того, в наборе данных должна находиться колонка с именем составленным из имени этой колонки и суффикса {_вид|_kind} (чувствительно к регистру), в которой должны содержаться идентификаторы видов документов. Тип колонки SQL: int, DBF: char(4).
22 Franchiser
 
14.11.23
12:28
(20) ничего без типизирующего поля будет ошибка
23 trad
 
14.11.23
12:33
(14) substring убери
ADirks написал как надо
24 Franchiser
 
14.11.23
20:10
(23) да спасибо. так работает. Надо было сразу выводить ид13 в результат без типизирующего поля.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн