1с найти второе вхождение в строку. Новые функции работы со строками

💖 Нравится? Поделись с друзьями ссылкой

Реализовано в версии 8.3.6.1977.

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

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

Функция форматирования СтрШаблон()

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

СтрШаблон(<Шаблон>, <Значение1-Значение10>)

<Шаблон> - это строка, в которую нужно подставить представления параметров.

<Значение1> , ... <Значение10> - это параметры (максимально - десять), представления которых нужно подставить в строку.

Чтобы указать конкретное место в шаблоне, в которое нужно выполнить подстановку, нужно использовать маркеры вида %1, ... %10. Количество маркеров, задействованных в шаблоне, и количество параметров, содержащих значения, должны совпадать.

Например, результатом выполнения такого оператора:

будет строка:

Ошибка в данных в строке 2 (требуется тип Дата)

Функция работы со строками СтрСравнить()

Эта функция сравнивает две строки без учёта регистра. Например, так:

Это же действие вы могли выполнить и раньше с помощью объекта СравнениеЗначений:

Однако использование новой функции выглядит более простым. А кроме этого функция, в отличие от объекта СравнениеЗначений, работает и в тонком клиенте, и в веб-клиенте.

Функции работы со строками СтрНачинаетсяС(), СтрЗаканчиваетсяНа()

Эти функции определяют, начинается ли строка с указанной подстроки, заканчивается ли строка указанной подстрокой. Алгоритм этих функций несложно реализовать на встроенном языке, но их наличие позволяет писать более чистый и понимаемый код. И работают они быстрее.

Например, их удобно использовать в операторе Если:

Функции работы со строками СтрРазделить(), СтрСоединить()

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

Функция работы со строками СтрНайти()

Вместо старой функции Найти() мы реализовали новую функцию, которая имеет дополнительные возможности:

  • Поиск в разных направлениях (с начала, с конца);
  • Поиск с указанной позиции;
  • Поиск вхождения с указанным номером (второе, третье и т.д.).

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

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

Механизмов для работы со строками в запросах 1С мало. Во-первых, строки можно складывать. Во-вторых, от строки можно взять подстроку. В-третьих, строки можно сравнивать, в том числе по шаблону. Вот пожалуй и всё, что можно делать со строками.

Сложение строк

Для сложения строк в запросе используется операция «+». Складывать можно только строки ограниченной длины.

ВЫБРАТЬ "Наименование: " + Контрагенты.Наименование КАК Колонка1 ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ Контрагенты.Ссылка = &Ссылка

Функция Подстрока

ПОДСТРОКА(<Строка>, <НачальнаяПозиция>, <Длина>)

Аналог функции Сред() из объектной модели. Функция Подстрока() может применяться к данным строкового типа и позволяет выделить фрагмент <Строки> , начинающийся с символа номер <НачальнаяПозиция> (символы в строке нумеруются с 1) и длиной <Длина> символов. Результат вычисления функции имеет строковый тип переменной длины, причем длина будет считаться неограниченной, если <Строка> имеет неограниченную длину и параметр <Длина> не является константой или превышает 1024.

Если длина строки меньше, чем указана во втором параметре, то функция вернет пустую строку.

Внимание! Использование функции ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины не рекомендуется. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ().

Функция Подобно

Если нужно убедиться, что строковый реквизит соответствует определённым критериям мы его сравниваем:

ВЫБРАТЬ Контрагенты.Наименование КАК Колонка1 ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ Контрагенты.Наименование = "Газпром"

А что, если нужно более хитрое сравнение? Не просто на равенство или неравенство, а на подобие определенному шаблону? Вот как раз для этого и создана функция ПОДОБНО.

ПОДОБНО — Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL.

Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.

Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:

  • % (процент): последовательность, содержащая любое количество произвольных символов;
  • _ (подчеркивание): один произвольный символ;
  • […] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона;
  • [^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания.

Любой другой символ означает сам себя и не несет никакой дополнительной нагрузки. Если в качестве самого себя необходимо записать один из перечисленных символов, то ему должен предшествовать <Спецсимвол>. Сам <Спецсимвол> (любой подходящий символ) определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.

Всем привет
Сегодня попросили меня при печати документа реализации не выводить префикс документа, задачу решил следующим образом.

СтрЗаменить(Номер, Лев (Номер, 3 ), "" );

Когда заглянул в синтакс-помощник так мне это понравилось, что захотелось написать о работе с строками в «1С:Предприятие» .

Строка в 1С относится к примитивному типу данных.

Если посмотреть в справку 1С увидим следующее описание типа Строка (String)
Значения данного типа содержат строку в формате Unicode произвольной длины.
Если своими словами о строках то получится. Строка — константа, состоящая из различных символов, обрамляется всегда кавычками.

Задание строки
Обращение = «Привет пассажир»;

Многострочные строки в типовых конфигурациях чаще всего создаются с помощью вертикального разделителя «|»:
Строка = «Многострочная
|строка
|пиши
|текст»;

Кавычка внутри строки задаются двойными кавычками.
Строка = «»Текст в кавычках»»;

Над строками существует множество операций (поиск в нутрии строки, определение первых и т.д.), лучше посмотреть Синтакс-помощник.
Синтакс-помощник — Общее описание встроенного языка-> встроенные функции-> функции по работе со строками.

Функций по работе со строками

Здесь в краткой форме приведу функций по работе со строками:

ВРег(<Строка>) — Все символы строки функция преобразует в верхний регистр.

КодСимвола(<Строка>, <НомерСимвола>) – Функция получает код символа, расположенного в переданной строке в позиции с указанным номером.

Лев(<Строка>, <ЧислоСимволов>) – Функция выбирает первые слева символы строки.

Найти(<Строка>, <ПодстрокаПоиска>) — Функция находит вхождение искомой строки как подстроки в исходной строке.

НРег(<Строка>) — Функция преобразует все символы строки в нижний регистр.

Прав(<Строка>, <ЧислоСимволов>) Данная функция отличается от функций Лев (Left) тем что выбирает последние справа символы строки.

ПустаяСтрока(<Строка>) — Функция проверяет строку на наличие значащих символов.

Символ(<КодСимвола>) — Функция преобразует код символа в строку, содержащую символ.

СокрЛ(<Строка>) — Функция отсекает незначащие символы, стоящие слева от первого значащего символа в строке.

СокрЛП(<Строка>) — Функция отсекает незначащие символы, стоящие слева от первого значащего символа в строке, и пробелы, стоящие справа от последнего значащего символа в строке.

СокрП(<Строка>) — Функция отсекает незначащие символы, стоящие справа от последнего значащего символа в строке.

Сред(<Строка>, <НачальныйНомер>, <ЧислоСимволов>) — Функция выбирает строку символов, начиная с символа <НачальныйНомер>, общим количеством <ЧислоСимволов>.

СтрДлина(<Строка>) — Функция получает количество символов в строке.

СтрЗаменить(<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) — Функция находит в исходной строке все вхождения подстроки поиска и заменяет ее на подстроку замены.

СтрПолучитьСтроку(<Строка>, <НомерСтроки>) — Функция получает строку многострочной строки по номеру.

СтрЧислоВхождений(<Строка>, <ПодстрокаПоиска>) — Функция вычисляет число вхождений подстроки поиска в исходной строке.

СтрЧислоСтрок(<Строка>) — Функция считает число строк в многострочной строке. В многострочной строке, строки разделены символами перевода строк.

ТРег(<Строка>) — Функция преобразует строку к титульному регистру. Это означает, что у каждого слова первый символ преобразуется к титульному регистру или к верхнему регистру, если титульный регистр для символа не определен. Остальные символы преобразуются к нижнему регистру.

Преобразования типов
Для явного преобразования типов данных существуют функции одноименные с типом данных, к которому происходит преобразование: Строка(<Значение>)

СтрокаИзЧисел= Строка(Число);

Все данные функции подробно описаны в Синтакс-помощник, как начинающему программисту может помочь Синтакс-помощник, я описал в статье .

Примеры по работе с строками

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

Для получения строкового представления года следует использовать функцию Формат.

Год = Формат(ТекущаяДата(), "ДФ=yyyy" ) // Год = "2012"

Чтобы преобразовать число к строке без вставки символа-разделителя групп (неразрывного пробела), необходимо применить функцию Формат с параметром ЧГ=0:

Число = 2012 Строка = Формат(Число, "ЧГ=0" ); //Строка = "2012"

Строка Без пробелов.

Заметки из Зазеркалья

18.08.2014 Новые функции работы со строками

Реализовано в версии 8.3.6.1977.

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

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

Функция форматирования СтрШаблон()

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

СтрШаблон(<Шаблон>, <Значение1-Значение10>)

<Шаблон> - это строка, в которую нужно подставить представления параметров.

<Значение1> , ... <Значение10> - это параметры (максимально - десять), представления которых нужно подставить в строку.

Чтобы указать конкретное место в шаблоне, в которое нужно выполнить подстановку, нужно использовать маркеры вида %1, ... %10. Количество маркеров, задействованных в шаблоне, и количество параметров, содержащих значения, должны совпадать.

Например, результатом выполнения такого оператора:

будет строка:

Ошибка в данных в строке 2 (требуется тип Дата)

Функция работы со строками СтрСравнить()

Эта функция сравнивает две строки без учёта регистра. Например, так:

Это же действие вы могли выполнить и раньше с помощью объекта СравнениеЗначений :

Однако использование новой функции выглядит более простым. А кроме этого функция, в отличие от объекта СравнениеЗначений , работает и в тонком клиенте, и в веб-клиенте.

Функции работы со строками СтрНачинаетсяС(), СтрЗаканчиваетсяНа()

Эти функции определяют, начинается ли строка с указанной подстроки, заканчивается ли строка указанной подстрокой. Алгоритм этих функций несложно реализовать на встроенном языке, но их наличие позволяет писать более чистый и понимаемый код. И работают они быстрее.

Например, их удобно использовать в операторе Если :

Функции работы со строками СтрРазделить(), СтрСоединить()

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

Функция работы со строками СтрНайти()

Вместо старой функции Найти() мы реализовали новую функцию, которая имеет дополнительные возможности:

  • Поиск в разных направлениях (с начала, с конца);
  • Поиск с указанной позиции;
  • Поиск вхождения с указанным номером (второе, третье и т.д.).

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

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

К базовым возможностям языка программирования обычно относят работу с числами и строками. Обычно эти возможности зашиты в код компилятора (или реализованы «базовые» классы языка программирования).

В 1С возможности работы со строками запрограммированы в самой платформе. Сегодня мы рассмотрим особенности работы со строками 1С в программах на встроенном языке 1С.

Значение строки 1С

1. Начнем с самого простого. Создание переменной и присваивание ей строкового константного значения выглядит в 1С так:

Переменная = "Привет, мир! ";

Если требуется в константном строковом значении 1С указать символ кавычки, то его нужно задвоить «»

Переменная = "Привет, ""мир""!";

2. Перенос строки 1С можно указать сразу двумя способами. Первый – с использованием символа |

Переменная = "Привет,
| мир! ";

Второй – с использованием системного перечисления Символы. Оно позволяет добавить как перенос строки 1С, так и другие непечатные символы, например TAB.

Переменная = "Привет" + Символы.ПС + "мир! ";

3. Конфигурации в 1С могут быть разработаны не только для одного языка (русского, английского или другого) – но одновременно для нескольких языков. В этом случае используемый в настоящее время язык выбирается в нижней части окна 1С.

Список языков находится в окне конфигурации в ветке Общие/Языки. Каждый язык имеет короткий идентификатор, такой как ru или eng .

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

Переменная = "ru=""Привет, мир! ""; en=""Hello, world! """;

Если Вы будете использовать сформированную так строку 1С как обычно – то она и будет тем, что в ней написано. Для того, чтобы система разбивала ее на два варианта и использовала нужный – необходимо использовать функцию НСтр():

//правильно для двуязычных конфигураций
Сообщить(НСтр(Переменная));

Реквизит с типом строки 1С

Реквизит – это поле справочника/документа 1С. Отличается от переменной в программе на языке 1С тем, что для реквизита точно указывается его тип (число, строка 1С и т.п.). Если Вам нужно освежить в памяти что такое реквизит – посмотрите урок, посвященный .

Если Вы укажите тип реквизита – строка 1С, то дополнительно необходимо указать параметры.

Строки 1С бывают неограниченной длины (указывается как длина = 0) и ограниченной длины, с указанием точного количества символов. Строки 1С неограниченной длины хранятся в отдельной таблице SQL, поэтому их использование менее производительно, чем ограниченной.

Именно поэтому использование строк 1С неограниченной длины имеет свои ограничения – не везде возможно их использовать. Например, нельзя в качестве номера документа, кода справочника, измерения.

Работа со строками 1С

Для работы со строками есть несколько встроенных функций платформы 1С.

  • СокрЛП("Невероятно, но факт!")
    Убирает из строки 1С лишние пробелы. Также можно использовать для преобразования любых типов к строке 1С (например, числа).
  • Переменная = "Вася " + СокрЛП(" плюс") + " Оля"; //будет "Вася плюс Оля"
    Пример суммирования нескольких строковых значений 1С. В результате получится одна строка 1С.
  • Переменная = Лев("Музыка", 2); //будет "Му"
    Переменная = Сред("Музыка", 2, 2); //будет "зы"
    Переменная = Прав("Музыка", 2); //будет "ка"
    Различные варианты получения подстроки из строки 1С.
  • Переменная = Найти("Музыка", "зы"); //будет 3
    Поиск подстроки в строке 1С, начиная с символа 1.
  • Переменная = СтрДлина("Музыка"); //будет 6
    Возвращает количество символов в строке 1С.
  • Сообщить("Привет") //в окне сообщений внизу окна 1С
    Предупреждение("Привет") //всплывающее диалоговое окно
    Состояние("Привет") //в строчке отображения состояния внизу слева
    .

Приведение объектов к строке 1С

Как известно самый популярный формат для обмена структурированной информацией в настоящее время – это XML . Даже последняя версия MS Office Word и Excel сохраняют файлы в этом формате (docx и xlsx соответственно, поменяйте расширение на zip, откройте в архиваторе).

Платформа 1С для обмена данными предоставляет несколько вариантов, основной из которых – также XML.

1. Самый простой метод – использование функции СокрЛП() или Строка(). В тексте запроса можно использовать функцию ПРЕДСТАВЛЕНИЕ(). Результат их действия один и тот же – они генерируют строковое представление любого объекта 1С для пользователя.

Для справочника по умолчанию это будет его наименование. Для документа – имя документа, номер и дата.

2. Любой объект 1С (с ограничениями) может быть преобразован в XML и обратно. Процесс преобразования называется сериализация.

СтрокаВидаXml = XMLСтрока(Значение); //получаем XML из значения 1С
Значение1С = XMLЗначение(Тип("СправочникСсылка.Номенклатура"),СтрокаВидаXml); //получаем значение 1С из строки XML, необходимо указать тип 1С, который должен быть получен

3. Существует собственный способ платформы 1С преобразовать в строку любой объект 1С. Он мигрировал из версии 1С 7.7. Этот формат не понимают другие программы, но понимает другая 1С, что позволяет легко использовать его для обмена между базами 1С.

Строка = ЗначениеВСтрокуВнутр(Значение1С); //получаем строку 1С из значения 1С
ЗначениеВФайл("C:\MyFile.txt", Значение1С); //другой вариант, получаем файл с сохраненной строкой из значения 1С
Значение1С = ЗначениеИзСтрокиВнутр(Строка); //обратно из строки 1С
Значение1С = ЗначениеИзФайла("C:\MyFile.txt"); //обратно из файла

Редактирование строк 1С на форме

Кроме работы со строками 1С в программе на языке 1С конечно хотелось бы, чтобы пользователь мог их редактировать. Для этого есть несколько возможностей:

1. Самый простой способ – запросить ввод строки 1С по требованию. Этот способ используют при обучении программированию 1С, в жизни он применяется гораздо реже (но применяеся!).

Переменная = "";
Строка = ВвестиЗначение(Переменная, "Введите ФИО");

2. Для вывода реквизита объекта 1С (справочника/документа) или реквизита формы (см. ) чаще всего используют поле ввода. Это самый распространенный в 1С инструмент для работы пользователя с редактированием полей.

3. Возможности поля ввода можно расширить (см. свойства поля ввода, правой кнопкой на нем, подробнее ):

  • Галочка Многострочный режим редактирования
  • Галочка Расширенное редактирование (доступна если установлена предыдущая галочка)
  • Галочка Режим пароля (см. ).

4. Если всех возможностей поля ввода Вам не хватает – есть встроенный редактор. Для его добавлению на форму нужно в меню Форма/Вставить элемент управления добавить Поле текстового документа. В его свойствах можно указать режим его работы – свойство Расширение.

Поле текстового документа нельзя связать напрямую с данными. Необходимо в обработчике события ПриОткрытии() формы (см. ) прописать функцию:

ЭлементыФормы.ИмяЭлементаПолеТекстовогоДокумента.УстановитьТекст(ЗначениеСтрока); //здесь ЗначениеСтрока – это текст полученный, например из реквизита

А в обработчика сохранения – например, в кнопке Сохранить – добавить сохранение:

ЗначениеСтрока = ЭлементыФормы.ИмяЭлементаПолеТекстовогоДокумента.ПолучитьТекст(); //ЗначениеСтрока здесь – это реквизит, куда мы сохраняем значение

5. В 1С версии 8.2.11, в управляемых формах, появилась новая возможность представления строки 1С – поле Форматированный документ.


Аналогично полю текстового документа, необходимо устанавливать при открытии и записывать при сохранении текст самостоятельно с помощью программы.

  • В объект 1С, форму которого мы делаем (справочник, документ, обработка и т.п.) – добавьте реквизит с типом ХранилищеЗначения
  • В функции ПриЧтенииНаСервере() установим текст из реквизита

    //здесь Реквизит – это добавленный реквизит объекта 1С
    //здесь ФорматированныйДокумент – это имя поля на форме для редактирования
    &НаСервере

    ФорматированныйДокумент = ТекущийОбъект.Реквизит.Получить();
    КонецПроцедуры

  • В функции ПередЗаписьюНаСервере() или по кнопке запишем текст из поля

    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    ТекущийОбъект.Реквизит = Новый ХранилищеЗначения(ФорматированныйДокумент);
    КонецПроцедуры

Рассказать друзьям