Строковые функции для совместимости с платформой 8.3.5 и ниже

16.06.18

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

СтрНайти(), СтрНачинаетсяС(), СтрЗаканчиваетсяНа(), СтрРазделить(), СтрСоединить(), СтрШаблон() для платформы ниже 8.3.6

Приведенные ниже функции являются аналогами строковых методов, появившихся в платформе 8.3.6

Если у вас возникнет вопрос, ЗАЧЕМ нужно писать функции, которые и так есть в платформе, то просто закрывайте статью и не забивайте себе голову.

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

Поэтому решил выложить эти методы сюда, чтобы были под рукой в нужную минуту.

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

 

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

 

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

 

СтрСоединить()
Функция _СтрСоединить(Строки, знач Разделитель = Неопределено) Экспорт
	Результат = "";
	
	Если Разделитель = Неопределено Тогда
		Разделитель = "";
	КонецЕсли;
	
	Если Строки.Количество() Тогда
		Результат = Строки[0];
	КонецЕсли;
	
	Для сч = 1 По Строки.ВГраница() Цикл
		Результат = Результат + Разделитель + Строки[сч];
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

 

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

 

СтрШаблон()
Функция _СтрШаблон(Шаблон, Параметр1=Неопределено, Параметр2=Неопределено, Параметр3=Неопределено,Параметр4=Неопределено,Параметр5=Неопределено,Параметр6=Неопределено,Параметр7=Неопределено,Параметр8=Неопределено,Параметр9=Неопределено,Параметр10=Неопределено) Экспорт
	Результат = Шаблон;
	
	Для сч = -10 По -1 Цикл
		Параметр = Вычислить("Параметр" + (-сч));
		Если Параметр = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Если Найти(Результат, "%("+(-сч)+")") = 0 И Найти(Результат, "%"+(-сч))=0 Тогда
			ВызватьИсключение "Слишком много фактических параметров";
		КонецЕсли;
		Результат = СтрЗаменить(Результат, "%("+ (-сч) + ")", Параметр);
		Результат = СтрЗаменить(Результат, "%"+ (-сч), Параметр);
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

 

И да - в интернете можно найти такие функции, НО я не нашел решения в виде отдельной публикации.

Есть аналоги в комментарии к статье 6 новых функций, которые не следует использовать в режиме совместимости, но все варианты СтрНайти82() отрабатывают не так, как в платформе

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

p.s. Текст, расположенный ниже "Причины купить" и др. - добавляется автоматически и нет возможности его отключить. Рекомендую не обращать на него внимания

 

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5350    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46145    dimanich70    83    

163

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    6821    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    57108    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    8580    ke.92@mail.ru    17    

67

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

28.08.2023    22702    YA_418728146    8    

174
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. json 3398 03.06.18 09:33 Сейчас в теме
Юнит-тесты к функциям можно взять тут и при желании дополнить.
Тесты описаны в модуле объекта.
user878157; DevSerg; user721902; +3 Ответить
2. triviumfan 102 03.06.18 10:14 Сейчас в теме
Думаю, что любой программист (даже "одынэсниг") вполне способен написать простенькую функцию по работе со строками уровня школьной программы.
3. json 3398 03.06.18 11:13 Сейчас в теме
(2) СтрНайти() с пятью параметрами - это "простенькая функция по работе со строками уровня школьной программы"?
KhromovA; unknown181538; +2 Ответить
22. user721902 15.01.19 08:33 Сейчас в теме
(2) Зачем тратить на это время, когда есть готовое решение
KhromovA; marku; +2 Ответить
45. psa247 21 16.03.21 11:17 Сейчас в теме
(2) естесна, может, но мне понадобилось и Я быстро нашел эту статью, за что автору большое спасибо
KhromovA; +1 Ответить
4. strange2007 146 15.08.18 04:55 Сейчас в теме
Когда надо было очень быстро решить вопрос с универсальностью СтрНайти, родился вот такой, малооптимальный код


	ЛеваяЧастьНайти = ПолучениеФункцииСтрНайти();
	// Доподготовка
	РезультатРаботы = 0;
	ИскомаяПодстрока = "(точка маршрута)";
	ИсходнаяСтрока = Строка(ИсходныйТип);
	// Составление итоговой строки
	ИтоговаяСтрока = "РезультатРаботы=" + ЛеваяЧастьНайти + "(ИсходнаяСтрока, ИскомаяПодстрока);";
	// Поиск
	Выполнить(ИтоговаяСтрока);

// В зависимости от клиента может работать Найти или СтрНайти
Функция ПолучениеФункцииСтрНайти()
	Перем ВозврЗначение, ИспытуемаяЧасть, ПолнаяСтрока;
	Перем ВрСтрока, ПоисковыйСимвол;
	
	// Предподготовка
	ВозврЗначение = "";
	ВрСтрока = "097987897";
	ПоисковыйСимвол = "9";
	
	// Попытка "Найти"
	ИспытуемаяЧасть = "Найти";
	ПолнаяСтрока = ИспытуемаяЧасть + "(ВрСтрока, ПоисковыйСимвол);";
	Попытка
		Выполнить(ПолнаяСтрока);
		ВозврЗначение = ИспытуемаяЧасть;
	Исключение КонецПопытки;
	
	// Попытка "СтрНайти"
	ИспытуемаяЧасть = "СтрНайти";
	ПолнаяСтрока = ИспытуемаяЧасть + "(ВрСтрока, ПоисковыйСимвол);";
	Попытка
		Выполнить(ПолнаяСтрока);
		ВозврЗначение = ИспытуемаяЧасть;
	Исключение КонецПопытки;
	
	//// Анализ предыдщей манипуляции
	//Если ВозврЗначение="" Тогда
	//	ВозврЗначение = "СтрНайти";
	//КонецЕсли;
	
	Возврат(ВозврЗначение);
КонецФункции
Показать
5. DrBlack 24 16.08.18 08:28 Сейчас в теме
(4) Да вас по рукам бы набить
6. strange2007 146 16.08.18 09:23 Сейчас в теме
(5) Вызываю на дуэль! Оружием выбираю спички! Тяните первый! (с)
А если серьёзно, то данный кривой код (и ещё подобные куски) сэкономил уйму времени, позволил уволить кучу ит-отделов и ит-контор и до сих пор крутится во многих организациях. Вы просто не пробовали оптимизировать работу системы на всех 7 уровнях оптимизации. Попробуйте и с ужасом увидите, что кривой код всегда гораздо эффективней красивого.
Именно поэтому в своё время появилась Майкрософт и 1С
7. DrBlack 24 16.08.18 13:30 Сейчас в теме
(6) Поддерживаю дуэль, вот мой велосипед:

Функция СтрНайти_83_82(Строка, ПодстрокаПоиска) Экспорт
	
	ЗнВозврат = 0;
	
	Попытка
		ЗнВозврат = Вычислить("СтрНайти(Строка, ПодстрокаПоиска)");
	Исключение
		ЗнВозврат = Найти(Строка, ПодстрокаПоиска);
	КонецПопытки;
	
	Возврат ЗнВозврат;
	
КонецФункции
Показать
ivan453; Светлый ум; user1201748; Ignatov_mu; user682181_tarbos; TManukovskaya; strange2007; +7 Ответить
10. strange2007 146 17.08.18 05:51 Сейчас в теме
(7) Сдаюсь. Моё кунг-фу слабее.
Хм, а как скомпилится Найти в конфе, где эта конструкция не поддерживается? Оно ж ошибку выдаст. После исключения надо же тоже в вычислить/выполнить.

(украл код себе)
11. DrBlack 24 17.08.18 08:12 Сейчас в теме
(10) Функция "Найти" существует с 8.0 (если я не ошибаюсь), зачем тут попытка? :)
14. strange2007 146 17.08.18 08:42 Сейчас в теме
(11) Не просто так ведь сделали СтрНайти. Скорее всего с очередного момента Найти не будет использоваться. Значит надо это предусмотреть.
15. json 3398 17.08.18 08:48 Сейчас в теме
(14)
а вы будущее предсказывать умеете?
Или есть какие-то конкретные тексты от разработчиков платформы, что уберут функцию Найти()?

Мне кажется, что СтрНайти() добавили, чтобы расширить функционал Найти(). Добавить различные варианты поиска. Ну и плюс они, возможно, заметили нелогичность, что все строковые функции начинаются с "Стр", а эта без префикса.
16. strange2007 146 17.08.18 09:01 Сейчас в теме
(15) Конечно умею. Предсказываю - сейчас пойду наливать чай))))))
А если серьёзно, то мы уже привыкли к тому, что 1С-вцы всегда стремятся вперёд и плохой прошлый опыт просто вычёркивают. Например, ЗначениеНеОпределено (или как оно там писалось) было жёстко исключено. Только вот цена исключения оказалась высокой.
Далее рекомендую обратить внимание на то, что "ктрл+пробел" не показывает ф-ю Найти. Что это? Начало отказа!
Поэтому, как мне кажется, Найти исчезнет. Хоть и позже, но это случится. И вот тут и возникает повод для "загордиться перед столбом" - а мой код не заметил вселенской катастрофы.
17. DrBlack 24 17.08.18 09:17 Сейчас в теме
(14) Тогда такой код:
Функция СтрНайти_83_82(Строка, ПодстрокаПоиска) Экспорт
    
    ЗнВозврат = 0;
    
    Попытка
        ЗнВозврат = Вычислить("СтрНайти(Строка, ПодстрокаПоиска)");
    Исключение
        ЗнВозврат = Вычислить("Найти(Строка, ПодстрокаПоиска)");
    КонецПопытки;
    
    Возврат ЗнВозврат;
    
КонецФункции
Показать


При компиляции ошибки не будет, наличие второй "Попытки" не потребуется :)
47. ivan453 09.08.22 16:21 Сейчас в теме
(17) В ту же степь:

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

КонецФункции 
Показать
48. ivan453 09.08.22 16:28 Сейчас в теме
(17) СтрСоединить и СтрРазделить

Функция СтрСоединить(МассивСтрок, Разделитель = "") Экспорт

Возврат СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(МассивСтрок, Разделитель);

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

Функция СтрРазделить(Строка, Разделитель, ВключатьПустые = Ложь) Экспорт

Возврат СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, ВключатьПустые);

КонецФункции// СтрРазделить()
Istur; Date; +2 Ответить
37. vshish 162 06.07.20 10:13 Сейчас в теме
(14) Функция Найти Остается в режиме совместимости с 8.2.16
46. ivan453 09.08.22 16:14 Сейчас в теме
8. json 3398 16.08.18 14:28 Сейчас в теме
(4)
(7)
А в чем фишка?
Почему нельзя просто использовать Найти() ?
Я так понимаю, что если нет нужды искать с конца, или искать, скажем второе вхождение, или не с первого символа, то СтрНайти() - ни к чему (если мы хотим поддерживать совместимость с ранними версиями)
Зачем пытаетесь использовать СтрНайти() да еще в попытке?
9. strange2007 146 17.08.18 05:46 Сейчас в теме
(8) Я ж не крутой программер, поэтому как могу...
12. DrBlack 24 17.08.18 08:19 Сейчас в теме
(8) Тут скорее задумка просто использовать новые функции (по возможности), а я лишь раскритиковал выложенный код, который его автору "сэкономил уйму времени", а также привел пример более простой реализации его задумки.
13. json 3398 17.08.18 08:28 Сейчас в теме
(12) ясно.
А то я уж подумал что это серьезно.
Вдруг в новых релизах убрали Найти(), и поэтому приходится костылить.
18. RomanKod 16.10.18 11:39 Сейчас в теме
Спасибо тебе, добрый человек. Выручил.
19. axelerleo 324 08.11.18 15:48 Сейчас в теме
А я бы это дело оформил в отдельный общий глобальный модуль "Полифиллы", и при его добавлении можно было бы юзать код из новых конфигураций на старых платформах. Эдакий babeljs от мира 1С :)
20. rpgshnik 3938 18.11.18 16:02 Сейчас в теме
Не помню в каком релизе но осенью 2018 комплект подобных функций теперь прилетел в комплексную автоматизацию 1.1, я за наименьшим опытом, хапнул горя 😁 теперь тоже схожие функции называю с "_" :)
21. Алексей777 103 30.11.18 12:42 Сейчас в теме
Отлично, когда, действительно сталкиваешься с совместимостью методов платформ и думаешь, блин, писать, а времени в обрез - спасибо, респект и уважуха автору!!!
23. KTo 18.01.19 06:08 Сейчас в теме
Всем привет! Вопрос про функцию "СтрШаблон()". А если я в эту функцию передам код очистки регистра партий?)
24. mvxyz 331 04.02.19 10:55 Сейчас в теме
25. avz_1C 10 11.04.19 12:13 Сейчас в теме
26. itPiligrim 3 18.06.19 18:11 Сейчас в теме
Спасибо, но для всех параметров надо поставить Знач. В противном случае поведение будет отличаться. ВАЖНО! Это приводит к трудно отлавливаемым ошибкам.
27. bossikd 124 27.11.19 09:31 Сейчас в теме +0.25 $m
Спасибо автору сэкономленных 1 час жизни -:)
28. dhurricane 27.11.19 09:42 Сейчас в теме
Стоит заметить, что функция "СтрРазделить" работает немного не так, как в платформе. В публикации Разделитель есть неделимый набор символов, обозначающий границы подстрок в исходной строке. В платформе же каждый символ Разделителя является индивидуальным разделителем.
Angel_19; Serj1C; +2 Ответить
29. Mikadzy 17.01.20 12:38 Сейчас в теме
(28) Были идеи, как можно было бы это сделать?
30. dhurricane 17.01.20 12:57 Сейчас в теме
(29) Не знаю, наверное простым перебором символов исходной строки:
НачалоПодстроки = 1;

Пока НачалоПодстроки <= СтрДлина(Строка) Цикл
	
	КонецПодстроки = НачалоПодстроки;
	
	Пока КонецПодстроки <= СтрДлина(Строка)
		И Не Найти(Разделитель, Сред(Строка, КонецПодстроки, 1)) Цикл
		КонецПодстроки = КонецПодстроки + 1;
	КонецЦикла; 
	
	Если НачалоПодстроки < КонецПодстроки Тогда
		Подстрока = Сред(Строка, НачалоПодстроки, КонецПодстроки - НачалоПодстроки);
		Результат.Добавить(Подстрока);
	ИначеЕсли ВключатьПустые Тогда 
		Результат.Добавить("");
	КонецЕсли;
	
	НачалоПодстроки = КонецПодстроки + 1;
	
КонецЦикла;
Показать
itlite; Mikadzy; +2 Ответить
31. Mikadzy 17.01.20 13:12 Сейчас в теме
32. shetill 32 10.03.20 13:40 Сейчас в теме
В бух 2.0 есть такой модуль "РегламентированнаяОтчетностьАЛКОКлиентСервер" - там есть все эти функции. Называются правда немного по другому, например СтрЗаменить82
33. mity1982 12.03.20 11:51 Сейчас в теме
Я бы добавил функцию направление поиска:

Функция НаправленияПоиска()
       Возврат Новый Структура("СНачала,СКонца","СНачала","СКонца");
КонецФункции



Упростит рефакторинг.

Еще проще в начало модуля добавить:
Перем НаправленияПоиска;

В конец:
НаправленияПоиска = Новый Структура("СНачала,СКонца","СНачала","СКонца");
35. Rain_man 23.06.20 09:17 Сейчас в теме
(33)
Упростит рефакторинг.

Еще проще в начало модуля добавить:
Перем НаправленияПоиска;

В конец:
НаправленияПоиска = Новый Структура("СНачала,СКонца","СНачала","СКонца");


В этом варианте - инициализация не будет работать из серверного кода, если она прописана в конце клиентского!
Для функции - я могу поставить &НаКлиентеНаСервереБезКонтекста, а вот для этой инициализации - никак.
39. mity1982 08.09.20 20:04 Сейчас в теме
(35) Сорри, не думал о таком варианте.
34. Rain_man 23.06.20 09:01 Сейчас в теме
{...}: Переменная не определена (НаправлениеПоиска)
П1 = СтрНайти(П2,".",<<?>>НаправлениеПоиска.СНачала, П3);

Думаю, что тут понятно - чего не хватает.
36. Rain_man 23.06.20 10:47 Сейчас в теме
(34)
Добавлю. В контекстах пока не идеально разбираюсь, отсюда вопрос.
Вызов СтрНайти происходит из модуля формы - много раз, из разных функций. Некоторые из вызывающих функций, объявлены, как &НаКлиенте, некоторые - &НаСервере, а некоторые - &НаКлиентеНаСервереБезКонтекста.
Если для СтрНайти - не объявить контекст, то он, по-умолчанию - клиентский. Если объявить её &НаСервере - из &НаКлиенте и &НаСервере - вызывается, а вот из &НаКлиентеНаСервереБезКонтекста - нет, заявляет, что:
Процедура или функция с указанным именем не определена (СтрНайти)
...<<?>>СтрНайти(...; (Проверка: Сервер)
Можно как-то сделать, чтобы не писать несколько клонов, каждый со своим именем?
38. mity1982 08.09.20 20:03 Сейчас в теме
40. dikd 17 15.09.20 09:50 Сейчас в теме
Спасибо! Тоже столкнулся с внезапной "совместимостью" при объединение 2х конфигураций. Выручил набор этих функций. Респект!
41. AgnepuS 12 25.09.20 12:10 Сейчас в теме
На платформе 8.3.13.1690 СтрРазделить вообще шикарно работает.
Прикрепленные файлы:
42. AgnepuS 12 25.09.20 14:25 Сейчас в теме
(41) Забыл добавить, что режим совместимости 8.3.5
43. Mechanik21 25 02.10.20 17:14 Сейчас в теме
В своё время задумался над задачей, которая решалась функцией СтрНайти(), но тогда я про неё ещё не знал. Начал что-то ковырять, ничего не взлетело. Товарищ с той работы подсказал, что есть СтрНайти(), мол, не парься, друг, всё уже написано. И я на протяжении следующих трёх лет спокойно её юзал, пока не начал искать другую работу и неожиданно попал на одно интересное собеседование.
И что вы думаете, мне дали лист А4 и 15 мин на задачу. В задаче, опуская подробности, нужно было написать код функции СтрНайти(), как раз то, что было написано здесь. И я столкнулся с каким-то барьером в мозгу. Зачем над этим думать, если это уже решено? и 15 мин писал и зачёркивал СтрНайти(). В общем, с треском провалился.
44. UkKvazar 28.10.20 12:35 Сейчас в теме
Если в _СтрШаблон() не первым(!) параметром передать значение-флаг предыдущего параметра, т.е. в %2 передать "%1", то в мире появится на одного грустного программиста больше. Будьте аккуратны.
49. Istur 1475 20.03.23 20:03 Сейчас в теме
Функция СтрСоединить(Строки, Разделитель) Экспорт
	
	СтрокаВозврата = "";
	
	Если Строки.Количество() = 0 Тогда
		Возврат "";
	КонецЕсли;
	
	ПоследняяСтрока = Строки.Количество() - 1;
	Сч = 0;
	
	Для каждого мСтрока Из Строки Цикл
		СтрокаВозврата = СтрокаВозврата + мСтрока;
		
		Если Сч = ПоследняяСтрока Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаВозврата = СтрокаВозврата + Разделитель;
		Сч = Сч + 1;
		
	КонецЦикла;
	
	Возврат СтрокаВозврата;
	
КонецФункции
Показать
50. karpov 12 26.07.23 10:45 Сейчас в теме
Спасибо тебе, Добрый Человек!
51. bashirov.rs 31 10.04.25 12:37 Сейчас в теме
Работа _СтрРазделить() отличается от типовой СтрРазделить(). Суть проблемы в параметре <Разделитель>. Ниже немного инфы из Синтакс-помощника
Синтаксис:
СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Разделяемая строка.
<Разделитель> (обязательный)
Тип: Строка.
Строка символов, каждый из которых является индивидуальным разделителем.
<ВключатьПустые> (необязательный)
Тип: Булево.
Указывает необходимость включать в результат пустые строки, которые могут образоваться в результате разделения исходной строки.
Значение по умолчанию: Истина.
52. user823004 05.05.25 14:16 Сейчас в теме
Благодарю! Выручил быстрым решением!
53. DrZombi 310 30.07.25 16:13 Сейчас в теме
Коллега, ваши функции не функции, т.е. нет их :)
54. DrZombi 310 01.08.25 17:50 Сейчас в теме
Держите материал... Нашел на просторе Мисты
https://forum.mista.ru/topic/871352 ,Топик 38

Немного модифицировал


//Пример.
XML_Начало = СтрНайти_(ТипСтрокойXML,Поиск_Левое,НаправлениеПоискаСКонца(),,1);


Функция СтрНайти_(Знач Строка, Знач СтрокаПоиска, Знач НаправлениеПоискаСтроки = Неопределено, Знач НачальнаяПозиция = Неопределено, Знач НомерВхождения = 1)
	
	Если (НаправлениеПоискаСтроки = Неопределено Или НаправлениеПоискаСтроки=НаправлениеПоискСНачала(НаправлениеПоискаСтроки)) 
		И (НачальнаяПозиция = Неопределено Или НачальнаяПозиция = 1)
		И (НомерВхождения = Неопределено Или НомерВхождения = 1) //И Ложь //Отладка
		Тогда 
		
		Попытка
			Результат = Неопределено;
			Выполнить("Результат = СтрНайти(Строка,СтрокаПоиска);");
			Возврат Результат;
		Исключение
		КонецПопытки;
		
		Возврат Найти(Строка,СтрокаПоиска);
		
	КонецЕсли;
		
	Попытка //в=10/0; //Отладка
		Результат = Неопределено;
		Выполнить("Если НаправлениеПоискаСтроки = Неопределено Тогда 
		|	НаправлениеПоискаСтроки_ = Неопределено;
		|ИначеЕсли ТипЗнч(НаправлениеПоискаСтроки) = Тип(""Строка"") Тогда 
		|	Если НаправлениеПоискаСтроки = ""СНачала"" Тогда 
		|		НаправлениеПоискаСтроки_ = НаправлениеПоиска.СНачала;
		|	ИначеЕсли НаправлениеПоискаСтроки = ""СКонца"" Тогда 
		|		НаправлениеПоискаСтроки_ = НаправлениеПоиска.СКонца;
		|	Иначе 
		|		НаправлениеПоискаСтроки_ = Неопределено;
		|	КонецЕсли;
		|КонецЕсли;
		|Результат = СтрНайти(Строка,СтрокаПоиска,НаправлениеПоискаСтроки_,НачальнаяПозиция,НомерВхождения);");
		Возврат Результат;
	Исключение
	КонецПопытки;
	
	//Попробуем по старинке, с ресурса: https://infostart.ru/1c/articles/1195690/
	//						Но воспользовался только: https://forum.mista.ru/topic/871352 топик (38)
	
	Если НаправлениеПоискаСтроки = Неопределено Тогда
		НаправлениеПоискаСтроки = НаправлениеПоискСНачала();
	КонецЕсли;	
	Если НаправлениеПоискаСтроки <> НаправлениеПоискСНачала() 
		И НаправлениеПоискаСтроки <> НаправлениеПоискаСКонца() Тогда
		ВызватьИсключение "Неверное значение параметра 'НаправлениеПоискаСтроки' (тип: "+Строка(ТипЗнч(НаправлениеПоискаСтроки))+"): "+Строка(НаправлениеПоискаСтроки);
	КонецЕсли;
	
	Если НачальнаяПозиция = Неопределено Тогда 
		НачальнаяПозиция = 0;
	КонецЕсли;
	
	Возврат СтрНайти__(Строка, СтрокаПоиска, НаправлениеПоискаСтроки, НачальнаяПозиция, НомерВхождения);
	
КонецФункции


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


Функция НаправлениеПоискСНачала(НаправлениеПоискаСтроки=Неопределено) Экспорт
	
	Если НаправлениеПоискаСтроки = Неопределено Тогда 
	ИначеЕсли ТипЗнч(НаправлениеПоискаСтроки) = Тип("Строка") Тогда 
	Иначе 
		Попытка
			Результат = Неопределено;
			Выполнить("Результат = НаправлениеПоиска.СНачала;");
			Возврат Результат;
		Исключение
		КонецПопытки;
	КонецЕсли;
	
	Возврат "СНачала";
КонецФункции

Функция НаправлениеПоискаСКонца(НаправлениеПоискаСтроки=Неопределено) Экспорт
	
	Если НаправлениеПоискаСтроки = Неопределено Тогда 
	ИначеЕсли ТипЗнч(НаправлениеПоискаСтроки) = Тип("Строка") Тогда 
	Иначе 
		Попытка
			Результат = Неопределено;
			Выполнить("Результат = НаправлениеПоиска.СКонца;");
			Возврат Результат;
		Исключение
		КонецПопытки;
	КонецЕсли;
	
	Возврат "СКонца";
КонецФункции



Показать
Для отправки сообщения требуется регистрация/авторизация