1. thorben 17 22.03.12 12:06 Сейчас в теме

Как уже в запросе объединить число и строку?

Как уже в запросе объединить ДопустимоеЧислоДнейЗадолженности (число) с со строкой «дней», т.е. чтобы сразу в таблице уже выдавалось "30 дней".
ДопустимоеЧислоДнейЗадолженности + « дней» не проходит.
Ответы
Избранное Подписка Сортировка: Древо
3. DikovSV 12 22.03.12 12:11 Сейчас в теме
(1) thorben,
У механизма запросов 1С проблема с преобразованием типов
32. fnxash 10.02.14 12:37 Сейчас в теме
(1) thorben, если у тебя скд то в нем делаешь макет для поля, в нем указываешь тип ячейки "шаблон" и к количеству дней добавляешь произвольный текст.
2. alex_bob 221 22.03.12 12:11 Сейчас в теме
ВЫРАЗИТЬ(ДопустимоеЧислоДнейЗадолженности КАК СТРОКА(3)) + " дней"
4. thorben 17 22.03.12 12:16 Сейчас в теме
(2) alex_bob,
Так я уже пробовал. Программа ругается и пишет, что "Несовместимые типы..." Она дает приобразовать число только в число, а в строку нет.
6. hulio 56 22.03.12 12:21 Сейчас в теме
(2) на 8.2.15.294 такое выражение не работает.
Не понимает язык запросов такие преобразования ...
49. starik-2005 1961 15.03.18 14:32 Сейчас в теме
Единственный метод сделать из числа строку - это деление на 10. Т.е.:
"ВЫБОР КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 0 ТОГДА "0"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 1 ТОГДА "1"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 2 ТОГДА "2"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 3 ТОГДА "3"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 4 ТОГДА "4"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 5 ТОГДА "5"
...
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 9 ТОГДА "9"
КОНЕЦ + ВЫБОР КОГДА ВЫРАЗИТЬ(ЧД - ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) * 1000 КАК ЧИСЛО(1))  = 0 ТОГДА "0"
ВЫБОР КОГДА ВЫРАЗИТЬ(ЧД - ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) * 1000 КАК ЧИСЛО(1)) = 1 ТОГДА "1"
...
ВЫБОР КОГДА ВЫРАЗИТЬ(ЧД - ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) * 1000 КАК ЧИСЛО(1)) = 9 ТОГДА "9"
КОНЕЦ + ВЫБОР КОГДА ...
...
КОНЕЦ КАК ЧислоСтрокой"
Показать


Т.е. делим на 1000 и получаем количество тысяч, потом вычитаем все полные тысячи и получаем количество сотен, потом вычитаем все полные тысячи, сотни и десятки - получаем количество единиц. Через временную таблицу со значениями 0..10 можно сделать более лаконичный код, но количество дней может в перспективе быть и более 9999, что уже дополнительно нужно будет предусмотреть. У Ильдаровича тут были какие-то запросики в минимализмах или еще где - поиском воспользуйтесь.
5. Maximus993 22.03.12 12:20 Сейчас в теме
Число в строку можно преобразовать в строку через Представление(значение), однако прибавить к результату строку все равно не получится.
7. thorben 17 22.03.12 12:23 Сейчас в теме
Понятно. Буду тогда результат запроса дорабатывать.
8. Cerberdm 20 22.03.12 13:35 Сейчас в теме
вариант с разбитием на два запроса предлагать?
9. thorben 17 22.03.12 13:41 Сейчас в теме
10. Cerberdm 20 22.03.12 13:43 Сейчас в теме
(9) thorben, дважды выполнить запрос будет медленнее, чем выполнить его один раз и обработать результат? )
11. Cerberdm 20 22.03.12 13:45 Сейчас в теме
(9) thorben, Хотя, честно говоря, сам в таких случаях обрабатывал результат запроса... )
12. thorben 17 22.03.12 13:48 Сейчас в теме
(11) Cerberdm,
просто я уже сделал обработку результата и теперь переделывать не хочется.
13. andrewks 1268 22.03.12 20:51 Сейчас в теме
вы будете смеяться, но это возможно. пакетный запросы, временные таблицы и соединения спасут мир
14. DikovSV 12 23.03.12 07:47 Сейчас в теме
(13) andrewks, есть рабочий пример?
15. andrewks 1268 23.03.12 22:46 Сейчас в теме
(14) вот, даже круче, чем в сабже

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
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)

Показать
ipoloskov; user832449; +2 Ответить
16. alex_bob 221 24.03.12 09:32 Сейчас в теме
(15) Нда. Печально это всё выглядит. Не хотел бы я сопровождать такой код. Особенно если его еще засунуть в СКД.
Уж лучше обработать результат.
17. andrewks 1268 24.03.12 15:05 Сейчас в теме
(16) каков вопрос - таков и ответ. и пока 1с не сделает нормальный каст (а она этого, мне кажется, не сделает), это будет выглядеть именно так. либо отказаться от хотелок и делать по-другому
rpgshnik; +1 Ответить
39. rpgshnik 1688 09.06.17 04:02 Сейчас в теме
(17) угу прошло 5 лет))) вы были правы
seregasame; POWone; neo-ti; Gendelf; 1c_uZer; the1c; guzel001; +7 Ответить
55. jane_de_rio 02.07.18 12:29 Сейчас в теме
Может кому-то пригодится.
В отчете на СКД нужно было вывести в колонку данные по номенклатуре: "Дата поставки" + ("Количество"). Еще и через запятую, для всех ожидаемых поступлений. Пример: 24.09.2018(14), 28.10.2018(6).
В запросе изначально дата выходила со временем. Получилось так:

Запрос:
ВЫБРАТЬ
	ЗаказыПоставщикамОстатки.Номенклатура КАК Материал,
	ЗаказыПоставщикамОстатки.Характеристика КАК МХарактеристика,
	ПРЕДСТАВЛЕНИЕ(ЗаказыПоставщикамОстатки.ЗаказПоставщику.Дата) КАК ДатаПоступления,
	ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ЗаказыПоставщикамОстатки.ЗаказаноОстаток, 0)) КАК КоличествоНаДату,
	СУММА(ЗаказыПоставщикамОстатки.ЗаказаноОстаток) КАК МОтПоставщика
ИЗ
	РегистрНакопления.ЗаказыПоставщикам.Остатки КАК ЗаказыПоставщикамОстатки

СГРУППИРОВАТЬ ПО
	ЗаказыПоставщикамОстатки.Номенклатура,
	ЗаказыПоставщикамОстатки.Характеристика,
	ПРЕДСТАВЛЕНИЕ(ЗаказыПоставщикамОстатки.ЗаказПоставщику.Дата),
	ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ЗаказыПоставщикамОстатки.ЗаказаноОстаток, 0))
Показать


В Вычисляемых полях формула: МПоступления = ПОДСТРОКА(ДатаПоступления, 1, 10) + " (" + КоличествоНаДату + ")" .

В Ресурсах: СоединитьСтроки(МПоступления, ", ") .
Прикрепленные файлы:
56. user637491_roschakartem 20.07.18 18:25 Сейчас в теме
(55)
ПОДСТРОКА(ДатаПоступления, 1, 10)

(55) Работает и без "Представление", достаточно только "Подстроки"
57. spacecraft 20.07.18 18:30 Сейчас в теме
(56) подстрока научилась работать с датой?
18. n_I_v_a 27.03.12 08:23 Сейчас в теме
В СКД совершенно спокойно можно соединить поле Представление(ИмяПоля) + "текст" на закладке "Вычисляемые поля", можно написать даже выражение для правильной записи "дней", "дня", "день"
toxa688; temka_1105; Восьмой; +3 Ответить
24. Hany 06.02.13 12:48 Сейчас в теме
неясно, найден ли вариант решения?

Если это СКД, то такой вопрос вообще не должен ставить в тупик, в (18) ответ.

Если это построитель или отчет со своим макетом - то что мешает добавить поле НазваниеДней как-то так:


...
|" дней" КАК стрНазваниеДней,
...


и выводить его сразу за полем, в котором число ДопустимоеЧислоДнейЗадолженности
19. n_I_v_a 27.03.12 14:54 Сейчас в теме
Кстати, в запросе всё прекрасно соединяется, ПРЕДСТАВЛЕНИЕ() +"текст"
20. andrewks 1268 27.03.12 18:03 Сейчас в теме
(19) ню-ню. а проверить прежде, чем советовать, не судьба?
21. n_I_v_a 27.03.12 19:42 Сейчас в теме
Проверено, работает. Может быть понятнее будет на примере:
Текст Набора данных Запрос

ВЫБРАТЬ
	Номенклатура.Ссылка,
	Номенклатура.Наименование,
	ПРЕДСТАВЛЕНИЕ(Номенклатура.Реквизит1) КАК ЭтоБылоЧисло
	ИЗ
	Справочник.Номенклатура КАК Номенклатура
Показать

Текст строки Вычисляемые поля Выражение

ЭтоБылоЧисло + " а это текст"

Всё прекрасно соединяет

А вот про запрос добавила зря. Извиняюсь.
22. batlerrett 06.02.13 12:09 Сейчас в теме
Никак, попробуйте 8.3, возможно там заработал метод Выразить
23. andrewks 1268 06.02.13 12:42 Сейчас в теме
(22) batlerrett, с чего бы это он там заработал?
25. juntatalor 61 06.02.13 15:59 Сейчас в теме
Если ДЕЙСТВИТЕЛЬНО необходимо это делать в запросе, можно использовать пакет запросов (т.к. даже в справке по функции ПРЕДСТАВЛЕНИЕ указано, что ее результат нельзя дальше использовать, а ВЫРАЗИТЬ вообще для составных типов):

ВЫБРАТЬ
Справочник1.Поле1 КАК Поле1Число, // Это число
ПРЕДСТАВЛЕНИЕ(Справочник.Поле1) КАК Поле1Строка // Это строка
ПОМЕСТИТЬ ВремТаб
ИЗ Справочник.Справочник1 КАК Справочник1;

ВЫБРАТЬ 
ВремТаб.Поле1Строка + " тут нужная строка"
ИЗ ВремТаб КАК ВремТаб
Показать
temka_1105; alean; +2 1 Ответить
26. suggestive 264 06.08.13 13:07 Сейчас в теме
(25) juntatalor, При использовании временных таблиц все равно ругается и не дает запрос выполнить.
27. h00m 16.08.13 15:47 Сейчас в теме
Лично я сделал это коряво (но работает). СКД не вариант (переписывать дольше), а конвертить нужно было всего-навсего номер строки, который у нас ограничен количеством 99.
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	1 КАК НомерСтроки,
	|	""01"" КАК НомерСтрокиТекст
	|ПОМЕСТИТЬ СоответствиеЧислаСтроке
	|";
	
	
	Для Счетчик = 2 По 99 Цикл
		ТекстЗапроса = ТекстЗапроса + "ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ
		|	" + Счетчик + ",
		|	""" + Строка(Формат(Счетчик, "ЧЦ=2; ЧВН=")) + """";
	КонецЦикла;
Показать
28. juntatalor 61 27.08.13 17:39 Сейчас в теме
(27) h00m, пожалейте голову и глаза того, кто будет после вас это разбирать! Уж лучше не использовать запросы вовсе (если нет технической возможности преобразовать число в строку), чем делать это так.
It-developer; +1 Ответить
29. h00m 27.08.13 23:53 Сейчас в теме
(28) Это же не запрос в цикле, или какая-то другая ошибка, это вполне адекватный код. Вы не встречали в Бух-ии решение при помощи теории графов?
30. Allexe8.1 28.08.13 03:22 Сейчас в теме
(29) h00m, а что мешает предварительно ТЗ заполнить и поместить ее во временную таблицу?
31. pogonii 10.02.14 11:49 Сейчас в теме
Самый лучший вариант . Преобразовать строку в число или число в строку в запросе не получиться.
33. KrivosheevEV 10.02.14 13:14 Сейчас в теме
А ещё.. а ещё в СКД можно Пользовательские поля использовать.
34. batlerrett 11.02.14 09:26 Сейчас в теме
Можно попробовать пользовательское поле уже в режиме пользователя
35. Boneman 227 11.02.14 12:59 Сейчас в теме
мне кажется топикстартер уже давно решил эту проблему.
АРХЕОЛОГИ )))
36. Bukaska 130 11.02.14 17:50 Сейчас в теме
(35) Boneman, Угу.. подняли старую тему)))
37. sheff161 10 11.11.16 10:45 Сейчас в теме
У меня была задача похожего плана в скд один ресурс тип строка "СтатусОплаты" а другой тип число "СуммаОплаты"
сделал так в вычисляемом поле написал: ""+Формат(СтатусОплаты)+Формат(СуммаОплаты)
38. MIkhailovUA 24.03.17 01:12 Сейчас в теме
Пример выражения вычисляемого поля: СТРОКА(РЕЗУЛЬТАТ) + " ("
40. ccserg 37 23.08.17 11:36 Сейчас в теме
если нужно вывести такие данные в поле отчета
то используете вывод в поле с заполнением по "Шаблон"
Гр.[ИмяГруппы] Ур. [КодУровня]
41. Hawk_sib 15 10.10.17 17:58 Сейчас в теме
я в запросе сделал через подстроку:
ПОДСТРОКА("1234", ВТ_ИсходныеДанные.Квартал, 1) + " кв. "
если к числу нужно привести год, то добавил вычисление разряда:
ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_ИсходныеДанные.Год * 0.006)) / 6 + 1, 1) 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_ИсходныеДанные.Год * 0.06)) / 6 + 1, 1) 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_ИсходныеДанные.Год * 0.6)) / 6 + 1, 1) 
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_ИсходныеДанные.Год * 6)) / 6 + 1, 1) + " год"
zveruganet; +1 Ответить
42. sinops 11.10.17 00:29 Сейчас в теме
Тема старая, но по итогу объединение в запросе строки с числом невозможно, можно придумывать велосипеды но они не заработают, поэтому раз все сейчас на СКД , то после запроса либо делаешь шаблон в печатной форме, либо как тут выше было написано пишешь вычисляемое поле , хотя мне кажется что вычисляемое поле тоже может вывалиться в ошибку.
Я сделал все через шаблон уже в момент вывода печатной формы.
POWone; Taktic; +2 Ответить
43. toxa688 3 15.12.17 11:27 Сейчас в теме
(42) Сделал в вычисляемом поле так:

Выбор когда НАШЕЧИСЛО= 0 тогда "Не заполнено" иначе Строка(НАШЕЧИСЛО)+" ТЕКСТ" конец

Все работает отлично. Но в запросе этого не добиться.
44. user872194 06.02.18 06:06 Сейчас в теме
Хотел поумничать что можно сложить значения но с числом реально не вышло с 1 захода.
45. It-developer 20 15.03.18 13:00 Сейчас в теме
прошло X лет. 1с до сих пор не дает возможности так сделать :(
POWone; uri1978; Gendelf; +3 Ответить
47. catena 100 15.03.18 13:15 Сейчас в теме
(45) Для чего это делать в запросе-то? Запрос - не интерфейсная финтифлюшка. Запрос для выборки данных. А для вывода пользователю в любом удобном виде существует куча бантиков.
48. Octopus 337 15.03.18 14:08 Сейчас в теме
(47) Иногда такие штуки нужны в динамических списках. Там никак бантиками не обойтись, только запрос.
54. It-developer 20 15.03.18 18:26 Сейчас в теме
(47) Потому что на начальном этапе может быть удобно получить и далее с этим работать. Мне вообще нравится получать максимум в запросах, а потом уже плюшки СКД и все такое
(52) Извращаться как то не очень хочется. Статьи и т.д. как бы сказать - задача мелкая по своей сути
---
Вообще не понимаю какие могут быть проблемы с преобразованием числа в строку - указал формат и все, обратное - да, чуть сложнее
52. ildarovich 6721 15.03.18 16:38 Сейчас в теме
(45) Если очень нужно и именно в запросе, то в статье Выразить число как строку и дату как строку в запросе написано как это сделать. Там не такое уж громоздкое выражение получается (по сравнению с выделением разрядов делением как предлагается в (49)).
Кстати, в (41) предлагается решение именно из указанной статьи.

(49) Все же это не единственный метод - посмотрите статью по ссылке.
53. starik-2005 1961 15.03.18 16:59 Сейчас в теме
(52) Да, вариант с временем тоже прикольный и в общем и целом весьма лаконичный. Ну и вычислений меньше.
46. VmvLer 15.03.18 13:08 Сейчас в теме
если эта задача узкая, т.е. достаточно в итоге получать
поля вида

"1 день",
..
"25 дней",
"30 дней",

то делаете временную таблицу

ВЫБРАТЬ
1 КАК КАК ДеньНомер,
"1 день" КАК ДеньИнфо
ОБЪЕДИНИТЬ ВСЕ
...
ВЫБРАТЬ
25 КАК КАК ДеньНомер,
"25 дней" КАК ДеньИнфо
...
Показать


что делать дальше очевидно
50. starik-2005 1961 15.03.18 14:52 Сейчас в теме
Вот написал запросик для значений от 0 до 9999
ВЫБРАТЬ
	1 КАК Поле1,
	"1" КАК Поле2
ПОМЕСТИТЬ ВТ1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	5432 КАК Поле1
ПОМЕСТИТЬ ВТ2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ10.Поле2 + ВТ11.Поле2 + ВТ12.Поле2 + ВТ13.Поле2 КАК Поле1
ИЗ
	ВТ2 КАК ВТ2
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ10
		ПО ((ВЫРАЗИТЬ(ВТ2.Поле1 / 1000 - 0.49 КАК ЧИСЛО(2, 0))) = ВТ10.Поле1)
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ11
		ПО ((ВЫРАЗИТЬ((ВТ2.Поле1 - ВТ10.Поле1 * 1000) / 100  - 0.49 КАК ЧИСЛО(2, 0))) = ВТ11.Поле1)
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ12
		ПО ((ВЫРАЗИТЬ((ВТ2.Поле1 - ВТ10.Поле1 * 1000 - ВТ11.Поле1 * 100) / 10  - 0.49 КАК ЧИСЛО(2, 0))) = ВТ12.Поле1)
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ13
		ПО ((ВЫРАЗИТЬ(ВТ2.Поле1 - ВТ10.Поле1 * 1000 - ВТ11.Поле1 * 100 - ВТ12.Поле1 * 10  - 0.49 КАК ЧИСЛО(2, 0))) = ВТ13.Поле1)
Показать
51. starik-2005 1961 15.03.18 15:35 Сейчас в теме
(50) да, тут ошибочка с округлением в запросе. Нужно вместо "0.49" прописать "0.49999" везде - точно хватит.
58. alexpot 6 12.09.18 12:58 Сейчас в теме
Как вариант: (ВЫРАЗИТЬ("ВашаСтрока" КАК СТРОКА(100))) + (ВЫРАЗИТЬ(ВашеЧисло) КАК СТРОКА(100)))
Важно: тип СТРОКА(кол-во симв.) должен быть одинаковым у подстрок в операции конкатенации (сцепления)
proger1c81; +1 Ответить
60. vl-sher1 10.09.19 14:33 Сейчас в теме
(58) В запросе НЕ работает (выбрать выразить(1 как строка(100)) - несовместимые типы)
59. ripreal1 337 16.02.19 13:43 Сейчас в теме
В 8.3.12. для динамических списков можно использовать новое свойство Формата - "Шаблон форматированного числа"
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Программист 1С
Нижний Новгород
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день