6 новых функций, которые не следует использовать в режиме совместимости

10.06.15

Разработка - Универсальные функции

В релизе платформы 8.3.6.1977 были добавлены новые функции, но не стоит спешить их использовать, пока все не перейдут на новые платформы без режима совместимости с 8.3.5.
Новые функции удобны - бесспорно, но не у всех они будут работать. Ниже приведен список функций с возникающими ошибками и вариантами использования старых методов работы, которые будут действовать на всех платформах.
Использовать или нет новые функции, решать Вам, а мое субъективное мнение - пока не стоит.
Рассматриваемые функции: СтрНайти(), СтрШаблон(), СтрСравнить(), СтрНачинаетсяС(), СтрЗаканчиваетсяНа(), СтрРазделить(),СтрСоединить()

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

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

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

 

Когда пишете на "своих" конфигурациях, тогда можно делать что душе угодно, но когда разработка идет в "чужую" конфигурацию - стоит задуматься каким путем пойти:

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

По второму - идеальный вариант, но не каждый разработчик будет перед каждым вызовом новой функции строить городульки чтобы узнать версию платформы. Хотя данный вариант имеет право на жизнь.
 
И по третьему - самый оптимальный (мое субъективное мнение) гораздо проще второго варианта, но уступает первому в том что не помогает продвижению новых платформ в массы Cool

 

Функция работы со строками СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>)

 

Функция выполняет поиск подстроки в различных направлениях и не только с начала строки.

Сообщить(СтрНайти("2212","1")); //вернет 3

 

В режиме совместимости 8.3.5 и ниже возникает ошибка
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(1,10)}: Процедура или функция с указанным именем не определена (СтрНайти)
Сообщить(<<?>>СтрНайти("1","2212"));

Остается довольствоваться тем, что имеем

Сообщить(Найти("2212","1")); //вернет 3

меньше возможностей, но не вылетает с ошибкой

Функция Найти() осталась только для совместимости с 8.3.5 и в дальнейшем ожидаем, что ее не станет.


Функция работы со строками СтрШаблон(<Шаблон>, <Значение1-Значение10>) 


Функция выполняет замену маркеров подстановки (вида %1) в шаблонной строке на реальные значения.

Сообщить(СтрШаблон("ПРИВЕТ %1 ","МИР!!!")); //вернет ПРИВЕТ МИР!!!


В режиме совместимости возникает ошибка
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(3,10)}: Процедура или функция с указанным именем не определена (СтрШаблон)
Сообщить(<<?>>СтрШаблон("Ошибка в строке "" %1 ""","МояСтрока"));

 


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

 

Функция выполняет лексикографическое сравнение строк без учета регистра.

Сообщить(СтрСравнить("Первая строка", "Вторая строка")); //вернет 1


 Возникающая ошибка
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(5,10)}: Процедура или функция с указанным именем не определена (СтрСравнить)
Сообщить(<<?>>СтрСравнить("Первая строка", "Вторая строка"));

Но можно сделать по-другому

Сравнение = Новый СравнениеЗначений;
Сообщить(Сравнение.Сравнить("Первая строка", "Вторая строка"));

 

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

 

Функция проверяет, что строка начинается на подстроку.

СтрокаПоиска = "http://";
ЭтоВеб = СтрНачинаетсяС("http://google.com", СтрокаПоиска);
Сообщить(ЭтоВеб);//вернет Истина

 

Возникает ошибка
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(22,10)}: Процедура или функция с указанным именем не определена (СтрНачинаетсяС)
Сообщить(<<?>>СтрНачинаетсяС("http://google.com", "http://"));

Но можно сделать по-старому

СтрокаПоиска = "http://";
Сообщить(Лев("http://google.com",СтрДлина(СтрокаПоиска))=СтрокаПоиска); //вернет истина


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

 

Функция проверяет, что строка оканчивается подстрокой.

СтрокаПоиска = "@mail.ru";
ЭтоМайлРу = СтрЗаканчиваетсяНа("vasya_pupkin@mail.ru", СтрокаПоиска);
Сообщить(ЭтоМайлРу);//вернет Истина


Возникает ошибка
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(22,10)}: Процедура или функция с указанным именем не определена (СтрНачинаетсяС)
Сообщить(<<?>>СтрНачинаетсяС("http://google.com", "http://"));

Но можно сделать по-другому

СтрокаПоиска = "@mail.ru";
Сообщить(Прав("vasya_pupkin@mail.ru",СтрДлина(СтрокаПоиска))=СтрокаПоиска); //вернет истина


Функция работы со строками СтрРазделить(<Строка>,<Разделитель>,<ВключатьПустые>)
Функция работы со строками СтрСоединить(<Строки>, <Разделитель>)

 Функция СтрРазделить() разделяет строку на части по указанному разделителю.

 Функция СтрСоединить() соединяет строки из массива подстрок.

Массив = СтрРазделить("1,2,3,4,5,6,7,8,9,,10",",",Ложь);//вернет массив
Строка = СтрСоединить(Массив,",")//вернет 1,2,3,4,5,6,7,8,9,10

 

Удобные функции, но возникает ошибка

{(1,10)}: Процедура или функция с указанным именем не определена (СтрРазделить)
Массив = <<?>>СтрРазделить("1,2,3,4,5,6,7,8,9,,10",",",Ложь);//вернет массив
{(2,10)}: Процедура или функция с указанным именем не определена (СтрСоединить)
Строка = <<?>>СтрСоединить(Массив,",")//вернет 1,2,3,4,5,6,7,8,9,10


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

функции работы со строками СтрРазделить СтрСоединить СтрЗаканчиваетсяНа СтрНачинаетсяС СтрСравнить СтрШаблон СтрНайти

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    20129    dimanich70    81    

144

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4091    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    18065    atdonya    24    

56

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5502    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14733    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3580    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18478    171    sapervodichka    112    

135
Вознаграждение за ответ
Показать полностью
Отзывы
11. slazzy 42 11.06.15 09:48 Сейчас в теме
В статье не упомянуто, что для многих из функций есть прямые аналоги в БСП и сейчас любой адекватный человек использует именно их из модуля СтроковыеФункцииКлиентСервер, предполагаю, что все функции останутся для совместимости ещё какое-то время, просто вероятно они внутри себя со временем станут использовать новые платформенные функции, но интерфейс вызова останется старый.
На текущий момент весь модуль СтроковыеФункцииКлиентСервер в БСП 2.3 оставлен без изменений для совместимости.
slige; Gendelf; kar911; volokitinac; sstas007; paran; Happy User; marku; Lyolik; farraf; inanity; Anchoret; Mr Roudyk; Rusel; Aleskey_K; CyberCerber; ivashchenko_tatyanka; denis_aka_wolf; Bazil; +19 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Alexey_ 27 10.06.15 16:34 Сейчас в теме
чем отличается от http://v8.1c.ru/o7/201408str/index.htm ?
suggestive; Evg-Lylyk; insurgut; +3 Ответить
2. Xershi 1555 10.06.15 17:27 Сейчас в теме
Так это и так понятно. Платформу как раз и обновляют чтобы использовать новые функции...
4. denis_aka_wolf 79 10.06.15 18:37 Сейчас в теме
(2) Xershi, Только не всегда в организациях следят за обновлением платформы.
Когда пишешь для "чужих" тогда нужно либо обязать их перейти на новую платформу, либо использовать старые механизмы работы.
rimma_n; ivashchenko_tatyanka; +2 Ответить
3. AlexanderKai 10.06.15 17:32 Сейчас в теме
Что мешает использовать СистемнаяИнформация.ВерсияПриложения?
5. denis_aka_wolf 79 10.06.15 18:53 Сейчас в теме
(3) AlexanderKai,
Когда пишете на "своих" конфигурациях, тогда можно делать что душе угодно, но когда разработка идет в "чужую" конфигурацию - стоит задуматься каким путем пойти:


1) Использовать новые функции и обязать заказчика перейти на свежую платформу
2) Сделать проверку текущей версии платформы и использовать новые функции и старые механизмы работы
3) Использовать только старые механизмы работы

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

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

И по третьему - самый оптимальный (мое субъективное мнение) гораздо проще второго варианта, но уступает первому в том что не помогает продвижению новых платформ в массы
10. mitya-paramonov 11.06.15 06:12 Сейчас в теме
Нам со стороны разрабатывали подсистему приема бюджетных обязательств по отыгранным тендерам и запросам котировок цен для БГУ 1.0 и нарукожопили с использованием новых функций.

(3) AlexanderKai, этот вариант не работает. Ругается на то что данной функции вообще нет.(7)

denis_aka_wolf, статью поправь, второй вариант не рабочий.
pavel.mikheev.80; +1 Ответить
13. AlexanderKai 11.06.15 11:42 Сейчас в теме
(10) mitya-paramonov,
Если добавишь строчку
СистемнаяИнформация = Новый СистемнаяИнформация;
то заработает.
14. denis_aka_wolf 79 11.06.15 12:07 Сейчас в теме
(13) AlexanderKai,

СистемнаяИнформация = Новый СистемнаяИнформация;
Если СистемнаяИнформация.ВерсияПриложения = "8.3.6.1977" тогда
	   Сообщить(СтрНайти("2212","1")); //вернет 3
Иначе
	   Сообщить(СтроковыеФункцииКлиентСервер.НайтиСимволСКонца("2212","1"));
КонецЕсли;


Такой код все равно работать не будет!
pavel.mikheev.80; androgin; +2 Ответить
26. Bassgood 1449 17.06.15 16:21 Сейчас в теме
(14) а если использовать Вычислить(), то все заработает
sapervodichka; +1 Ответить
47. Linx-p 30.06.17 15:50 Сейчас в теме
45. AlexO 135 26.04.17 14:47 Сейчас в теме
(13) это не поможет - дело, все-таки, в режиме совместимости. А его версией не определишь.
6. dgolovanov 10.06.15 18:55 Сейчас в теме
Так много старания это всё написать и так мало пользы.
7. denis_aka_wolf 79 10.06.15 18:59 Сейчас в теме
Выскажите свое мнение каким образом лучше поступить при работе со строками во время разработки.
pavel.mikheev.80; +1 Ответить
20. DitriX 2101 12.06.15 14:02 Сейчас в теме
(7) все очень просто - создаете глобальную функцию с такими же названиями и используете ее, если у человека новая платформа - то ему достаточно заккоментить эту функцию. Как бы проблем нет.
ojiojiowka; +1 Ответить
36. Erne100 287 27.10.15 14:19 Сейчас в теме
(20) DitriX, Всё так кроме : СтрНайти(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>)

Системное перечисление НаправлениеПоиска в режиме совместимости отсутствует.
susorov; denis_aka_wolf; +2 Ответить
38. susorov 94 17.08.16 17:09 Сейчас в теме
(36) Erne100, А может быть встречал кто функцию с такими же возможностями, как эта новая СтрНайти() ? Ведь порой надо искать именно с конца, и удобно было бы использовать в режимах совместимости аналогичную функцию, хотя бы с первыми тремя параметрами... Народ бы сказал за такую функцию Спасибо!
8. vasyak319 152 10.06.15 19:53 Сейчас в теме
Я правильно понял смысл публикации - рассказать всему миру, что функции, появившиеся в новом релизе, не будут работать в старом релизе, потому что есть только в новом релизе?
Познавательная статья - теперь я знаю, что Капитана Очевидность зовут Денис.
aiPavlov; xMaksX86; 7OH; Gendelf; va582; TeMochkiN; Serega-artem; SvoyakMartin; Anchoret; h00k; HystriX; cypherpunks01; philya; sergio199; Rusel; DennyPhilord; JestN; BurningChrome; JIeHIH; sigmov; charushkin; herfis; Frogger1971; _also; SerSh_Perm; sh_max; starik-2005; delete; Bassgood; Natalii; gr0m; sergelemon; CyberCerber; madonov; dgolovanov; gubanoff; Black Romeo; Dach; slazzy; Gravemaggot; Bazil; webester; NeviD; nihfalck; EliasShy; zqzq; LuxVeritatis; karpik666; TMV; ojiojiowka; +50 Ответить
9. insurgut 208 10.06.15 20:00 Сейчас в теме
Не забываем ставить плюсики... =)
11. slazzy 42 11.06.15 09:48 Сейчас в теме
В статье не упомянуто, что для многих из функций есть прямые аналоги в БСП и сейчас любой адекватный человек использует именно их из модуля СтроковыеФункцииКлиентСервер, предполагаю, что все функции останутся для совместимости ещё какое-то время, просто вероятно они внутри себя со временем станут использовать новые платформенные функции, но интерфейс вызова останется старый.
На текущий момент весь модуль СтроковыеФункцииКлиентСервер в БСП 2.3 оставлен без изменений для совместимости.
slige; Gendelf; kar911; volokitinac; sstas007; paran; Happy User; marku; Lyolik; farraf; inanity; Anchoret; Mr Roudyk; Rusel; Aleskey_K; CyberCerber; ivashchenko_tatyanka; denis_aka_wolf; Bazil; +19 Ответить
15. denis_aka_wolf 79 11.06.15 12:11 Сейчас в теме
(11) slazzy, Спасибо, добавлю в статью сегодня вечером.

(10) mitya-paramonov, Спасибо, поправлю.
pavel.mikheev.80; +1 Ответить
35. vec435 17 14.09.15 14:32 Сейчас в теме
(11) slazzy, аналога СтрНайти нет
12. It-developer 26 11.06.15 10:59 Сейчас в теме
Самые интересные - СтрРазделить(), СтрСоединить()
ivashchenko_tatyanka; +1 Ответить
16. seermak 665 11.06.15 14:17 Сейчас в теме
а где описания про другие новые функции? пример: ПолучитьИсполняемуюСхемуКомпоновкиДанных() и т.д.)))))
17. denis_aka_wolf 79 11.06.15 14:48 Сейчас в теме
(16) seermak, Это метод а не функция
pavel.mikheev.80; +1 Ответить
19. vasyak319 152 11.06.15 18:04 Сейчас в теме
(17) это и то и другое. Сбоите, кэп.
18. seermak 665 11.06.15 17:45 Сейчас в теме
(16)исправлено: .....другие методы и функции......
21. eech 13.06.15 12:23 Сейчас в теме
Небольшое уточнение:
"Сообщить(СтрСравнить("Первая строка", "Вторая строка")); //вернет Истина"
вернет не "Истина", а "1"
22. denis_aka_wolf 79 15.06.15 05:36 Сейчас в теме
(21) eech, Исправил, спасибо.
pavel.mikheev.80; +1 Ответить
23. emakei 17.06.15 09:16 Сейчас в теме
24. nixel 1433 17.06.15 10:31 Сейчас в теме
25. mister_tula 17.06.15 13:53 Сейчас в теме
Кто-нибудь еще заметил, как работают табличные части с несколькими "этажами" (несколько реквизитов в группе) в 8.3.6 - полный косяк !!! Как живут с этим многомилионные пользователи 1С ?
27. Bassgood 1449 17.06.15 16:31 Сейчас в теме
(0) Вообще статью можно было бы свести к одной фразе - при разработке чего-либо (конфигурации, подсистемы, отчета, обработки) для неопределенного заказчика/клиента/покупателя необходимо учитывать возможные варианты использования у них различных версий платформы, режимов совместимости с версиями и интерфейсом, использования модальности и синхронных вызовов. И это будет более полно, чем вся публикация.
28. androgin 17.06.15 17:55 Сейчас в теме
глупая статья. все это написано в релизе 1С
и нужно быть совсем недалеким, чтобы это не осознавать
29. vad013 20.06.15 10:21 Сейчас в теме
Проверил вчера на релизе 8.3.6.2041.
Эти новые функции есть в Синтакс-помощнике, но при попытке их использовать выдается ошибка "Процедура или функция с указанным именем не определена ...".
30. vad013 20.06.15 10:26 Сейчас в теме
ошибка пропадет, если снять режим совместимости
31. Nuuq 76 22.06.15 08:54 Сейчас в теме
(0)
СтрРазделить
Массив = Новый Массив();
Строка = "1,2,3,4,5,6,7,8,9,,10";	
Разделитель = ",";
Символ = Найти(Строка, Разделитель);
Пока Символ > 0 Цикл
	Если СтрДлина(Лев(Строка, Символ - 1)) > 0 Тогда
		МассивЗначений.Добавить(Лев(Строка, Символ - 1));
	КонецЕсли;
	Строка = Прав(Строка, СтрДлина(Строка) - Символ);
	Символ = Найти(Строка, Разделитель);
КонецЦикла;
Если СтрДлина(Строка) > 0 Тогда
	МассивЗначений.Добавить(Строка);
КонецЕсли;
Показать

СтрСоединить
Строка = "";
Для каждого Элемент Из Массив Цикл
	Строка = Строка + СокрЛП(Элемент) + ",";
КонецЦикла;


P.S.: новые функции конечно гораздо удобнее. Спасибо за обзор - ведь сюда "лазишь" чаще чем в Зазеркалье ;)
hasp_x; IrinaKostroma; +2 Ответить
32. vasyak319 152 22.06.15 09:47 Сейчас в теме
(31) Nuuq, ваша СтрСоединить выдаст лишнюю запятую в конце.
constantinevio; sergio199; +2 Ответить
37. bubnov-pi 02.11.15 09:29 Сейчас в теме
Не являюсь программистом в 1С, занимаюсь в основном обеспечением работоспособности существующих систем, но временами приходится залезать в код клиентских конфигураций. И буквально на днях возникла необходимость добавить разбор массива, поступающего в web-сервис. Первая мысль - найти аналог explode (php)... в справке нашёл, но на клиентской конфигурации оно не работает (как я понял, из-за режима совместимости). Спасибо (31) - направил на решение. В итоге в обработке появилась функция:
Функция СтрРазделить(Строка, Разделитель, ВключатьПустые = Ложь)
	МассивЗначений = Новый Массив();
	Символ = Найти(Строка, Разделитель);
	Пока Символ > 0 Цикл
	    Если ВключатьПустые или (СтрДлина(Лев(Строка, Символ - 1)) > 0) Тогда
        	МассивЗначений.Добавить(Лев(Строка, Символ - 1));
    	КонецЕсли;
    	Строка = Прав(Строка, СтрДлина(Строка) - Символ);
    	Символ = Найти(Строка, Разделитель);
	КонецЦикла;
	Если (ВключатьПустые или СтрДлина(Строка) > 0) Тогда
	    МассивЗначений.Добавить(Строка);
	КонецЕсли;
	Возврат МассивЗначений;
КонецФункции
Показать

Вроде работает. Поправьте, если где накосячил.
KoC_one; nad0_hto; AndE; pallid; sergio199; +5 Ответить
46. gortol 202 11.05.17 14:18 Сейчас в теме
(37) на всякий случай, если кому лениво про соединить
Функция СтрСоединить(Массив, Разделитель="")
	Строка = "";
	Для каждого Элемент Из Массив Цикл
	    Строка = Строка + СокрЛП(Элемент) + Разделитель;
	КонецЦикла;
	
	Возврат Строка;
КонецФункции
Показать
IrinaKostroma; +1 Ответить
59. ComradV 4 23.08.19 14:49 Сейчас в теме
(46) А таки где удаление последнего, "лишнего", разделителя?
64. user603532_fan_club_chelsea 20.10.23 11:52 Сейчас в теме
(46) работает на малом объеме массива... чем больше элементов в массиве... тем дольше будет выполняться функция...
33. Zahary 42 26.06.15 10:59 Сейчас в теме
- сравнение производительности функции СтрШаблон по сравнению с СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку
В циклах лучше не использовать. Подозреваю, что остальные функции такие же быстрые :(
unichkin; +1 Ответить
34. vasyak319 152 26.06.15 11:32 Сейчас в теме
(33) Zahary, по вашему замеру получается, что собрать строку простым сложением прямо на месте втрое дольше, чем вызвать функцию модуля с десятью параметрами и собрать в ней ту же самую строку (код функции я не смотрел, но он, очевидно, посложнее простой конкатенации строк).
Не верю.
В замере производительности есть флажок "Включать для функций время выполнения" - вы его ставили?
39. constantinevio 06.10.16 14:31 Сейчас в теме
Я тут на скорую руку накидал. Вроде все работает, но особо не тестил. Все параметры такие же как и в СтрНайти. Единственное, надо глобально заменить НаправлениеПоиска.СКонца НаправлениеПоиска.СНачала на "СКонца" и "СНачала" соответственно.

Функция СтрНайти82 (ИсходнаяСтрока, ИскомаяСтрока, НаправлениеПоиска = "СНачала", НачальнаяПозиция = Неопределено, НомерВхождения = 1) Экспорт
	Если СтрДлина(ИскомаяСтрока)>СтрДлина(ИсходнаяСтрока) ИЛИ СтрДлина(ИсходнаяСтрока) = 0 Тогда
		Возврат 0;
	КонецЕсли;	
	Если НаправлениеПоиска = "СНачала" ИЛИ НаправлениеПоиска = Неопределено Тогда
		Если НачальнаяПозиция = Неопределено Тогда
			НачальнаяПозиция = 1;
		ИначеЕсли НачальнаяПозиция > СтрДлина(ИсходнаяСтрока) Тогда
			ВызватьИсключение ("Неправильный параметр: Начальная позиция");
		КонецЕсли;
		//Выполнить Поиск
		Результат = 0;
		ВременнаяСтрока = Прав(ИсходнаяСтрока, СтрДлина(ИсходнаяСтрока)-(НачальнаяПозиция-1));
		Для Индекс = 1 По НомерВхождения Цикл
 		    ВременныйРезультат = Найти(ВременнаяСтрока, ИскомаяСтрока);
 		    Если ВременныйРезультат Тогда
 			    Результат = Результат  + ВременныйРезультат ;
				ВременнаяСтрока = Прав(ВременнаяСтрока, (СтрДлина(ВременнаяСтрока) - ВременныйРезультат - (СтрДлина(ИскомаяСтрока)-1)));
				//Сообщить ("Вхождение " + Индекс + ": " + (Результат));
			Иначе
				//Сообщить("Требуемое вхождение не найдено");
		  	    Возврат 0;
			КонецЕсли;			
			Если Индекс < НомерВхождения Тогда
				Результат = Результат + СтрДлина(ИскомаяСтрока)-1;
			КонецЕсли;
		КонецЦикла;
		Возврат Результат+НачальнаяПозиция-1;	
	ИначеЕсли НаправлениеПоиска = "СКонца" Тогда //Ищем с конца
		Если НачальнаяПозиция = Неопределено Тогда
			НачальнаяПозиция = СтрДлина(ИсходнаяСтрока);
		ИначеЕсли НачальнаяПозиция > СтрДлина(ИсходнаяСтрока) ИЛИ НачальнаяПозиция < 1 Тогда
			ВызватьИсключение("Неправильный параметр: НачальнаяПозиция");			
		КонецЕсли;
		//ВыполнитьПоиск
		Результат = 0; 
		ВременнаяСтрока =  Лев(ИсходнаяСтрока, НачальнаяПозиция +1); 
		Вхождения = Новый Массив;
		Пока Истина Цикл
			ВременныйРезультат = Найти(ВременнаяСтрока, ИскомаяСтрока);
 		    Если ВременныйРезультат Тогда
 			    Результат = Результат  + ВременныйРезультат;
				Вхождения.Добавить(Результат);
				ВременнаяСтрока = Прав(ВременнаяСтрока, (СтрДлина(ВременнаяСтрока) - ВременныйРезультат - (СтрДлина(ИскомаяСтрока)-1)));
				//Сообщить ("Вхождение " + Индекс + ": " + (Результат));
				Результат = Результат + СтрДлина(ИскомаяСтрока)-1;
			Иначе
				//Сообщить("Требуемое вхождение не найдено");
		  	    Прервать;
			КонецЕсли;					
		КонецЦикла;
		Если Вхождения.Количество()<НомерВхождения Тогда
			//Вхождение не найдено
			Возврат 0;
		Иначе
			Возврат Вхождения[(Вхождения.Количество()-НомерВхождения)]
		КонецЕсли;		
	Иначе
		ВызватьИсключение("Неправильный параметр: НаправлениеПоиска. Опции: ""СНачала"", ""СКонца""");
	КонецЕсли;		
КонецФункции
Показать
Anatoliy_S; ArtemSV_Energon; susorov; +3 Ответить
40. susorov 94 30.01.17 14:58 Сейчас в теме
(39) Константин, большое спасибо!
41. ьуеьшд 08.02.17 16:46 Сейчас в теме
Да уж, платформа 8.3.9.1818, а бяда та же.
42. Spacer 363 02.03.17 14:39 Сейчас в теме
Почему эти функции не работают? Платформа 8.3.9.2170, режим совместимости "Версия 8.3.6".
Вроде ж должно работать?
43. Spacer 363 03.03.17 14:05 Сейчас в теме
(42)Разобрался. Чистка кэша помогла.
44. dino99rus 31.03.17 16:44 Сейчас в теме
Предлагаю свой вариант более компактный, Для СтрНайти

Функция СтрНайти82(Знач Строка,Знач ПодстрокаПоиска,Знач НаправлениеПоискаСКонца = Ложь, Знач НачальнаяПозиция = Неопределено,Знач НомерВхождения = 1)
	
	ТекущаяПозиция = 0;
	ЗнакНаправленияДвижения = 0; 
	ДлинаСтрПоиска = СтрДлина(ПодстрокаПоиска);

	Попытка
	    Если НЕ НачальнаяПозиция = Неопределено Тогда
			НачальнаяПозиция = Число(НачальнаяПозиция);	
			Если НачальнаяПозиция <= 0 ИЛИ НачальнаяПозиция > СтрДлина(Строка) Тогда
				ВызватьИсключение ("");					
			КонецЕсли;			
		КонецЕсли;		
	Исключение		
		ВызватьИсключение("Недопустимое значение параметра (параметр номер '4')");
	КонецПопытки;
		
	Если НаправлениеПоискаСКонца Тогда 
		НачальнаяПозиция = ?(НЕ НачальнаяПозиция = Неопределено, НачальнаяПозиция,СтрДлина(Строка));
		ЗнакНаправленияДвижения = -1;
	Иначе	
		НачальнаяПозиция = ?(НЕ НачальнаяПозиция = Неопределено, НачальнаяПозиция,1);
		ЗнакНаправленияДвижения = 1;
	КонецЕсли;
			
	Пока Истина
		И НЕ НомерВхождения = 0
		И ((НЕ НаправлениеПоискаСКонца И НачальнаяПозиция <= СтрДлина(Строка)) 
		  ИЛИ (НаправлениеПоискаСКонца И НачальнаяПозиция >= 0)) Цикл	
		  
		Позиция = Найти(Сред(Строка,НачальнаяПозиция, ДлинаСтрПоиска),ПодстрокаПоиска); 
		
		Если Позиция Тогда 
			ТекущаяПозиция = НачальнаяПозиция;
			НачальнаяПозиция = ТекущаяПозиция + ДлинаСтрПоиска * ЗнакНаправленияДвижения;
			НомерВхождения = НомерВхождения - 1;
		Иначе
			НачальнаяПозиция = НачальнаяПозиция + 1 * ЗнакНаправленияДвижения; 
		КонецЕсли;
		
	КонецЦикла;
	
	Если НомерВхождения Тогда
		ТекущаяПозиция  = 0;
	КонецЕсли;
	
	Возврат ТекущаяПозиция;
	
КонецФункции 
Показать
HIVvich; kabantus; redtram; dvsidelnikov; gorakh; ZyZer; +6 Ответить
62. tormozit 7229 24.05.20 11:13 Сейчас в теме
(44) Спасибо. Ускорил твой вариант в десятки раз для больших значений параметра НомерВхождения
Функция СтрНайтиЛкс(Знач Строка,Знач ПодстрокаПоиска,Знач НаправлениеПоискаСКонца = Ложь, Знач НачальнаяПозиция = Неопределено,Знач НомерВхождения = 1) Экспорт 
	
	ТекущаяПозиция = 0;
	ЗнакНаправленияДвижения = 0; 
	ДлинаСтрПоиска = СтрДлина(ПодстрокаПоиска);
	Попытка
		Если НачальнаяПозиция <> Неопределено Тогда
			НачальнаяПозиция = Число(НачальнаяПозиция);    
			Если НачальнаяПозиция <= 0 ИЛИ НачальнаяПозиция > СтрДлина(Строка) Тогда
				ВызватьИсключение ("");                    
			КонецЕсли;            
		КонецЕсли;        
	Исключение        
		ВызватьИсключение("Недопустимое значение параметра (параметр номер '4')");
	КонецПопытки;
	Если НаправлениеПоискаСКонца Тогда 
		НачальнаяПозиция = ?(НачальнаяПозиция <> Неопределено, НачальнаяПозиция, СтрДлина(Строка));
		ЗнакНаправленияДвижения = -1;
	Иначе    
		НачальнаяПозиция = ?(НачальнаяПозиция <> Неопределено, НачальнаяПозиция, 1);
		ЗнакНаправленияДвижения = 1;
	КонецЕсли;

	// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
	#Если Сервер И Не Сервер Тогда
	Пока Истина
		И НомерВхождения <> 0
		И (Ложь
			Или (Истина
				И Не НаправлениеПоискаСКонца 
				И НачальнаяПозиция <= СтрДлина(Строка)) 
			Или (Истина
				И НаправлениеПоискаСКонца 
				И НачальнаяПозиция >= 0)) 
	Цикл    
		Позиция = Найти(Сред(Строка, НачальнаяПозиция, ДлинаСтрПоиска), ПодстрокаПоиска); 
		Если Позиция Тогда 
			ТекущаяПозиция = НачальнаяПозиция;
			НачальнаяПозиция = ТекущаяПозиция + ДлинаСтрПоиска * ЗнакНаправленияДвижения;
			НомерВхождения = НомерВхождения - 1;
		Иначе
			НачальнаяПозиция = НачальнаяПозиция + 1 * ЗнакНаправленияДвижения; 
		КонецЕсли;
	КонецЦикла;
	#КонецЕсли
	// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
	Пока Истина  		И НомерВхождения <> 0  		И (Ложь  			Или (Истина  				И Не НаправлениеПоискаСКонца  				И НачальнаяПозиция <= СтрДлина(Строка))  			Или (Истина  				И НаправлениеПоискаСКонца  				И НачальнаяПозиция >= 0))  	Цикл  		Позиция = Найти(Сред(Строка, НачальнаяПозиция, ДлинаСтрПоиска), ПодстрокаПоиска);  		Если Позиция Тогда  			ТекущаяПозиция = НачальнаяПозиция;  			НачальнаяПозиция = ТекущаяПозиция + ДлинаСтрПоиска * ЗнакНаправленияДвижения;  			НомерВхождения = НомерВхождения - 1;  		Иначе  			НачальнаяПозиция = НачальнаяПозиция + 1 * ЗнакНаправленияДвижения;  		КонецЕсли;  	КонецЦикла;  

	Если НомерВхождения Тогда
		ТекущаяПозиция  = 0;
	КонецЕсли;
	Возврат ТекущаяПозиция;
	
КонецФункции 
Показать
48. Tavisdm 11.03.18 19:18 Сейчас в теме
Не сразу сообразил, что у меня не работает из-за режима совместимости :( Прочитал - понял. Автору спасибо!!!
49. Alex1c 32 13.03.18 00:18 Сейчас в теме
В 2015 году адепты обновлений платформы начали кидаться каками в автора за полезную инфу.
На дворе 2018 год. В УПП режим совместимости с 8.2.13 не снять ибо не работает она в режиме совместимости 8.3. Ни с того ни с его вылезла указанная ошибка. Платформа 8.3.7.1873
Пришлось править конфу на "устаревшие решения"
Чистка кеша не помогла
It-developer; +1 Ответить
50. Kesak 14 31.03.18 11:57 Сейчас в теме
Пока столкнулся с этими функциями, решил затолкать их в общий модуль:

Функция СтрСоединить(пМассивСтрок, пРазделитель = ",") Экспорт
	лРезультат = "";
	
	Для Каждого ЭлМассива Из пМассивСтрок Цикл
		лРезультат = лРезультат + СокрЛП(ЭлМассива) + пРазделитель;		 
	КонецЦикла;
	
	лДлинаРезультата = СтрДлина(лРезультат) - СтрДлина(пРазделитель);
	
	Если лДлинаРезультата > 0 Тогда
		лРезультат = Лев(лРезультат, лДлинаРезультата);
	КонецЕсли;	
	
	Возврат лРезультат;
КонецФункции

Функция СтрРазделить(пСтрока = "", пРазделитель = ",", пВключатьПустые = Ложь) Экспорт
    лМассивЗначений = Новый Массив();
	
	лНайденныйРазделитель = Найти(пСтрока, пРазделитель);
	
	Пока лНайденныйРазделитель > 0 Цикл
        Если пВключатьПустые ИЛИ (СтрДлина(Лев(пСтрока, лНайденныйРазделитель - 1)) > 0) Тогда
            лМассивЗначений.Добавить(Лев(пСтрока, лНайденныйРазделитель - 1));
		КонецЕсли;
		
        пСтрока = Прав(пСтрока, СтрДлина(пСтрока) - лНайденныйРазделитель);
        лНайденныйРазделитель = Найти(пСтрока, пРазделитель);
    КонецЦикла;
	
	Если (пВключатьПустые ИЛИ СтрДлина(пСтрока) > 0) Тогда
        лМассивЗначений.Добавить(пСтрока);
    КонецЕсли;
	
	Возврат лМассивЗначений;
КонецФункции

Функция СтрНачинаетсяС(пСтрока, пСтрокаПоиска) Экспорт
	Возврат Лев(пСтрока, СтрДлина(пСтрокаПоиска))= пСтрокаПоиска;
КонецФункции

Функция СтрЗаканчиваетсяНа(пСтрока, пСтрокаПоиска) Экспорт
	Возврат Прав(пСтрока, СтрДлина(пСтрокаПоиска))= пСтрокаПоиска;
КонецФункции
Показать
Светлый ум; +1 Ответить
51. It-developer 26 17.05.18 11:23 Сейчас в теме
В синтакс-помощнике нет ни слова о режиме совместимости для этой функции. По факту в 8.3.9.2233 она не работает
52. HystriX 26.10.18 11:01 Сейчас в теме
Самое хреновое в этом всем, что даже в 8.3.11 расширенный (!) синтаксический контроль не ругается на СтрНайти и СтрСоединить, если стоит режим совместимости, который еще не позволяет пользоваться ими. На все остальные типа СтрНачинаетсяС контроль ругается и это нормально показывает разработчику, что их нельзя использовать.
53. Alex_CheST 2 11.12.18 10:23 Сейчас в теме
Народ как решить эту проблему если не переходить на новую платформу. Просто в общий модуль дописать эти функции? Кто как выходил из ситуации. Та же самая проблема. Обновил конфигурацию, долго не обновлялись при запуске ругается на эти функции. Режим совместимости Версия 8.2.13 обычные формы.
54. leemuar 21 18.02.19 17:33 Сейчас в теме
(53) создайте свои аналоги этих функций на встроенном языке в том же модуле

Часть функций уже есть в БСП (РазложитьСтрокуВМассивПодстрок, СтрокаИзМассиваПодстрок, ПодставитьПараметрыВСтроку), можете взять оттуда. Реализацию остальных функций смотрите выше в комментариях выше

Функция СтрокаНачинаетсяС(ГдеИскать, ЧтоИскать)

	РазмерИскомого = СтрДлина(ЧтоИскать);
	Возврат ЧтоИскать = Лев(ГдеИскать, РазмерИскомого);

КонецФункции

Функция СтрокаЗаканчиваетсяНа(ГдеИскать, ЧтоИскать)

   	РазмерИскомого = СтрДлина(ЧтоИскать);
	Возврат ЧтоИскать = Прав(ГдеИскать, РазмерИскомого);

КонецФункции


Функция СтрокаШаблон(Знач СтрокаПодстановки,
	Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
	Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
	Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт
	
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9);
	
	Возврат СтрокаПодстановки;
КонецФункции

Функция СтрокаРазделить(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт
	
	Результат = Новый Массив;
	
	// Для обеспечения обратной совместимости.
	Если ПропускатьПустыеСтроки = Неопределено Тогда
		ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
		Если ПустаяСтрока(Строка) Тогда 
			Если Разделитель = " " Тогда
				Результат.Добавить("");
			КонецЕсли;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	//
	
	Позиция = Найти(Строка, Разделитель);
	Пока Позиция > 0 Цикл
		Подстрока = Лев(Строка, Позиция - 1);
		Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
			Если СокращатьНепечатаемыеСимволы Тогда
				Результат.Добавить(СокрЛП(Подстрока));
			Иначе
				Результат.Добавить(Подстрока);
			КонецЕсли;
		КонецЕсли;
		Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
		Позиция = Найти(Строка, Разделитель);
	КонецЦикла;
	
	Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
		Если СокращатьНепечатаемыеСимволы Тогда
			Результат.Добавить(СокрЛП(Строка));
		Иначе
			Результат.Добавить(Строка);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция СтрокаСоединить(Массив, Разделитель = ",", СокращатьНепечатаемыеСимволы = Ложь) Экспорт
	
	Результат = "";
	
	Для Индекс = 0 По Массив.ВГраница() Цикл
		Подстрока = Массив[Индекс];
		
		Если СокращатьНепечатаемыеСимволы Тогда
			Подстрока = СокрЛП(Подстрока);
		КонецЕсли;
		
		Если ТипЗнч(Подстрока) <> Тип("Строка") Тогда
			Подстрока = Строка(Подстрока);
		КонецЕсли;
		
		Если Индекс > 0 Тогда
			Результат = Результат + Разделитель;
		КонецЕсли;
		
		Результат = Результат + Подстрока;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция СтрокаНайти(ГдеИскать, ЧтоИскать)
	Возврат Найти(ГдеИскать, ЧтоИскать);
КонецФункции

Показать
YuriyBak; Светлый ум; +2 Ответить
60. Светлый ум 415 18.09.19 20:53 Сейчас в теме
(54)
Очень помогло для ЗУП 2.5
56. HystriX 25.02.19 10:37 Сейчас в теме
(53)
конфигурацию

Да, создается глобальный модуль с заменой этих функций, чтобы обращаться к ним как в платформенным. При снятии режима совместимости модуль нужно удалить.
55. leemuar 21 18.02.19 17:37 Сейчас в теме
Код функции ПолучитьКодировкуИзЗаголовков() страшно перемудренный

Первый цикл можно переписать понятнее.
Далее вместо СтрНачинаетсяС() и СтрЗаканчиваетсяНа() используется Сред()

Куда слать pull request?
NewLifeMan; +1 Ответить
57. mailrum2004 1 18.06.19 14:50 Сейчас в теме
Спасибо за статью. Как раз содержит то, что искал. Нужно было узнать с какой версии работают новые функции.
58. METAL 299 12.08.19 16:03 Сейчас в теме
Платформа 8.3.11
Режим совместимости конфигурации 8.3.10
Должны ли работать методы СтрНачинаетсяС(), СтрЗаканчиваетсяНа() ?
61. XuMePbl4 12.02.20 10:35 Сейчас в теме
1С:Предприятие 8.3 (8.3.16.1148) (УПП 1.3.132.2) в совместимости с 8.2.13.
В модуле ругалось на:
ПозицияПоследнегоСлеша = СтрНайти(СтруктураURL.Путь, "/", НаправлениеПоиска.СКонца);

Нашел аналог в БСП
СтроковыеФункцииКлиентСервер.НайтиСимволСКонца(СтруктураURL.Путь,"/");

Минимум правки модуля, работает так же.
63. WKBAPKA 215 24.06.21 17:20 Сейчас в теме
Они хоть бы писали в помощи, с какого релиза платформы работает. Халтурщики.
В Android Studio пишут четко, для с каких версий Андроид работает
Оставьте свое сообщение