Имя: Пароль:
1C
1C 7.7
v7: Тип Неопределенный и прямой запрос
0 vinogradъ
 
31.08.13
12:56
Помогите с решением проблемы.
Есть справочник,в котором хранятся некие значения на документ. Основные реквизиты: Товар, Склад, ТипЗначения, Документ, Значение и др.
Значение имеет тип Неопределенный. Может хранить в себе число или ссылку. В скуле имеет тип char(23).
Как получаю значения:

Функция ПолучитьПериодическоеЗначениеНаДокумент(Товар, Склад, Тип, Документ) Экспорт  
    Если ТипЗначенияСтр(Документ) = "Документ" Тогда
        скл = "
        |select dbo.GetValueByDoc(:Товар, :Склад, :Тип, :Документ) [Значение $Неопределенный]        
        |";     
        глрс.УстановитьТекстовыйПараметр("Документ", Документ);
    ИначеЕсли ТипЗначенияСтр(Документ) = "Дата" Тогда    
        скл = "
        |select dbo.GetValueByDate(:Товар, :Склад, :Тип, '" + Формат(Документ,"ДГГГГММДД") + "ZZZZZZZZZZZZZZZ') [Значение $Неопределенный]            
        |";                                   
    ИначеЕсли Документ = "" Тогда    
        скл = "
        |select dbo.GetValueByDate(:Товар, :Склад, :Тип, '') [Значение $Неопределенный]                
        |";                                   
    КонецЕсли;
    
    глрс.УстановитьТекстовыйПараметр("Товар",Товар);
    глрс.УстановитьТекстовыйПараметр("Склад",Склад);
    глрс.УстановитьТекстовыйПараметр("Тип",Тип);
    
    Значение = глрс.ВыполнитьСкалярный(скл);
    Возврат Значение;
КонецФункции

Тут все гуд: если получаю число, то возвращается число, если ссылку на элемент справочника - тоже что надо, благодаря типизации.


Но если использую функцию GetValueByDoc в запросе (прямом), то тут беда: при получении числа возвращает 'N                 29640', ссылки - 'B1  DK     F           '.
Как тут получить нужное значение?

Если надо, сама функция:
CREATE function GetValueByDoc(@tov char(9), @skl char(9), @type char(9), @doc char(9))
returns char(23)
begin
declare val char(23)
set val = 0
select top 1
    val = p.sp9214
from sc9210 as p (nolock)
where
    p.sp9212 = @tov
    and p.sp9213 = @skl
    and p.sp9222 = @type
    and right(p.sp9216, 9) = @doc
    and p.sp9226 = 0
order by p.sp9265 desc
return val
end

Чую, что может как-то подвязать поле TSP9214, где как я понимаю хранится тип значения SP9214?

Помогите кто чем может.
1 Rie
 
31.08.13
13:03
(0) А если просто первую букву глянуть? N - число, S - строка, B - справочник, O - документ (если мне память не изменяет). И в зависимости от этого - интерпретировать "хвост".
2 vinogradъ
 
31.08.13
13:09
делать еще одну функцию по разбору строки, которую вернула функция из (0) и вызывать функции, которые буду возвращать в зависимоcти от результата разбора либо строку с ID справочника, либо число?
3 Rie
 
31.08.13
13:13
(2) Не совсем понятно, как эта функция используется в запросе. Может, проще не значение извлекать, а то значение, что из запроса, к 23-символьному преобразовывать.
4 vinogradъ
 
31.08.13
13:22
(3) например,
тут должно быть как число:
select
...
$ds.Количество * dbo.GetValueByDoc(Ост.Субконто1, Ост.Субконто2, $Перечисление.ТипыЗначений.Цена, Ост.Субконто3) as Сумма

Здесь как ИД
select
...
dbo.GetValueByDoc(Ост.Субконто1, Ост.Субконто2, $Перечисление.ТипыЗначений.Поставщик, Ост.Субконто3) as [Поставщик $Справочник.Контрагенты]


Просто раньше тип реквизита Значение был Число, но понадобилось, чтобы хранились и ссылки. Поэтому и сделал тип Неопределенный. В разовом получении значения помогает типизация, а как получить значение нужного типа в запросе - не знаю.
5 Rie
 
31.08.13
13:30
(4) Тогда остаётся только анализировать первый символ 23-значного значения, IMHO. Из TSP-полей тип не извлечь.
Пару слов на эту тему есть здесь: http://www.script-coding.com/v77tables.html#1.1.1.
6 vinogradъ
 
31.08.13
13:30
Мысли вслух:
Может, как вариант, завести новый реквизит ЗначениеСсылка с типом Справочник, а текущий переименовать в ЗначениеЧисло и вернуть тип Число? Тогда сделать функцию с возвращаемым значением numeric() и еще одну с char(13)?
7 vinogradъ
 
31.08.13
13:35
Блин, еще и дату надо хранить в Значение... Но дату можно писать в char(13) и, получая, делать cast as datetime
8 Rie
 
31.08.13
13:41
(7) Так а что мешает первый символ проанализировать?
9 vinogradъ
 
31.08.13
13:46
(8) потом делать, к примеру,
cast(ltrim(<значение>) as numeric(14,2)) для числа?
для остальных типов как?
10 Rie
 
31.08.13
13:49
(9) Для ссылок - просто вырезать 13 символов, начиная с 3-го (или 9 - пропустив вид). Для строк - взять хвост.
11 vinogradъ
 
31.08.13
13:50
(10) да, туплю. спасибо, попробую
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн