Строковые функции для совместимости с платформой 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.3.24)

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

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

1 стартмани

18.03.2024    2867    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4997    atdonya    22    

51

Переоткрытие внешних обработок

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

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

30.11.2023    4091    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    9332    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2197    24    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 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    16330    142    sapervodichka    112    

130

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7345    quazare    8    

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


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

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

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

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

Мне кажется, что СтрНайти() добавили, чтобы расширить функционал Найти(). Добавить различные варианты поиска. Ну и плюс они, возможно, заметили нелогичность, что все строковые функции начинаются с "Стр", а эта без префикса.
16. strange2007 144 17.08.18 09:01 Сейчас в теме
(15) Конечно умею. Предсказываю - сейчас пойду наливать чай))))))
А если серьёзно, то мы уже привыкли к тому, что 1С-вцы всегда стремятся вперёд и плохой прошлый опыт просто вычёркивают. Например, ЗначениеНеОпределено (или как оно там писалось) было жёстко исключено. Только вот цена исключения оказалась высокой.
Далее рекомендую обратить внимание на то, что "ктрл+пробел" не показывает ф-ю Найти. Что это? Начало отказа!
Поэтому, как мне кажется, Найти исчезнет. Хоть и позже, но это случится. И вот тут и возникает повод для "загордиться перед столбом" - а мой код не заметил вселенской катастрофы.
17. DrBlack 23 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 151 06.07.20 10:13 Сейчас в теме
(14) Функция Найти Остается в режиме совместимости с 8.2.16
46. ivan453 09.08.22 16:14 Сейчас в теме
8. json 3304 16.08.18 14:28 Сейчас в теме
(4)
(7)
А в чем фишка?
Почему нельзя просто использовать Найти() ?
Я так понимаю, что если нет нужды искать с конца, или искать, скажем второе вхождение, или не с первого символа, то СтрНайти() - ни к чему (если мы хотим поддерживать совместимость с ранними версиями)
Зачем пытаетесь использовать СтрНайти() да еще в попытке?
9. strange2007 144 17.08.18 05:46 Сейчас в теме
(8) Я ж не крутой программер, поэтому как могу...
12. DrBlack 23 17.08.18 08:19 Сейчас в теме
(8) Тут скорее задумка просто использовать новые функции (по возможности), а я лишь раскритиковал выложенный код, который его автору "сэкономил уйму времени", а также привел пример более простой реализации его задумки.
13. json 3304 17.08.18 08:28 Сейчас в теме
(12) ясно.
А то я уж подумал что это серьезно.
Вдруг в новых релизах убрали Найти(), и поэтому приходится костылить.
18. RomanKod 16.10.18 11:39 Сейчас в теме
Спасибо тебе, добрый человек. Выручил.
19. axelerleo 339 08.11.18 15:48 Сейчас в теме
А я бы это дело оформил в отдельный общий глобальный модуль "Полифиллы", и при его добавлении можно было бы юзать код из новых конфигураций на старых платформах. Эдакий babeljs от мира 1С :)
20. rpgshnik 3645 18.11.18 16:02 Сейчас в теме
Не помню в каком релизе но осенью 2018 комплект подобных функций теперь прилетел в комплексную автоматизацию 1.1, я за наименьшим опытом, хапнул горя 😁 теперь тоже схожие функции называю с "_" :)
21. Алексей777 94 30.11.18 12:42 Сейчас в теме
Отлично, когда, действительно сталкиваешься с совместимостью методов платформ и думаешь, блин, писать, а времени в обрез - спасибо, респект и уважуха автору!!!
23. KTo 18.01.19 06:08 Сейчас в теме
Всем привет! Вопрос про функцию "СтрШаблон()". А если я в эту функцию передам код очистки регистра партий?)
24. mvxyz 322 04.02.19 10:55 Сейчас в теме
25. avz_1C 10 11.04.19 12:13 Сейчас в теме
26. itPiligrim 3 18.06.19 18:11 Сейчас в теме
Спасибо, но для всех параметров надо поставить Знач. В противном случае поведение будет отличаться. ВАЖНО! Это приводит к трудно отлавливаемым ошибкам.
27. dendzu 86 27.11.19 09:31 Сейчас в теме +0.25 $m
Спасибо автору сэкономленных 1 час жизни -:)
28. dhurricane 27.11.19 09:42 Сейчас в теме
Стоит заметить, что функция "СтрРазделить" работает немного не так, как в платформе. В публикации Разделитель есть неделимый набор символов, обозначающий границы подстрок в исходной строке. В платформе же каждый символ Разделителя является индивидуальным разделителем.
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 30 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 11 25.09.20 12:10 Сейчас в теме
На платформе 8.3.13.1690 СтрРазделить вообще шикарно работает.
Прикрепленные файлы:
42. AgnepuS 11 25.09.20 14:25 Сейчас в теме
(41) Забыл добавить, что режим совместимости 8.3.5
43. Mechanik21 24 02.10.20 17:14 Сейчас в теме
В своё время задумался над задачей, которая решалась функцией СтрНайти(), но тогда я про неё ещё не знал. Начал что-то ковырять, ничего не взлетело. Товарищ с той работы подсказал, что есть СтрНайти(), мол, не парься, друг, всё уже написано. И я на протяжении следующих трёх лет спокойно её юзал, пока не начал искать другую работу и неожиданно попал на одно интересное собеседование.
И что вы думаете, мне дали лист А4 и 15 мин на задачу. В задаче, опуская подробности, нужно было написать код функции СтрНайти(), как раз то, что было написано здесь. И я столкнулся с каким-то барьером в мозгу. Зачем над этим думать, если это уже решено? и 15 мин писал и зачёркивал СтрНайти(). В общем, с треском провалился.
44. UkKvazar 28.10.20 12:35 Сейчас в теме
Если в _СтрШаблон() не первым(!) параметром передать значение-флаг предыдущего параметра, т.е. в %2 передать "%1", то в мире появится на одного грустного программиста больше. Будьте аккуратны.
49. Istur 1472 20.03.23 20:03 Сейчас в теме
Функция СтрСоединить(Строки, Разделитель) Экспорт
	
	СтрокаВозврата = "";
	
	Если Строки.Количество() = 0 Тогда
		Возврат "";
	КонецЕсли;
	
	ПоследняяСтрока = Строки.Количество() - 1;
	Сч = 0;
	
	Для каждого мСтрока Из Строки Цикл
		СтрокаВозврата = СтрокаВозврата + мСтрока;
		
		Если Сч = ПоследняяСтрока Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаВозврата = СтрокаВозврата + Разделитель;
		Сч = Сч + 1;
		
	КонецЦикла;
	
	Возврат СтрокаВозврата;
	
КонецФункции
Показать
50. karpov 12 26.07.23 10:45 Сейчас в теме
Спасибо тебе, Добрый Человек!
Оставьте свое сообщение