Имя: Пароль:
1C
1С v8
Как в запросе число преобразовать к строке?
0 RomaH
 
naïve
22.02.12
08:42
Надо получить  из двух чисел 2012 и 2015 строку типа "2012 - 2015"
1 andrewks
 
22.02.12
08:43
выразить
2 rsv
 
22.02.12
08:44
(0) Никак. Фукнция Выразить не преобразует числа к строке.
3 rsv
 
22.02.12
08:45
+(2) И обратно.
4 Песец
 
22.02.12
08:45
5 andrewks
 
22.02.12
08:46
+(1) сорри, попутал. представление, конечно
6 Песец
 
22.02.12
08:58
(5) Число будет преобразовано в строку, но как сделать конкатенацию? В языке запросов есть только арифметический оператор "+".
7 Ненавижу 1С
 
гуру
22.02.12
08:59
(6) в языке запросов есть конкатенация, а вот преобразования как раз не будет
8 Wobland
 
22.02.12
08:59
конкатенацию нужно делать потом. кто скажет, зачем это именно в запросе?
9 andrewks
 
22.02.12
09:01
(6) не, ну, если очень надо именно в запросе, то можно сделать и там конкатенацию. через небольшой изврат
10 КМ155
 
22.02.12
09:06
(9) через 250 строк Выбор ?
11 Песец
 
22.02.12
09:08
(9) Научи, если не влом:

выбрать "вот тут надо получить 2012-2015"
из
(выбрать
2012 как _2012,
2015 как _2015
) как числа
12 andrewks
 
22.02.12
09:09
(10) не, проще :)

(11) ща, с банком закончу, и покажу
13 Песец
 
22.02.12
09:10
(7) ПРЕДСТАВЛЕНИЕ преобразует число в строку.

Функция ПРЕДСТАВЛЕНИЕ
Данная функция предназначена для получения строкового представления значения произвольного типа.
(с) ртфм
14 andrewks
 
22.02.12
09:13
(13) проблема в том, что это преобразование уже идёт на стороне клиента, и в самом запросе  ничего не меняет
15 luckyluke
 
22.02.12
09:15
(0) можно получить строку через соединение с ВТ, в которой соответствие числа и строки.
16 Песец
 
22.02.12
09:21
(14) Ниче не понял. А представление например документа? Или представление числа в строку работает по-другому?    
(15) Для получения строки есть функция представление. Требуется соединить две строки.
Ждем  andrewks.
17 luckyluke
 
22.02.12
09:23
(16) серьёзно? прям вот так можно сделать конкатенацию двух представлений?
18 Maxus43
 
22.02.12
09:25
(16) представления не сложить, ну не работает так
19 luckyluke
 
22.02.12
09:25
Во, нашел, вот так я делал:

ВЫБРАТЬ
   0 КАК Число,
   "0" КАК Строка
ПОМЕСТИТЬ ВТ_СоответствиеЧиселИСтрок

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   1,
   "1"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   2,
   "2"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   3,
   "3"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   4,
   "4"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   5,
   "5"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   6,
   "6"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   7,
   "7"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   8,
   "8"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   9,
   "9"
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
   АдресныйКлассификатор.Наименование КАК Наименование,
   АдресныйКлассификатор.Сокращение КАК Сокращение,
   ВТ_СоответствиеЧиселИСтрок.Строка + ВТ_СоответствиеЧиселИСтрок1.Строка КАК ЧислоСтрока
ИЗ
   РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор
       ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СоответствиеЧиселИСтрок КАК ВТ_СоответствиеЧиселИСтрок
       ПО (АдресныйКлассификатор.ТипАдресногоЭлемента = 1)
           И ((ВЫРАЗИТЬ(АдресныйКлассификатор.КодРегионаВКоде / 10 - 0.5 КАК ЧИСЛО(1, 0))) = ВТ_СоответствиеЧиселИСтрок.Число)
       ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СоответствиеЧиселИСтрок КАК ВТ_СоответствиеЧиселИСтрок1
       ПО (АдресныйКлассификатор.ТипАдресногоЭлемента = 1)
           И (АдресныйКлассификатор.КодРегионаВКоде - (ВЫРАЗИТЬ(АдресныйКлассификатор.КодРегионаВКоде / 10 - 0.5 КАК ЧИСЛО(1, 0))) * 10 = ВТ_СоответствиеЧиселИСтрок1.Число)
ГДЕ
   АдресныйКлассификатор.ТипАдресногоЭлемента = 1
20 Maxus43
 
22.02.12
09:26
ПРЕДСТАВЛЕНИЕ(Ссылка) + "АмамбаХарамМамбаРум" - ошибку даст
21 НЕА123
 
22.02.12
09:28
(14)
подробнее можно?
22 Песец
 
22.02.12
09:28
(18) В (7) и (9) утверждают обратное.

(19) Сделай вот это:

ВЫБРАТЬ
   числа._2012 КАК ПервоеЧисло,
   числа._2015 КАК ВтороеЧисло,
   "вот тут как-то надо получить 2012-2015" КАК КонкатенацияЧисел
ИЗ
   (ВЫБРАТЬ
   2012 КАК _2012,
   2015 КАК _2015) КАК числа
23 asady
 
22.02.12
09:30
90) нафуя?

ясно же что это нужно уже при выводе результата
ну так и делай это в процедуре вывода результата
24 Maxus43
 
22.02.12
09:30
(22) тоже самое утверждают. Что не взлетит
25 Maxus43
 
22.02.12
09:31
(24) + не взлетит (13), (20) и ВЫРАЗИТЬ(Число Как Строка)
26 Песец
 
22.02.12
09:37
(25) Взлетит представление.
27 andrewks
 
22.02.12
09:37
(26) не взлетит
28 Песец
 
22.02.12
09:38
(27) Преобразование числа в строку я имел в виду.
29 andrewks
 
22.02.12
09:38
ну вот, например, простое преобразование целых положительных чисел в строку:
(заранее прошу прощения, если кому-то режет глаз английский синтаксис, но мне так удобней)


select
2012 as val
into InputTable
union select 2015 union select 2024 union select 1997

;

select
0 as num
,"0" as numstr
into digits
union select 1,"1" union select 2,"2" union select 3,"3" union select 4,"4" union select 5,"5"
union select 6,"6" union select 7,"7" union select 8,"8" union select 9,"9"

;

select
digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num as num
,digits4.numstr+digits3.numstr+digits2.numstr+digits1.numstr as numstr
into numbers
from
digits as digits1
,digits as digits2
,digits as digits3
,digits as digits4
//where (digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num between 0 and 3999)
index by num

;

select
numbers.numstr as ValPresent
from
InputTable
inner join
numbers
on (InputTable.val=numbers.num)

30 Maxus43
 
22.02.12
09:39
(26)>(20). У вас нет ошибки?
31 StanleyMarsh
 
22.02.12
09:39
(25) - true
ну вы (почти все) ребята сочинять))
32 Песец
 
22.02.12
09:42
(29) А зачем это? в строку преобразовать не проблема:

ВЫБРАТЬ
   представление(числа._2012) КАК ПервоеЧислоСтрокой,
   числа._2015 КАК ВтороеЧисло,
   "а как получить 20122015?" КАК КонкатенацияЧисел
ИЗ
   (ВЫБРАТЬ
   2012 КАК _2012,
   2015 КАК _2015) КАК числа
33 НЕА123
 
22.02.12
09:44
де юре - среда,
де факто - ПЯТНИЦА!
34 andrewks
 
22.02.12
09:45
(32) короче, прими за аксиому, что в запросе у тебя происходит СтрЗаменить(ТекстЗапроса,"представление","")
35 Песец
 
22.02.12
09:49
(34) Т. е., если у меня в запросе, возвращающем стотыщь элементов справочника написано "представление(СсылкаНаЭлементСправочника)",
то запрос вытащит ссылки, а потом 1С будет стотыщь раз дергать базу чтобы получить представление (а оно может быть наименованием или кодом)???
36 andrewks
 
22.02.12
09:50
вот так получается для периодов:



select
2012 as DwnBound
,2015 as UpBound
into InputTable
union select 2000,2005 union select 2024,2032 union select 1997,1999

;

select
0 as num
,"0" as numstr
into digits
union select 1,"1" union select 2,"2" union select 3,"3" union select 4,"4" union select 5,"5"
union select 6,"6" union select 7,"7" union select 8,"8" union select 9,"9"

;

select
digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num as num
,digits4.numstr+digits3.numstr+digits2.numstr+digits1.numstr as numstr
into numbers
from
digits as digits1
,digits as digits2
,digits as digits3
,digits as digits4
//where (digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num between 0 and 3999)
index by num

;

select
numbers1.numstr+" - "+numbers2.numstr as BoundPresent
from
InputTable
inner join
numbers as numbers1
on (InputTable.DwnBound=numbers1.num)
inner join
numbers as numbers2
on (InputTable.UpBound=numbers2.num)

37 Maxus43
 
22.02.12
09:51
да если ты просто в запросе выбереш Док.Ссылка - при выводе система полезет за представлением.
Док.Ссылка, представление(Док.Ссылка) - теже йайца только в профиль
38 andrewks
 
22.02.12
09:52
можно даже так:

"период с "+numbers1.numstr+" по "+numbers2.numstr+" год" as BoundPresent
39 andrewks
 
22.02.12
09:53
а куда автор пропал?
40 Serg_1960
 
22.02.12
10:03
А зачем нам автор? :) Тема вечная как... даже не знаю как что :))
41 Serg_1960
 
22.02.12
10:05
42 andrewks
 
22.02.12
10:06
(41) там текст запроса динамический. это неспортивно. а у меня статический
43 rsv
 
22.02.12
10:12
Вообщето если замахнулись на CAST , так неплохо бы допиливать его до конца. До полноценного CAST и прочее.
44 andrewks
 
22.02.12
10:13
(43) это ж делать надо. проще сказать: не допускается, и всё.
45 rsv
 
22.02.12
10:14
(44) Проще сказать : лабайте все на клиенте через Пока Выбрать Если :)
46 Песец
 
22.02.12
10:59
(38) Спасибо, правильно ли я понял:
Недокументированная фича оператора "+", в запросе работает как конкатенация при условии, что операнды явно заданы строкой в тексте запроса.
47 andrewks
 
22.02.12
11:05
(46) ну почему же недокументированная?

Бинарными (арифметическими) операциями являются операции:

+ | – | * | /  

Бинарные операции используются для типов ЧИСЛО.

Для типа СТРОКА может использоваться бинарная операция +.


© справка 1С
48 НЕА123
 
22.02.12
11:09
(46)
не совсем. проще принять (34).
49 MikleV
 
22.02.12
11:13
заюзать СКД и не ипать себе моск
50 Песец
 
22.02.12
11:21
(48)
Функция ПРЕДСТАВЛЕНИЕ
Данная функция предназначена для получения строкового представления значения произвольного типа.
Параметр функции – выражение любого типа.
Возвращаемое значение – представление значения, тип СТРОКА.
Результат работы функции не может быть использован внутри других функций, за исключением функции ПРЕДСТАВЛЕНИЕ.
(с)

Наверное, проще принять что в запросах есть некий тип "строковое представление" :)
51 НЕА123
 
22.02.12
11:47
правильно в (14).
т.к. посмотрел запрос SQL в техжурнале.
Для справочника это Наименование(в моем случае).
Для документа это два поля Номер и Дата.
т.е. следует, что строки-то и нет, она формируется потом.
кстати, почему-то делается соединение "сам с собой" по ссылке.
52 НЕА123
 
22.02.12
11:49
+(51)
при Представление() еще и ссылка присутствует.
53 Maxus43
 
22.02.12
11:54
>>почему-то делается соединение "сам с собой" по ссылке
дык Ссылка.Поле - это уже неявное соединение
54 Песец
 
22.02.12
12:03
(51) Получается, что запрос добавляет (в зависимости от настроек представления) необходимые дополнительные поля, а окончательно их собирает в строку РезультатЗапроса?
55 НЕА123
 
22.02.12
12:05
(53)
запрос с тремя полями Ссылка, Номер, Дата
SELECT
T1._IDRRef,
T1._Number,
T1._Date_Time
FROM _Document296 T1


запрос с одним полем Представление(ссылка)

SELECT
T1._IDRRef,
T2._Number,
T2._Date_Time
FROM _Document296 T1
LEFT OUTER JOIN _Document296 T2
ON T1._IDRRef = T2._IDRRef

почему так?
56 НЕА123
 
22.02.12
12:06
(54)
очень похоже на это.