gifts2017

Строка. Методы работы со строкой на языке 1с8.

Опубликовал Алексей Сафонов (newold2) в раздел Программирование - Универсальные функции

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

ЧАСТЬ  1. МЕТОДЫ  (26).                         

1.1. Базовые методы (10). Независимые,   построены на своих простых алгоритмах.                      

 

Стр_Дополнить()  (дополнение  справа-слева  указанными символами).

 Стр_Инверс ()  ( инверсия – символы справа на лево).

 Стр_Коды() (коды символов через ”,” и массив с кодами)

 Стр_Символы() (строка из  кодов  через  ”,” или из массива с кодами)

Стр_ЗаменитьСимволы() (замена  одних символов на другие).

Стр_ИзМассива() (строка из массива фрагментов через разделитель)

Стр_НайтиВх() ( поиск подстроки (в т.ч справа) с указ. номером вхождения).

Стр_НайтиГр() (Поиск группы символов, входящих в указанный набор символов)

Стр_НайтиЧисл() (Поиск числа , в т. ч  справа с указанным номером  вхождения)

Стр_Интерпретировать() (в массив, согласно установленному синтаксису)

 

 1.2. Производные  методы (12). Собственно, это применение  четырёх обобщенных методов-алгоритмов (см. Часть 2)                   

 

Стр_Число() (с начала и с конца строки, не  ”боиться” нецифровых символов.

Стр_Найти() ( поиск подстроки (в т.ч без учета регистра и справа) с указ. номером вхождения).

Стр_Заменить() (искать  ( в т.ч. без учета регистра и справа), и заменять подстроки-разделители ).

 Стр_Кусок() (кусок строки между указанными  вхождениями разделителя (слева или справа)).

 Стр_ЗаменитьКусок() (замена в исходной строке  ”куска ”  на указанную строку).

 Стр_ВМассив() (между  указанными вхождениями разделителя  (в т.ч. справа и без регистра).

Стр_ПеренестиПоСлогам() (разбить на подстроки   ”Жёстко”, с дефисом).

 Стр_ПеренестиПоСловам() (разбить на подстроки “Мягко” )

 Стр_Разрезать() (“Разрезать” на подстроки указанных длин)

Стр_СокрЛ() (заменить лев. группу  "сокращаемых" символов  на "строку замены"

Стр_СокрП() (заменить прав. группу  "сокращаемых" символов  на "строку замены"

Стр_СокрС() (заменить посредине  группы  "сокращаемых" символов  на "строку замены"

Стр_Расширить  (расширение до указ. длины  за счет увеличения колич. указанных символов)

 

 1.3. Детализованные  методы (3).  "Препарирование" строки  с переносом в таблицу с детальной информацией.

 

Стр_вТаблВх() (в таблицу  согласно системе вложенных разделителей).

Стр_вТаблГр  (в таблицу  согласно многоуровневому фильтру ).

 Стр_вТаблЧисел  (в таблицу с числами и фрагментами между ними).

 

 

  ЧАСТЬ 2.    ОБОБЩЕННЫЕ МЕТОДЫ-АЛГОРИМЫ  (3). 

 

Стр_Вхождение()  (методы ”Найти” и ”Заменить”).

Стр_Фрагменты()  (методы ”Кусок”,”ЗаменитьКусок,”ВМассив”,”вТаблВх”).

Стр_Сокр () (методы "СокрЛ","СокрП","СокрС","Расширить”.

Стр_Разбить() (методы “ПеренестиПоСлогам”,”ПеренестиПоСловам”,”Разрезать”).

 

ЧАСТЬ 3.  УНИВЕРСАЛЬНАЯ ФУНКЦИЯ .

Это своего рода условный программный интерфейс, позволяющий

применять к строке сразу несколько методов. Реализован в виде

функции с семью  параметрами ("Демо" построено на этой функции):   

Стр_(Методы, Подметоды, Вход, Парам1, Парам2, Длины_Номера_Позиции, ДопВыход)

 Параметры:

   - ” Методы” -  несколько ”совмещаемых” и (или) один “монопольный”  метод  

                             (односимвольные коды или  названия, можно через ",")

   - ”Подметоды” -  несколько ”совмещаемых” и(или)   “монопольный ” варианты

                                  “монопольного” метода  (односимвольные коды или названия);

   - “Вход”  - Строка, или Массив или Таблица значений;

   - “Парам1” – строка поиска, замещения, разделители, фильтры;

   - “Парам2”  - замещающая строка или символы;

   - “Длины_Номера_Позиции ”  -Число, Числа  через  разделитель  или массив с Числами;

   - “ДопВыход ”  -  Число или  Строка или Массив или Таблица значений;

Имена и(или)  односимвольные Коды методов-подметодов , а также числа в

 (Длины_Номера_Позиции ) могут быть в  любом регистре и отделены

любым из следующих  разделителей:   ”, :;”.

 

 ЧАСТЬ 4. НЕКОТОРЫЕ ПРИМЕРЫ.

ЕстьЧислаВСтроке=(Стр_НайтиЧисл(ВхСтрока)<>Неопределено);

ЕстьЦифрыВСтроке=(Стр_НайтиГр(ВхСтрока,"+0123456789")>0);

ЕстьЛатиница=(Стр_НайтиГр(ВхСтр, Стр_Интерпретировать("lL"))>0);

ЕстьУказанныеЗнаки=(Стр_НнайтиГр(ВхСтр, "+к рогЮ.0р9")>0);

ЕстьНеПечатные=(Стр_НайтиГр(ВхСтр, Стр_Интерпретировать("-l-L-р-Р-П-З-Ц"))>0);

 

  ЧАСТЬ 5.  ЗАКЛЮЧЕНИЕ.

 

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

Использованы  встроенные  функции :  Лев(),Прав()Сред(),СтрДлина()

- (позиционирование и получение части строки -должны быть "быстрыми").

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
МетодыРаботыСоСтрокой_Демо
.zip 81,64Kb
04.08.16
26
.zip 81,64Kb 26 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Адепт Адептов (Adeptus) 23.04.14 15:54
2. Яков Коган (Yashazz) 23.04.14 18:50
Чтобы позиционирование и работа с фрагментом строки на больших текстах были быстрыми, надо регулярными выражениями пользоваться, ага.
3. Алексей Сафонов (newold2) 24.04.14 10:41
(2) Yashazz,Эту COMу (регулярные выражения) встраивать в рабочие CONFы никак нельзя! Не выдержан основной принцип: 200% подтвержденная надёжность (100% от друзей+100% от врагов).А уж кроссплатформенность...
4. Алексей Сафонов (newold2) 24.04.14 10:55
5. Олег (oleg_km) 30.04.14 09:18
(3) Высосанные из пальца принципы
6. Fomix (fomix) 30.04.14 16:57
Человек можно сказать "выстрадал" свои _методы_ и хотел поделиться с нами, а вы его ни за что, ни про что обкакали!
Лучше бы стебались над афтарами, плодящими каждый месяц абсолютно "новую" СФ1137 и прочую лабуду в виде печатных форм...
eeeio; dsv_nsk; +2 Ответить
7. Сергей (dsv_nsk) 01.05.14 07:59
Идея интересная, но получившиеся в результате инструменты отражают специфику задач автора.
Например, 1) мне никогда не требовалась инверсия строки; 2)в случае необходимости мне по затратам времени проще ее написать самому, а не обращаться к чужой библиотеке.
8. Станислав Копылов (ksuman) 01.05.14 12:34
Показанная в примере функция эффектна, но не эффективна...
Про библиотеку в целом, могу сказать то же самое.

На примере задачи, которую когда-то решал, продемонстрирую:
ДАНО:
Разложить в структуру все возможные поля из строки описания запроса 1С от оператора ВЫБРАТЬ, до оператора ИЗ, корректно обрабатывая пакет запросов, исключая создание временных таблиц и их уничтожение. Если нет наименования поля, то создать наиболее подходящее из выражения.

Возможный вариант:
ВЫБРАТЬ РАЗЛИЧНЫЕ
... КАК Код,
ВЫБОР Когда НЕ Цены.Номенклатура ССЫЛКА Справочник.Номенклатура ТОГДА ЗНАЧЕНИЕ(Справочник.Материалы.ПустаяСсылка) КОГДА ЕСТЬNULL(Товары.Наименование,"Нет наименования")="" ИЛИ ЕСТЬNULL( Товары.Наименование , "Нет наименования" ) = "Нет наименования" Тогда ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) ИНАЧЕ ВЫБОР КОГДА ЕСТЬNULL(Товары.Наименование, "Нет наименования") ="Товар № 1" ТОГДА ЗНАЧЕНИЕ(Справочник.Номенклатура.ТоварПервый) Иначе Товары.Ссылка Конец КОНЕЦ,
СРЕДНЕЕ(Цены.Цена)+1000 * ( 1/(100.01* 10)),
...
ИЗ
РегистрыСведений.Цены КАК Цены ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары Цены ПО Товары.Номенклатура=Цены.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ ...

Есть попроще задачи, есть посложнее, но очевидно, что нереально использовать вашу библиотеку для решения практической задачи, когда в строке нарушено форматирование и имеется более одного разделителя разных приоритетов и вложенных структур. Поправлюсь: вашу библиотеку использовать можно, но не проще чем встроенную, а в целях не снижения производительности, лучше не применять вообще.
9. Алексей Сафонов (newold2) 05.05.14 12:29
(5) oleg_km, шутки понимать надо.
10. Алексей Сафонов (newold2) 05.05.14 12:35
(8) ksuman,Слегка не по теме. Методы отнюдь не предназначены для анализа строки запроса. Их 26, на многие другие случаи жизни. Большинство не реализовано в стандартных конфигурация, приходиться писать.
Предложенная библиотека в помощь.
P.S. Можно, конечно добавить методы работы с "раскрывающими" и "закрывающими" разделителями - тогда можно
и запросы анализировать, да незачем это. Есть уже, да и по "XML",например, масса отработанных методов.
В единой связке представлены методы, которых нет или расширены те, которые есть в стандартных конфигурациях.
11. Алексей Сафонов (newold2) 05.05.14 13:16
Дамы и господа - не тюкайте больно! Большинство методов используются во многих языках высокого уровня - наверное не напрасно.
А такие методы как "Стр_НайтиГр()" и сопутствующие ему "Стр_Сокр()" и "Стр_Группировки()" позволяют по другому и гораздо шире
подойти к задачам поиска и замены групп различных символов в строке (например расширение методов "СокрЛ","СокрП",метод "Стр_СокрС". В прилагаемом полном описании даны некоторые примеры). Простой эвристический метод "Стр_ПереносПоСлогам()", вроде
не разу меня не подвёл.Также и поиск чисел.
Не стоит и забывать, что методы работают как слева, так и справа, с учётом и без учёта регистра символов.
Хорошей вам работы и настроения!
12. Марина Чирина (chmv) 11.08.14 09:03
Очень специфические функции
13. Сергей (ildarovich) 04.08.16 09:23
Не хватает самих текстов функций. С ними статья была бы интереснее.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа