1с найти число в строке
Войдите как ученик, чтобы получить доступ к материалам школы
Внутренний язык программирования 1С 8.3 для начинающих программистов: работа со строками в 1С
Автор уроков и преподаватель школы: Владимир Милькин
Друзья, сегодня будет интереснейший урок. Мы научимся выполнять операции со строками (мы проходили их здесь).
Наверное, не найдётся ни одного языка программирования, который не давал бы возможностей для обработки строк. Настолько это фундаментальный и необходимый тип данных.
И 1с в этом смысле не исключение. Я, как обычно, прошу вас повторять и проверять у себя весь код, который мы будем писать в этом уроке.
Откуда в программе появляются строки
Сам программист может закодировать определенное значение строки прямо в коде, используя двойные кавычки .
. и далее использовать его по своему усмотрению:
Бывает и так, что значение строки должен ввести сам пользователь. Это делается при помощи команды ВвестиСтроку:
Из чего состоит строка
Любая строка состоит из символов.
К примеру, строка "привет" состоит из символов 'п', 'р', 'и', 'в', 'е', 'т'.
К этим символам можно обращаться по их порядковому номеру. При этом нумерация символов в строке (в отличие от коллекций) начинается не с 0, а с 1.
Узнать общее количество символов в строке можно при помощи функции СтрДлина. Она принимает на вход строку и возвращает нам число символов в этой строке.
Таким образом, цикл обхода строки будет таким:
Если мы запустим эту программу на компьютере, то увидим такой результат:
Мы научились получать номера символов в строке, но как получать сами символы?
За получение нужного символа (или даже группы символов) из строки отвечает функция Сред (сокращение от слов "средина", "средний").
Она принимает три параметра:
- Саму строку.
- Номер символа в строке, который нужно получить.
- Количество символов, которое нужно получить.
В нашем случае мы будем получать по одному символу, поэтому третий параметр у нас всегда будет равен 1.
Итак, перепишем наш код вот так:
Теперь вывод будет совсем другим:
Что представляет из себя символ
Мне иногда кажется, что всё в этом мире есть числа . И символы строки, кстати, не исключение.
И это на самом деле так, ведь каждому значению символа соответствует определенное число, его код.
Зачем вообще может понадобиться переводить символ в числовой код и обратно? Например, если мы захотим написать программу для шифрования и дешифрования текстов. А мы захотим и сделаем это в следующем модуле школы.
За перевод символа в числовой код отвечает функция КодСимвола. Она принимает строку и порядковый номер символа в ней, а возвращает числовой код этого символа.
Давайте выведем числовой код каждого символа нашей строки:
Запустим эту программу, вывод будет таким:
Получается, что, к примеру, символу 'п' соответствует числовой код 1087? Да, это действительно так. Проверим это.
Для этого я сообщу вам способ для обратного перевода: из числового кода в символ. За такой перевод отвечает функция Символ. Она принимает на вход числовой код, а возвращает символ.
Объединение строк
Давайте представим, что у нас есть две вот такие строки .
. и мы хотим сложить (ещё говорят "склеить", "объединить") эти строки вместе, чтобы за значением первой строки сразу следовало значение второй.
Это делается при помощи оператора плюс (+), вот так:
Выведем эту строку пользователю:
Выглядит не очень, правда?
Давайте усложним задачу - требуется объединить эти строки, но между ними вставить пробел, а в конце добавить восклицательный знак.
Вот так гораздо лучше!
Поиск в строке
Давайте рассмотрим такую интересную задачу. Попросим пользователя ввести любой текст, но чтобы в нём встречалось (или нет) слово "счастье".
А в ответ мы будем говорить пользователю в какой позиции в строке находится это слово.
К примеру, если пользователь введёт строку "высыпаться по утрам - счастье", то программа должна ему сказать, что слово "счастье" есть в строке и оно находится в позиции 23.
Будем писать программу по частям.
Сначала напишем ввод строки от пользователя:
За поиск в строке отвечает функция СтрНайти.
На вход она принимает 2 параметра (на самом деле параметров больше, но мы рассмотрим только первые два):
- Строку, в которой надо искать.
- Часть строки (её ещё называют "подстрока"), которую надо найти.
Функция возвращает 0, если вхождение не найдено и позицию в строке, если вхождение найдено. Функция ищет только первое вхождение подстроки в строку.
С учётом этого продолжим написание программы вот так:
Замена в строке
А давайте подшутим над пользователем?
Пусть он введёт строку со словом "счастье", а мы выведем его же строку, в которой заменим слово "счастье", например, на "удовольствие".
За замену одной части строки на другую отвечает функция СтрЗаменить.
На вход она принимает 3 параметра:
- Строку, в которой нужно сделать замену.
- Подстроку, которую надо найти и заменить.
- Подстроку, на которую нужно заменить.
Функция возвращает строку, полученную в результате замены. При этом функция заменяет все вхождения.
Верхний и нижний регистры
А вы заметили, что один и тот же символ может иметь два варианта, например: 'п' и 'П'. Первый вариант называется "нижний регистр", а второй - "верхний регистр".
И для компьютера это разные буквы. Мы можем легко в этом убедиться, если выведем числовые коды этих букв:
Именно поэтому для компьютера, к примеру, строка "привет" будет не равна строке "Привет":
Компьютер при сравнении строк сравнивает числовой код каждого символа одной строки с соответствующим ему (по порядку) числовым кодом символа другой строки. И если есть хотя бы одно неравенство - строки считаются различными.
Но у нас есть замечательная возможность менять регистр строк: из верхнего в нижний и наоборот. За это отвечают функции НРег (сокращение от "нижний регистр") и ВРег (сокращение от "верхний регистр").
Когда это может быть полезно? Вспомните задачу, когда мы заменяли слово "счастье" на "удовольствие".
Функция СтрЗаменить (как и Найти) ищет подстроку с учётом регистра. То есть если пользователь введет вместо "счастье", например, "Счастье", то программа не найдёт этого вхождения.
И чтобы поиск и замена не зависели от того в каком регистре ввёл строку пользователь, мы напишем вот так:
Теперь, даже если пользователь введёт "Любимая работа - это СЧАСТЬЕ!" программа сможет найти слово "счастье" и вывести пользователю "любимая работа - это удовольствие!".
Подведём итоги
Мы рассмотрели основные операции над строками, но на самом деле их больше.
Некоторые из них вы можете изучить вместе с примерами в справочнике по языку 1с.
(1) Цикл по строке с проверкой кода символа, запись цифрового символа в отдельную переменную и преобразование её в число по завершении цикла.
(1) Что-то вроде этого :
Где СтрокаДанных - исходная строка например "as1122ddd3221fff"
МасЧисел - конечный результат (в нашем случае 1122, 3221)
(4) спасибо:) я просто думала, что может быть функция такая, т.к. ничего криминального она не делает
(1) ponaroshku, все верно, потому что такой функции нет :)
Но ее можно написать самому. Для этого нужно пройтись в цикле по каждому символу в строке и проверить, цифра ли это.
Я бы предложил следующий вариант:
user1619761; Apolonov-Erik; malikov_pro; Silver0030; Ujine1313; Nefilimus; Simonov_NPM; aleksdiez; imbaZeratul; zannv; Boulala; AlekSandra29; alexandrmishinn; soulnechnii; x_x; klinval; valafan; App0st0l; vladir; svilsa; Wersia; Chloroform; unknown181538; ponaroshku; + 24 – Ответить
я столкнулся с проблемой когда нужно извлечь все цифры из строки "что-то;типа123 штук". (1) возвращает пустой массив. и код под постом тоже ничего не возвращает((
Но столкнулась с проблемой, если строка вида
12312 много текста 1221. текст "555"
выдает 123121221555 одним числом
в виде нескольких чисел не получить? По примеру - 12312 1221 555
(8) ponaroshku, Вам же hulio в (4) привел как раз нужный вам код, разве что в нем небольшой недочет - нет очистки СтрокаЧисла в цикле, вот поправленный, проверил - работает
(9) прошу прощения
я по (3) делала
(0) а результат "ыдлвапдлцоук234124ывпо341" такой строки какой? ничего против приведенных способов не имею, но я бы использовал регулярные выражения. Например паттерн: \d+
Интересно было бы узнать, какой из методов (программный или метод регулярных выражений) отработает быстрее при больших объемах обработки информации.
В упр. формах можно сделать так.
Результат = 1 524
Если нужно чтобы вывести разные числа из данной строки, то можно немного изменить код
А если Строка типа "12345/15 Какая-то фраза" и нужно получить 12345/15? По всем функциям могу получить только 1234515, а как оставить "/"?
Немного улучшенный вариант с регулярными выражениями - понимает десятичные дроби:
Извините: нашел ошибочку в своей реплике - вот исправленный вариант
Возврат Масс;
КонецФункции // ()
Доброе народ. все вышеуказанные куски кода на какой версии сделаны?? ибо на 8,3 УФ ни один из них не работает(((
10060 (0x0000274C): Попытка установить соединение была безуспешной 19
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Посмотреть все результаты поиска похожих
Еще в этой же категории
Перевод из Десятичного в Двоичное и обратно 1
При разработке конфигураций, особенно если это обмен с сайтами или старыми системами учета, приходится переводить числа из одной системы исчисления в другую. Ниже примеры кода позволяющие выполнить данные функции перевода Десятичное в Двоичное и Дво Посмотреть все в категории Работа с Числами
Строка — это один из примитивных типов данных существующих 1С и работать с ним приходится практически постоянно. Следовательно необходимо иметь представление о том, какие функции для работы со строками существуют, как и когда они используются, а также, что получается в результате. Этим и займемся.
Функции для работы со строками в 1С 8.2 и 8.3
Строка
Функция Строка(x) возвращает текстовое представление переданного ей значения “x”.
СтрДлина
Функция СтрДлина(x) вычисляет количество символов в строке “x”, учитывая пробелы и ничего не значащие символы.
СокрЛП, СокрЛ, СокрП
Функции СокрЛП(x), СокрЛ(x) и СокрП(x) убирают пробелы и ничего не значащие символы у переданной строки “x” с обеих сторон, слева и справа соответственно.
Лев, Прав, Сред
Функции Лев(x, y) и Прав(x, y) возвращают количество символов “y” с левого или правого края переданной им строки “x”. А функция Сред(x, y, z) возвращает количество символов “z” из указанного места “y” переданной строки “x”.
ВРег, НРег, ТРег
Функция ВРег(x) преобразует все символы переданной строки “x” в верхний регистр, НРег(x) — в нижний регистр, ТРег(x) — первую букву каждого слова преобразует в верхний регистр, а все остальные нижний.
Найти
Функция Найти(x, y) возвращает номер первого символа первого вхождения подстроки “y” в строку “x”, если, конечно, такое вхождение найдено (при этом нумерация начинается с 1). Если же вхождений не найдено, то функция возвращает 0.
СтрЧислоВхождений
Функция СтрЧислоВхождений(x, y) возвращает количество вхождений подстроки “y” в строку “x”.
СтрЗаменить
Функция СтрЗаменить(x, y, z) позволяет в указанной строке “x” заменить все вхождения одной подстроки “y” на другую “z”, результатом выполнения функции будет строка с проведенными заменами.
ПустаяСтрока
Функция ПустаяСтрока(x) сравнивает переданную ей строку “x” с пустой и возвращает результат этого сравнения — Истина или Ложь, при этом строка состоящая из пробелов и/или ничего не значащих символов приравнивается к пустой.
СтрЧислоСтрок
Функция СтрЧислоСтрок(x) возвращает количество строк в многострочном тексте “x”.
МногострочныйТекст = СтрЗаменить("тест1,тест2,тест3,тест4", ",", Символы.ПС); //тест1 тест2 тест3 тест4
СтрПолучитьСтроку
Функция СтрПолучитьСтроку(x, y) возвращает строку с номером “y” из многострочного текста “x”.
МногострочныйТекст = СтрЗаменить("тест1,тест2,тест3,тест4", ",", Символы.ПС); //тест1 тест2 тест3 тест4
Символ, КодСимвола
Функция Символ(x) получает код символа “x” и возвращает строку содержащую соответствующий символ (в кодировке Unicode). Функция КодСимвола(x) делает обратное действие — получает символ “x” и возвращает его код в кодировке Unicode. Таблицу символов Unicode можно найти, например, тут.
Символы
Это не функция, а набор наиболее часто используемых специальных символов, состоит из:
- ВК (CR) — возврат каретки;
- ВТаб (VTab) — вертикальная табуляция;
- НПП (NBSp) — неразрывный пробел;
- ПС (LF) — перевод строки;
- ПФ (FF) — перевод формы;
- Таб (Tab) — символ горизонтальной табуляции.
ЗначениеВСтрокуВнутр, ЗначениеИзСтрокиВнутр
Функция ЗначениеВСтрокуВнутр(x) возвращает системное строковое представление значения “x”. Функция ЗначениеИзСтрокиВнутр(x) проделывает обратную операцию и возвращает значение, полученное из строкового системного представления “x”. Обе эти функции используются для сохранения функциональной совместимости с версией 7.7. Использование для каких-либо других целей не рекомендуется. В новых версиях платформы данные функции не работают (хотя их описание присутствует в справке).
ВвестиСтроку
Функция ВвестиСтроку(x, y, z, w) вызывает диалог для ввода строки, введенная строка записывается в переменную “x”, кроме этого можно указать подсказку “y”, длину вводимой строки “z”, отметку многострочности вводимого текста “w”. Функция возвращает Истина — если ввод был произведен, Ложь — если пользователь отказался от ввода. Выглядит это окно примерно так:
При работе с 1С постоянно требуется выводить числа или даты в каком-либо особенном, либо просто в пристойном, виде. Для всего этого существует функция Формат(), о ней собственно и пойдет речь.
Общие сведения о функции Формат()
Если упростить, то функция Формат() позволяет превратить число, дату или булево в строку. Функция Формат() принимает два параметра:
- — это собственно то значения, которому мы хотим придать какой-либо вид, это может быть число, дата или булево. Параметр обязательный.
- — второй параметр, в котором и заключается весь смысл функции Формат(), об этом параметре поговорим более подробно.
Следует сказать, что форматная строка не является обязательным параметром, и в этом случаем функция Формат() отличается от функции Строка() только тем, что для значений по умолчанию для типов Число и Дата (0 и 01.01.0001 00:00:00 соответственно) функция Формат() вернет пустую строку.
В остальных же случаях форматная строка является строковым значением, которое состоит из одного или нескольких параметров форматирования, которые разделяются символом “;”.
Каждый параметр форматирования состоит из имени, знака “=” и значения параметра. При этом значение параметра можно указывать в одинарных или двойных кавычках, это в тех случаях, когда значение параметра содержит символы используемые в синтаксисе форматной строки (например знак “;”).
Внутри значения параметра можно использовать произвольные символы, которые будут отображаться как есть. Наиболее очевидный пример — разделители при формировании представления даты. Также можно использовать одинарные кавычки, если есть подозрение, что символ может быть неправильно воспринят.
Параметры форматирования
Л (L) — указание языка и страны для которой будет выполняться стандартное форматирование, полный список доступен в синтаксис-помощнике.
Преобразование числа в строку
ЧЦ (ND) — максимальная длина целой части числа. Исходное число при этом округляется по правилу “Окр15как20”. Если указан этот параметр, то для отображения дробной части обязательно использовать параметр «ЧДЦ» о котором ниже.
ЧДЦ (NFD) — максимальная длина дробной части числа. Исходное число при этом округляется по правилу “Окр15как20”.
ЧС (NS) — указывает сдвиг разрядов: положительный — деление, отрицательный — умножение.
ЧРД (NDS) — позволяет указать каким символом разделять целую и дробную части числа.
ЧН (NZ) — представление нулевого значения. Если параметр отсутствует, то нулевое значение будет представлено пустой строкой. Если параметр указан в виде “ЧН=”, то представлением нулевого значения будет “0”.
ЧВН (NLZ) — вывод лидирующих нулей. Параметр не имеет значения, само наличие “ЧВН=” уже свидетельствует о необходимости выводить лидирующие нули.
ЧО (NN) — представление отрицательных чисел:
- 0 (0) — строка вида «(1,1)»;
- 1 (1) — строка вида «-1,1»;
- 2 (2) — строка вида «- 1,1»;
- 3 (3) — строка вида «1,1-«;
- 4 (4) — строка вида «1,1 -«.
Преобразование даты в строку
ДФ (DF) — формат даты:
- д (d) — день месяца (цифрами) без лидирующего нуля;
- дд (dd) — день месяца (цифрами) с лидирующим нулем;
- ддд (ddd) — краткое название дня недели*;
- дддд (dddd) — полное название дня недели*;
- М (M) — номер месяца (цифрами) без лидирующего нуля;
- ММ (MM) — номер месяца (цифрами) с лидирующим нулем;
- МММ (MMM) — краткое название месяца*;
- ММММ (MMMM) — полное название месяца*;
- к (q) — номер квартала в году;
- г (y) — номер года без века и лидирующего нуля;
- гг (yy) — номер года без века с лидирующим нулем;
- гггг (yyyy) — номер года с веком;
- ч (h) — час в 12 часовом варианте без лидирующих нулей;
- чч (hh) — час в 12 часовом варианте с лидирующим нулем;
- Ч (H) — час в 24 часовом варианте без лидирующих нулей;
- ЧЧ (HH) — час в 24 часовом варианте с лидирующим нулем;
- м (m) — минута без лидирующего нуля;
- мм (mm) — минута с лидирующим нулем;
- с (s) — секунда без лидирующего нуля;
- сс (ss) — секунда с лидирующим нулем;
- вв (tt) — отображение половины дня AM/PM (действительно только для языков конфигурирования, поддерживающих 12 часовой вариант представления времени).
* — не используется для форматной строки поля ввода даты.
ДЛФ (DLF) — локальный формат даты. Указывается вариант отображения частей даты:
- Д (D) — дата (цифрами);
- ДД (DD) — длинная дата (месяц прописью);
- В (T) — полное время, дата может объединяться со временем;
- ДВ (DT) — дата время.
ДП (DE) — представление пустой даты.
Преобразование булево в строку
БЛ (BF) — представление логического значения Ложь.
БИ (BT) — представление логического значения Истина.
Типовые задачи представления данных
Число без пробелов
Дата без времени
А также еще множество вариантов.
Месяц прописью из даты
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 3, средняя оценка: 5,00 из 5)
Читайте также: