Преобразование числа в строку в запросе 1С 8.x

23.02.16

Разработка - Универсальные функции

В запросах 1С предприятие 8.x есть ограничение: нельзя преобразовывать число в строку.

Ограничение предсказуемо, т.к. для преобразования числа в строку возникает много  вариантов представления числа: выводить лидирующие нули, до какого знака выводить после запятой, и т.д. Система счисления тоже может быть разная: десятичная, двоичная, шестнадцатеричная или n-ичная.

Данное ограничение можно преодолеть с помощью математической операции округления. Далее представлен текст запроса, который вернет строку "Число приведенное к строке 97443.456".

 

ВЫБРАТЬ
    97443.456 КАК Поле
ПОМЕСТИТЬ ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "Число приведенное к строке " +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 10000 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 100000 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 1000 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 10000 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 100 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 1000 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 10 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 100 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + ТЗ.Поле - (ВЫРАЗИТЬ(ТЗ.Поле / 10  - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)+
    "."+
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 0.1 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 1 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 0.01 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 0.1 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 0.001 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 0.01 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)
    КАК СтрокаПоле
ИЗ
    ТЗ КАК ТЗ

 

Рассмотрим как это работает. Каждая цифра вычисляется и выводится отдельно. Для цифры в разряде i вычисление проводится следующим образом

Операция Цел(x) реализуется в запросе 1С 8.x с помощью округления Выразить. Несложно проверить:

Цел(x)=Выразить(x - 0.5 КАК ЧИСЛО(14,0))

Мы получили весь набор цифр числа в виде чисел от 0 до 9. Сделать из них строки можно с помощью Строковой функции ПОДСТРОКА("0123456789",1+Цифра).

Аналогично можно реализовать вывод чисел в другой системе счисления.

Подобный функционал можно просмотреть здесь: http://kb.mista.ru/article.php?id=666

Вступайте в нашу телеграмм-группу Инфостарт

Преобразование числа в строку запрос 1С

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4445    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    8225    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    54916    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7853    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    69596    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9825    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. u_n_k_n_o_w_n 35 23.02.16 21:58 Сейчас в теме
Плагиат!!!
Просьба указать первоисточник!!!
2. starik-2005 3217 23.02.16 22:05 Сейчас в теме
4. lastcontra 106 24.02.16 08:05 Сейчас в теме
(2) starik-2005, в твоей ссылке на статью написано, что это невозможно, кроме одного сообщения, что нужно вывести по разрядам (но как это сделать не расписано, и инициатор в итоге смирился, что это не возможно). Я говорю, что это возможно, вот конкретный пример в статье.
5. starik-2005 3217 24.02.16 09:17 Сейчас в теме
(4) Вы бы в смысл того, что я написал, вдумальсь бы немного. То, что Вы скопипастили один в один запрос из статьи "минимализмы", автор которой скопипастил ее из приведенных им источников - это не плохо. Но моя ссылка на древний источник, в котором это расписано, а там есть посылка в книгу знаний мисты, где данный запрос приведен в том практически виде, который приводите Вы. Странно, что автор первого коммента не уличил в плагиате Ильдаровича !или как его там?)
u_n_k_n_o_w_n; +1 Ответить
7. lastcontra 106 24.02.16 11:48 Сейчас в теме
(5) starik-2005, чтобы вдуматься в смысл того, что ты написал, надо хотя бы что-то написать.
Из того что ты написал "тут и ссылка" я должен найти очень тайную книгу Мисты и статью "минимализмы"???
Ссылку на статью кто-нибудь может прислать?
Так можно про любую статью писать - "все что придумано - плагиат тайной книги которой мы поклоняемся каждый раз в монитор".
Пока не увижу статью нет смысла трепаться. Да и мне не нужно никому доказывать, что до меня это никто не придумал, не нравится не читай.
SergeyTerentyev; +1 Ответить
10. ildarovich 8053 24.02.16 13:31 Сейчас в теме
(5) starik-2005,
То, что Вы скопипастили один в один запрос из статьи "минимализмы", автор которой скопипастил ее из приведенных им источников

вы, думаю, не потрудились разобраться в тонкостях приведенных выражений, а они могут быть интересны и поучительны. Поэтому и возводите напраслину. Прежде чем что либо "изобрести" я обычно просматриваю уже имеющиеся решения и чужие решения стараюсь не повторять. И в "минимализмах" , "минимализмах2" (с) и в статье Выразить число как строку и дату как строку в запросе опубликованы мои собственные оригинальные решения, всегда имеющие признаки какой-либо новизны.

Преобразование строки в число приведенным здесь способом - более-менее очевидное решение. В своей статье я бы его повторять не стал, но мотивы автора статьи мне понятны, претензию на оригинальность автор объяснил.

Вообще такое решение я уже видел ранее несколько раз. В ссылке на мисте оно записано наиболее "коряво". Данное решение мне не нравилось тем, что аргумент приходится записывать дважды. В моем решении остаток от деления вычисляется через функции работы с датами (в этом суть изобретения), что дает более короткую запись с одним упоминанием аргумента при нахождении каждого разряда.
CodeNull; cleaner_it; +2 Ответить
11. starik-2005 3217 24.02.16 19:40 Сейчас в теме
(10) ildarovich, вот честно даже не тягет с умным человеком спорить ни разу. Но про плагиат не я написал, заметьте. Уже второй раз пытаюсь защитить позицию автора на данном сайте, но из-за, видимо, проблем с логикой у 1с-ников, мне же и достается)))
3. lastcontra 106 24.02.16 08:00 Сейчас в теме
(1) u_n_k_n_o_w_n, укажи первоисточник, раз ты уже видел такую статью.
6. Sgeor 24.02.16 09:44 Сейчас в теме
Может каждому пользователю такую статейку написать? =)
http://infostart.ru/public/331805/
Istur; speshuric; mike_grig; Bassgood; u_n_k_n_o_w_n; Dimel; +6 Ответить
8. u_n_k_n_o_w_n 35 24.02.16 12:24 Сейчас в теме
9. lastcontra 106 24.02.16 12:42 Сейчас в теме
Добавил ссылку подобную на статью. Признаю, что она более ранняя, чем моя. Но моя статья не является ее копией, ничего особенного нет в этих статьях (включая мою), чтобы их нельзя было написать самому, имея какое-то тайное знание.
12. Fragster 1166 02.03.16 14:33 Сейчас в теме
Регулярно вижу статьи на тему преобразования строки в число и обратно в запросе. И каждый раз возникает вопрос: "А зачем?"
13. lastcontra 106 02.03.16 20:28 Сейчас в теме
(12) Fragster, значит ты их регулярно читаешь и пишешь отзывы, а зачем? 1. Ничего нового не узнал, 2. чего ты хочешь чтобы тебе ответили? ЗАЧЕМ????
14. Fragster 1166 03.03.16 15:01 Сейчас в теме
(13) реальная применимость этих запросов какая? Ну, кроме "смотрите, как я могу?"
ИНТЕГРА; +1 Ответить
15. speshuric 1343 11.03.16 03:12 Сейчас в теме
(14) Fragster,
В идеальном мире, где единороги какают радугой, и есть бесконечные ресурсы и бесконечное время на разработку такие запросы, наверное, не нужны. Почти всегда они говорят о каких-то неприятных вещах типа технического долга или кривой архитектуры. Но у нас, в реальном мире, они часто пригождаются. Примеры:
  • Иногда (в отчетах) очень нежелательно протягивать в источнике данных новое поле и нужно сформировать строку типа "Название+Размер". А если этот отчет на построителе отчетов, а не на СКД, то и вообще альтернатив нет, если не переписывать его полностью.
  • При вытягивании достаточно больших объёмов из базы (выгрузки или очень большие отчеты) то же самое представление на сервере будет считаться быстрее и меньше данных придётся тянуть с сервера. А если весь код выгрузки/отчета вообще оперирует только результатами запроса, то опять же - альтернатив кроме как "переписать всё" нет. Я сталкивался с отчетами и выгрузками по 100 млн строк.
  • Внешняя система даёт вам неразбираемый фильтр по такому представлению ("Название+Размер"). приходится собирать из своих полей в запросе и сравнивать с таким фильтром. Не тянуть же без фильтра всё на клиента.
  • Нужно отсортировать выборку по представлению числа в алфавитном порядке (1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9)
В обратную сторону тоже примеры есть. Да, еще раз подчеркну, когда возникает эта задача - это явный признак, что что-то не так в системе. Но обычно решение нужно скорее, чем полная переработка решения и структур данных, особенно, если это задачи отчетов или интеграции (которые часто ставятся и решаются после реализации основного функционала).

Другой вопрос, что задача тянет на слегка продвинутую задачу на собеседовании (если без текста, то хотя бы путь решения, и это минут на 5-7). Причем для ведущего программиста можно еще и с дополнительными ограничениями (например, "нам не известна разрядность") или ожидать 3-4 решения. А для лида или архитектора еще и вопрос "что надо сделать, чтобы не писать такие запросы".
16. inf012 31.10.16 09:35 Сейчас в теме
А что в итоге универсального решения нет?
Мне все в запросе надо обработать, у меня строка получается формата:
00003.000
А мне надо просто 3 чтобы вернулось.
Как убрать лидирующие нули? и дробную часть?
Если я заранее не знаю исходное число (также получается только в запросе)
17. ildarovich 8053 31.10.16 13:13 Сейчас в теме
(16) Универсальные решения есть:
Выразить число как строку и дату как строку в запросе ,
Выразить строку как число и строку как дату в запросе.

Но вам, видимо, нужно не строку в число преобразовать, а строку в строку без ведущих нулей и всего, что справа от точки (и без самой точки).
Хотя это и можно сделать "универсально" с помощью искусственных таблиц, при вашей длине строки лучше использовать громоздкое выражение ВЫБОР КОГДА ПОДСТРОКА(Х, 1, 1) = "0" ТОГДА ПОДСТРОКА(Х, 2, 8) КОГДА ПОДСТРОКА(Х, 1, 2) = "00" ТОГДА ТОГДА ПОДСТРОКА(Х, 3, 7) ... . Аналогично потом можно определить положение точки и обрезать строку справа.
18. k9260130000 27 19.10.17 14:26 Сейчас в теме
Лидирующие нули выбором убираем. За исключением их весьма годное решение. Как - то так получилось. Надо было писать сроки производства строкой через тире собирая из 2х чисел.

ВЫБОР
		КОГДА НЕ ЗаказПокупателя.СрокИзготовленияПродукции1 = 0
			ТОГДА ВЫБОР
					КОГДА НЕ ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции1 / 10 - 0.5 КАК ЧИСЛО(3, 0))) - (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции1 / 100 - 0.5 КАК ЧИСЛО(3, 0))) * 10, 1) = "0"
						ТОГДА ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции1 / 10 - 0.5 КАК ЧИСЛО(3, 0))) - (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции1 / 100 - 0.5 КАК ЧИСЛО(3, 0))) * 10, 1)
					ИНАЧЕ ""
				КОНЕЦ + ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции1 / 1 - 0.5 КАК ЧИСЛО(3, 0))) - (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции1 / 10 - 0.5 КАК ЧИСЛО(3, 0))) * 10, 1) + "-"
		ИНАЧЕ ""
	КОНЕЦ + ВЫБОР
		КОГДА НЕ ЗаказПокупателя.СрокИзготовленияПродукции2 = 0
			ТОГДА ВЫБОР
					КОГДА НЕ ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции2 / 10 - 0.5 КАК ЧИСЛО(3, 0))) - (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции2 / 100 - 0.5 КАК ЧИСЛО(3, 0))) * 10, 1) = "0"
						ТОГДА ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции2 / 10 - 0.5 КАК ЧИСЛО(3, 0))) - (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции2 / 100 - 0.5 КАК ЧИСЛО(3, 0))) * 10, 1)
					ИНАЧЕ ""
				КОНЕЦ + ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции2 / 1 - 0.5 КАК ЧИСЛО(3, 0))) - (ВЫРАЗИТЬ(ЗаказПокупателя.СрокИзготовленияПродукции2 / 10 - 0.5 КАК ЧИСЛО(3, 0))) * 10, 1)
		ИНАЧЕ ""
	КОНЕЦ КАК СрокПроизводства
Показать
19. dgonson 178 20.02.19 09:09 Сейчас в теме
Дописал код примера, что бы убирались нули, для полноты картины)

ВЫБРАТЬ
    45.5 КАК Поле
ПОМЕСТИТЬ ТЗ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 10000 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 100000 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 1000 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 10000 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 100 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 1000 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 10 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 100 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + ТЗ.Поле - (ВЫРАЗИТЬ(ТЗ.Поле / 10  - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)+
    "."+
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 0.1 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 1 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) +
    ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле / 0.01 - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 0.1 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1) 
    КАК СтрокаПоказатель
Поместить втПредварительныеДанные    
ИЗ
    ТЗ КАК ТЗ;
	
//////////////////////////////////////////////	
ВЫБРАТЬ
	СтрокаПоказатель,
	ВЫБОР КОГДА ПОДСТРОКА(СтрокаПоказатель,1,4)="0000" ТОГДА ПОДСТРОКА(СтрокаПоказатель,5,1) 
		  КОГДА ПОДСТРОКА(СтрокаПоказатель,1,3)="000"  ТОГДА ПОДСТРОКА(СтрокаПоказатель,4,2)  
	      КОГДА ПОДСТРОКА(СтрокаПоказатель,1,2)="00"   ТОГДА ПОДСТРОКА(СтрокаПоказатель,3,3)  
	      КОГДА ПОДСТРОКА(СтрокаПоказатель,1,1)="0"   ТОГДА ПОДСТРОКА(СтрокаПоказатель,2,4)  
	ИНАЧЕ ПОДСТРОКА(СтрокаПоказатель,1,5)       
	КОНЕЦ
	+
	ВЫБОР КОГДА ПОДСТРОКА(СтрокаПоказатель,7,2)="00" ТОГДА ""
	ИНАЧЕ 
		ВЫБОР КОГДА ПОДСТРОКА(СтрокаПоказатель,8,1)="0" ТОГДА ПОДСТРОКА(СтрокаПоказатель,6,2)
		ИНАЧЕ ПОДСТРОКА(СтрокаПоказатель,6,3)
	    КОНЕЦ
	КОНЕЦ    
	
ИЗ втПредварительныеДанные
Показать
20. mark_oilbass 25.03.20 08:41 Сейчас в теме
Сейчас на выходе получается цифра 00003.000, а как получить 00000000000003?
т.е. хотелось бы получить число (14,0)
21. lastcontra 106 25.03.20 12:47 Сейчас в теме
(20) По аналогии. Добавить разряды до точки и убрать после точки. Жаль, что вы не вникли, зачем тогда эти статьи.
22. mark_oilbass 25.03.20 14:18 Сейчас в теме
(21)В том то и дело что я так и сделал.
Но у меня такая ситуация с 1 на выходе получаю вот так 99990000000001
23. mark_oilbass 25.03.20 14:25 Сейчас в теме
(21) я делаю отбор в запрос и такое получается когда Поиск идет по цифре 9
24. rabid_otter 134 23.05.20 18:25 Сейчас в теме
господи, а зачем? не легче ли выпросить у 1С нормальный cast?
неприменимо, т. к. число должно быть неотрицательным, строго определенного формата.
жуткий, неприменимый костыль, имхо.
25. lastcontra 106 25.05.20 10:14 Сейчас в теме
Согласен, это не для применения. Просто теоретические выводы. На практике не применял.
26. gybson 6 07.07.22 21:19 Сейчас в теме
Выбрать Представление(19)
27. Vend34 09.11.22 10:16 Сейчас в теме
В этой строке ошибка
ПОДСТРОКА("0123456789", 1 + ТЗ.Поле - (ВЫРАЗИТЬ(ТЗ.Поле / 10 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)+
Должно быть так
ПОДСТРОКА("0123456789", 1 + (ВЫРАЗИТЬ(ТЗ.Поле - 0.5 КАК ЧИСЛО(14, 0))) - (ВЫРАЗИТЬ(ТЗ.Поле / 10 - 0.5 КАК ЧИСЛО(14, 0))) * 10, 1)+
28. lastcontra 106 16.11.22 04:22 Сейчас в теме
(27) Так, как описано в статье, должно работать. Я проверял. Функция ПОДСТРОКА работает с дробными числами, поэтому сократил код. Может есть пример как мой запрос неправильно преобразует число в строку?
29. maxicom 17.11.23 07:36 Сейчас в теме
(28)Вот пример ошибки. Число 112506 преобразуется в 12506
30. lastcontra 106 17.11.23 11:03 Сейчас в теме
(29)
12506

Запрос, представленный в статье, рассчитан на пятизначное число в целой части. В вашем примере запрос первые 5 цифр обработал правильно. По аналогии дополните запрос и он корректно преобразует 6-значное число.
Для отправки сообщения требуется регистрация/авторизация