Как преобразовать строку в число 1с
Возникла задача склеить два шестизначных числовых кода и записать их в один шестизначный код типа строка. О практическом применении напишу ниже.
Решение:
Выложим последовательность букв в ряд, например по алфавиту:
Алфавит = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";
У каждой буквы есть порядковый номер: А = 1, Б = 2, В = 3 …, Ю = 32, Я = 33.
Если после прохождения всех номеров добавлять разрядность и продолжать нумерацию то получим: АА = 34, АБ = 35, АВ = 36 … ААА = 1123, ААБ = 1124 .
Таким образом, буквенный ряд, как и числовой, будет бесконечным.
Из этого следует, что каждому числу соответствует одна комбинация букв нашего буквенного ряда, но при этом разрядность буквенной записи меньше за счет того, что букв в нашем ряде 33, а в числовом 10.
Это похоже на запись числа в шестнадцатеричном виде, но алгоритм немного другой и разрядов больше :)
Соответственно чем больше знаков в исходном буквенном ряде, тем меньше знаков потребуется для кодирования числа. Например, если составить ряд из букв верхнего и нижнего регистра русского и латинского алфавитов + цифры от 1 до 9 (ноль не используется) то длина его будет 127 символов.
Использем этот ряд для преобразование числа 999 999 999 999 в строку, получим значение 48AшяC
т.е. 12-ти значное число можем "свернуть" в 6-ти символьную строку.
Механизм по обратному преобразованию можно использовать не только для определения первоначального числа.
Например используя в качастве буквенного ряда алфавит, можно получить порядковый номер любого слова, этот номер постоянный и не может изменится. т.к. алфавит не меняется.
так слово КЛАССИФИКАТОР будет иметь номер 20674162138069284621
а слово АЛГОРИТМ номер 59583701312
Кроме того, добавив в буквенный ряд заглавные буквы, знаки препинания и пробел, можно получать номера целых предложений например:
Без труда не выловишь и рыбку из пруда. = 19470269484383031306224885067323003470882054702807657091899034219691830
Теперь по реализации преобразования:
Немного математики и получаем механизмы перевода значения числа в строку и обратно используя собственный буквенный ряд.
&НаКлиенте
Процедура Выполнить2 ( Команда )
//Из числа в строку
Алфавит2 = Объект . Алфавит2 ;
КолСимволов = СтрДлина ( Алфавит2 );
Сл = "" ;
Ч = Число (?( ЗначениеЗаполнено ( СокрЛП ( Объект . Строка2 )), СокрЛП ( Объект . Строка2 ), 0 ));
Пока Ч > КолСимволов Цикл
цел = Цел ( Ч / КолСимволов );
дроб = ( Ч / КолСимволов )- цел ;
Если дроб = 0 Тогда
НомерБуквы = КолСимволов ;
Ч = цел - 1 ;
Иначе
НомерБуквы = дроб * КолСимволов ;
Ч = цел ;
КонецЕсли;
Сл = Сред ( Алфавит2 , Окр ( НомерБуквы ), 1 ) + Сл ;
Если Ч > 0 Тогда
Сл = Сред ( Алфавит2 , Ч , 1 )+ Сл ;
КонецЕсли;
// Из строки в число
Ч = 0 ;
ДлСтроки = СтрДлина ( СокрЛП ( Объект . Строка ));
Для А = 1 По ДлСтроки Цикл Ч = Ч + Pow ( КолСимволов , ДлСтроки - А )* Найти ( Алфавит2 , Сред ( СокрЛП(Объект . Строка) , А , 1 )) КонецЦикла;
Способы применения:
- Использование максимального диапазона допустимых символов внутри установленной длинны кода.
- Визуальное кодирование и декодирование текста.
- Получение уникального идентификатора приемлемой длинны по нескольким элементам имеющим числовой код.
- Изменяя строку Алфавит2 (набор и последовательность символов), можно установить уникальную кодировку.
- Поместить строку в реквизит числового типа
- Генерировать строковые пароли
- Использовать как классификатор всех слов
Также можно подумать на счет хранения закодированного пароля в обычном реквизите типа число, при этом ключ надежно прятать :) может быть актульно для 7.7
число 22123476457584895786769029890898078978678123452153427867862146576367721919322327877721010111775763535555548388
строка рrюгщRPtpzWfнrYТHp1TЬйlЕldVdЙЛэCВщПzqJXлГэНZpmВeJяЧd
_______________________________________________________
строка ЕслиМеханизмИнтересенНажмитеПлюс
число 11214047979048599474046065949637649393355959347429435025149026973969
число 781060657266302177787942157125453912674901582490 (только русский алфавит нижний регистр, 33 знака)
В этой статье разберем возможности приведения типов в языке запросов 1С, которые предоставляет функция «Выразить».
Рассмотрим несколько вариантов применения этой функции.
И первый вариант – округление чисел.
Для этого необходимо использовать функцию Выразить в следующем формате:
Где:
Число — поле, параметр которое нужно округлить
ДлинаЧисла — максимальная длина числа
Точность — точность округления числа
Параметры и длинна и точность должны быть целыми положительными числами.
Посмотрите, как работает эта функция на рисунке ниже.
Второй вариант применения – приведение строк. Очень часто в конфигурациях используются строки неограниченной длинны, что накладывает некоторые ограничения. Например, мы не можем сравнивать строки неограниченной длины.
В запросе, который приведен ниже, поле ПолноеНаименование имеет тип строка неограниченной длины, и этот запрос не будет работать.
Для того что бы он работал, необходим поле неограниченной длины привести в строку с определенной длинной, делается это при помощи функции Выразить в следующем формате:
Выразить( как Строка()
Где
ДлинаСтроки – максимальная длина, к которой будет приведена строка.
Переделаем запрос: будем в условии приводить неограниченную строку к строке с определенной длинной. Тогда ни каких ошибок не будет.
Рассмотрим последний и, я бы сказал, самый главный вариант её применения: при работе с полями составного типа.
Ниже приведены два запроса, в которых используются поля составного типа. Первый неправильный, а второй правильный.
Т.е. когда вам нужно получить поле какого-нибудь составного типа, то всегда получайте значение этого поля только после приведения типа при помощи функции Выразить. В этом случае для документов и справочников будет следующий формат:
Где
ИмяТаблицы — название объекта в конфигураторе 1С.
Всегда используйте функцию выразить, когда работаете с составными типами, это существенно оптимизирует запрос.
Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи». Где эти и многие другие вопросы рассматриваются более подробно.
В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком
Для моих читателей, купон на скидку 25%: hrW0rl9Nnx
Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:
Можете перечислить любую сумму напрямую:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
One thought on “ Приведение типов в языке запросов 1С. ”
Добрый день, в 1С нельзя кастовать типы в запросе. Функция выразить используется для полей составного типа, что бы оставить один из них.
Подскажите, каким образом БЫСТРО преобразовать число в строку.
Нужно выделить только цифры, разделитель дробной части может быть как точка, так и запятая. Может есть компонента какая нибудь?
(7) если нужно БЫСТРО, сделайте там числовое поле и не парьте нам мозг. Преобразование Число-Число делается очень быстро, практически мгновенно.
Короче это прайс. Идет цена с разделителями разрядов (это про пробелы), затем валюта. Валюта может быть - рубли, USD, EUR, после валюты может быть точка (или нет).
(17) ты приведи пример строчки. Описание уже увидели. Просто сюда забей какое строковое значение ты пытаешься обработать.
(22) Ну тогда написать процедурку или функцию, сначала отрезаешь незначащие символы, затем убираешь пробелы. ну а дальше Число()
Да не проблема же никакая функцию нацарапать. Прайсов будет дофига, грузить нужно чем быстрее тем лучше.
(34) Через ексель файлы
это и есть проблема
(32) а какой смысл в огромной скорости при загрузке прайсов? Ну съэкономите вы максимум 10-12 наносекунд, вам премию что ли дадут? Скорость нужна при обслуживании клиента. А это потом.
(37) универсально все равно не напишешь, придется полууниверсально под каждого все равно допиливать. проще договориться о формате
(39) Объемы прайсов большие, их много.
А вообще вопрос в том, что есть ли простые, известные может быть, решения. Если нет, то нет, загрузить конечно всяко можно.
(42) а вообще, де много поставщиков, прайсы грузят отдельно от накладных (можно ночью), обрабатывая спец ящики поставщиков.
(49) Ну да. Но хотелось бы внешний вызов, компонента может есть, циклы 1с по каждой позиции грустно выглядят. Там прайсы довольно объемные.
(50) вызов компоненты в 100 раз медленнее, бери решения (24),(27) или (29), они имеют огромную скорость по сравнению с чтением файла Excel.
(52) Вообще вопрос безотносительно размеров. Можно ли ускорить загрузку, просто УСКОРИТЬ. А какие там прайсы дело десятое.
(53) Можно ли ускорить станок, чтобы он больше деталей выдавал? Просто ускорить, неважно какой станок.
(53) ускорить - это значит ускорить чтения файлов excel, например куда-нибудь их на быстрый диск помести.
(56) или xml например юзать. или тот же dbf, где у поля будет тип число и никак туда всякая шняга не попадет. вот это добавит скорости
(61) Дано: Excel. Решение: ускорить преобразование в число. Причина: преобразование можно ускорить.
Другие вероятные причины за бортом? )
(61) уж лучше напрямую из типизированного файла чем посредством таблицы, где контроль типа вообще никак не осуществляется. хочется скороссти - апгрейдить железо или менять алгоритм
(62) Дык понятно. Но скорее всего данные преобразования будут занимать процентов 5 от общего времени. В работе с экселем основной затык на чтении обычно.
(69) Лучший вариант - под формат числа каждого поставщика написать отдельную, наиболее быструю в конкретном случае функцию.
(0) Если это Excel, то прямо в Excel сделать в колонке цены все возможные замены, запятые на точки, пробелы и неразрывные пробелы удалить. различные варианты руб удалить.
(84) Ну тоже вариант. Но пользователи вряд ли будут заморачиваться. Я же говорю, вопрос не то чтобы очень критичный, но если можно ускорить этот момент, то хорошо, если нет вариантов, ну значит нет.
Попробовать обойтись без присвоений, все в одной строке.
Разберем основные вопросы преобразования типов в 1С 8.3: из строки в число, из числа в строку, из даты в число и прочие варианты. В этой статье мы рассмотрим функции преобразования значений, и я соберу в едино все варианты преобразования примитивных типов.
Строка в число в 1С
Узнаем, как в 1С 8.3 преобразовать строку в число.
Пусть, у нас есть числа в таком виде.
Для того, чтобы выполнить преобразование этих строк в число, необходимо воспользоваться методом Число. Этот метод преобразует параметр в число.
Обратите внимание, что разделять дробную часть можно в строке как при помощи символа точка «.», так и при помощи символа запятая «,». Если перед каким-то числом в строке стоят нули, то они отсекаются. У нас будет следующий результат.
Число в строку в 1С
Рассмотрим обратную задачу, когда в 1С 8.3 нужно преобразовать число в строку. Самый простой вариант использовать метод Строка, который преобразует собственный параметр в строку.
И какой результат возвращает этот код:
У этого способа имеется недостаток: он ставит пробелы между разрядами у длинных чисел. Для того, чтобы в 1С преобразовать число в строку без пробелов нужно воспользоваться функцией Формат. Данная функция имеет два параметра: преобразуемое значение и форматную строку. Если нам нужно указать, что число преобразуется в строку без пробелов в разряде, то необходимо указать в форматной строке, что порядок разделения группировки разрядов числа или равен 0, или пустой.
Результат будет без разрядов:
Строка в дату 1С
Узнаем, как преобразовать в 1С 8.3 строку в дату. Для этого необходимо использовать метод Дата, который преобразует параметр (в том числе строку ) в дату . Причем, замечу, что строка должна быть задана в таком формате «ГГГГММДДЧЧММСС».
Подробнее о форматах дат читайте в этой статье: даты в 1С.
Если мы зададим дату в не верном формате, то преобразование не произойдет и возникнет ошибка «Преобразование значения к типу Дата не может быть выполнено».
Например, этот код:
Приведет к ошибке:
Дата в строку в 1С
Преобразовать дату в строку можно несколькими способами. Первый способ: воспользоваться уже знакомым нам методом Строка.
В этом случае у нас выйдет строка в обычном «полном» формате даты.
А чтобы получить дату в том формате, в каком нам нужно, необходимо воспользоваться методом Формат.
Форматов дат может быть великое множество ,все я разбирать в этой статье не буду, покажу только как можно быстро воспользоваться этой функцией.
Мы изменим предыдущий код, написав вместо метода Строка метод Формат, а в качестве второго параметра у метода Формат напишем просто две кавычки.
После нужно между кавычками поставить курсор, вызвать контекстное меню, и применить в нем команду Конструктор форматной строки.
В этом конструкторе на закладке Дата вы можете выбрать удобный вам формат даты.
И после нажатия кнопки ОК этого конструктора, нужный формат появится в виде строки.
В результате метода Формат, дата будет преобразована в строку в том виде, в каком нам необходимо.
Строка в булево в 1С
При помощи метода Булево мы можем некоторые строковые представления (Да, Нет, Истина, Ложь) преобразовывать в значения Истина или Ложь.
Например, следующие переменные:
Будут иметь такие значения:
Булево в строку в 1С
Разберем, как в 1С можно выразить тип булево строкой. Булево значение можно преобразовать в строку несколькими способами. Во-первых, можно просто воспользоваться методом Строка.
Например, как здесь:
У нас будет выходить следующий результат:
В этом случае, булево в строку преобразовалось согласно региональным установкам информационной базы.
Если мы, как-то по-другому хотим преобразовать булево в строку, то можно воспользоваться уже знакомым нам методом Формат.
Переделаем, предыдущий код:
Знакомым способом вызовем конструктор форматной строки, где на закладке Булево введем преставление значений Истина и Ложь.
После нажатия кнопки ОК конструктора, второй параметр метода Формат заполнится:
И будет следующий результат:
Число в булево в 1С
В 1С 8.3. мы можем преобразовать любое число в булево по следующему правилу: 0 будет преобразован в Ложь, все остальные значения в Истина.
Будет следующий результат:
Булево в число в 1С
Можно сделать и обратное преобразование. Булево значение в число.
Для этого нужно воспользоваться методом Число, где в качестве параметра указать булево значение. Тогда Истина будет преобразована в 1С, а Ложь – в 0.
Например, как в этом коде:
С таким результатом:
Статьи о примитивных типах в 1С:
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
В данной обработке используется 2 способа выделения массива чисел из заданной строки любого размера.
Один способ использует обычный перебор символом и выделение символов цифр из строки.
Второй способ использует регулярные выражения.
На разном оборудовании разные способы выдают разное время выполнения.
Для внедрения в конфигурацию одного из способов может потребоваться протестировать время выполнения (миллисекунд) и сравнить.
Именно для этих целей предназначена данная простая обработка.
В моей практике програмиста понадобился способ получения массива чисел из строки.
Пришлось писать функцию.
- Разложение строки в массив чисел выполнять НА КЛИЕНТЕ дял уменьшения нагрузки на сервер.
- Алгоритм должен быть МАКСИМАЛЬНО БЫСТРЫМ.
Для этих целей я написал простую обработку, реализующую 2 способа обработки неограниченной строки в число. Точнее, в массив чисел:
- Один способ использует обычный перебор символом и выделение символов цифр из строки.
- Второй способ использует регулярные выражения.
В обработке есть 4 команды, позволяющие протестировать 2 способа разложения НА СЕРВЕРЕ, НА КЛИЕНТЕ.
Таким образом, можно оценить разницу скоростей выполнения.
Заранее невозможно предсказать скорость выполнения данной задачи. ПОЧЕМУ:
1. При выполнении на сервере время выполнения зависит от:
- Скорости работы памяти на сервере
- Скорости работы локальной сети (при больших объемах данных). Например, попробуйте загнать в обработку 1000 строк и посмотрите на скорость выполнения!
- От нагрузки на сеть и сервер в текущий момент времени.
2. При выполнении обработки на клиенте время выполнения зависит от:
- скорости работы локальной памяти на компьютере
- мощности процессора на локальном компе и т.п.
Поэтому по сути В ОБЩЕМ случае невозвожно предложить тот или иной способ из 4-х предложенных в данной обработке!
Тестируйте на каждом отдельном компьютере и сервере, на больших данных!
P.S. Напоследок немного кода:
1. Замер времени выполнения кода в миллисекундах, секундах, ну можно еще минутах, часах и т.п.
2. Неограниченная Строка в массив чисел, способ №1
Читайте также: