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

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.  ЗАКЛЮЧЕНИЕ.

 

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

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

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

14 Comments

  1. Adeptus

    жесть

    Reply
  2. Yashazz

    Чтобы позиционирование и работа с фрагментом строки на больших текстах были быстрыми, надо регулярными выражениями пользоваться, ага.

    Reply
  3. newold2

    (2) Yashazz,Эту COMу (регулярные выражения) встраивать в рабочие CONFы никак нельзя! Не выдержан основной принцип: 200% подтвержденная надёжность (100% от друзей+100% от врагов).А уж кроссплатформенность…

    Reply
  4. newold2

    (2) Yashazz,

    Reply
  5. oleg_km

    (3) Высосанные из пальца принципы

    Reply
  6. fomix

    Человек можно сказать «выстрадал» свои _методы_ и хотел поделиться с нами, а вы его ни за что, ни про что обкакали!

    Лучше бы стебались над афтарами, плодящими каждый месяц абсолютно «новую» СФ1137 и прочую лабуду в виде печатных форм…

    Reply
  7. dsv_nsk

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

    Например, 1) мне никогда не требовалась инверсия строки; 2)в случае необходимости мне по затратам времени проще ее написать самому, а не обращаться к чужой библиотеке.

    Reply
  8. ksuman

    Показанная в примере функция эффектна, но не эффективна…

    Про библиотеку в целом, могу сказать то же самое.

    На примере задачи, которую когда-то решал, продемонстрирую:

    ДАНО:

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

    Возможный вариант:

    ВЫБРАТЬ РАЗЛИЧНЫЕ

    … КАК Код,

    ВЫБОР Когда НЕ Цены.Номенклатура ССЫЛКА Справочник.Номенклатура ТОГДА ЗНАЧЕНИЕ(Справочник.Материалы.ПустаяСсылка) КОГДА ЕСТЬNULL(Товары.Наименование,»Нет наименования»)=»» ИЛИ ЕСТЬNULL( Товары.Наименование , «Нет наименования» ) = «Нет наименования» Тогда ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) ИНАЧЕ ВЫБОР КОГДА ЕСТЬNULL(Товары.Наименование, «Нет наименования») =»Товар № 1″ ТОГДА ЗНАЧЕНИЕ(Справочник.Номенклатура.ТоварПервый) Иначе Товары.Ссылка Конец КОНЕЦ,

    СРЕДНЕЕ(Цены.Цена)+1000 * ( 1/(100.01* 10)),



    ИЗ

    РегистрыСведений.Цены КАК Цены ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары Цены ПО Товары.Номенклатура=Цены.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ …

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

    Reply
  9. newold2

    (5) oleg_km, шутки понимать надо.

    Reply
  10. newold2

    (8) ksuman,Слегка не по теме. Методы отнюдь не предназначены для анализа строки запроса. Их 26, на многие другие случаи жизни. Большинство не реализовано в стандартных конфигурация, приходиться писать.

    Предложенная библиотека в помощь.

    P.S. Можно, конечно добавить методы работы с «раскрывающими» и «закрывающими» разделителями — тогда можно

    и запросы анализировать, да незачем это. Есть уже, да и по «XML»,например, масса отработанных методов.

    В единой связке представлены методы, которых нет или расширены те, которые есть в стандартных конфигурациях.

    Reply
  11. newold2

    Дамы и господа — не тюкайте больно! Большинство методов используются во многих языках высокого уровня — наверное не напрасно.

    А такие методы как «Стр_НайтиГр()» и сопутствующие ему «Стр_Сокр()» и «Стр_Группировки()» позволяют по другому и гораздо шире

    подойти к задачам поиска и замены групп различных символов в строке (например расширение методов «СокрЛ»,»СокрП»,метод «Стр_СокрС». В прилагаемом полном описании даны некоторые примеры). Простой эвристический метод «Стр_ПереносПоСлогам()», вроде

    не разу меня не подвёл.Также и поиск чисел.

    Не стоит и забывать, что методы работают как слева, так и справа, с учётом и без учёта регистра символов.

    Хорошей вам работы и настроения!

    Reply
  12. chmv

    Очень специфические функции

    Reply
  13. ildarovich

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

    Reply
  14. JohnPawn

    Не хватает функции определения «Номера Вхождения» по «Номеру позиции» «Подстроки поиска».

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *