Строковые функции для совместимости с платформой 8.3.5 и ниже
Разработка - Универсальные функции
Приведенные ниже функции являются аналогами строковых методов, появившихся в платформе 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. Текст, расположенный ниже "Причины купить" и др. - добавляется автоматически и нет возможности его отключить. Рекомендую не обращать на него внимания
Вступайте в нашу телеграмм-группу Инфостарт
СтрЗаканчиваетсяНа СтрНачинаетсяС СтрРазделить СтрСоединить СтрНайти СтрШаблон
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)
ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.
30000 руб.
09.07.2026 1412 1 0
Загрузка и выгрузка в Excel Универсальные функции Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).
30.10.2025 8755 Abysswalker 11
Универсальные функции Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.
14.05.2025 14495 DeerCven 16
Инструментарий разработчика Универсальные функции Запросы Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Внешняя обработка для создания запроса на основании табличных данных.
22.07.2024 11965 276 ixijixi 10
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.
21.05.2024 68778 dimanich70 87
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.
1 стартмани
18.03.2024 9291 7 John_d 13
Универсальные функции Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.
12.02.2024 85816 atdonya 31
Универсальные функции Разработчик 1С:Предприятие 8 Бесплатно (free)
На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.
30.11.2023 13484 ke.92@mail.ru 18
Позвольте дополнить здесь (добавить восемь строк) для полной совместимости со СтрРазделить, в которой Разделитель - строка символов, каждый из которых является индивидуальным разделителем
Функция _СтрРазделить(Знач Строка, Знач Разделитель, ВключатьПустые = Истина) Экспорт
Результат = Новый Массив;
КоличествоСимволовРазделителя = СтрДлина(Разделитель);
Если КоличествоСимволовРазделителя > 1 Тогда
ПервыйСимволРазделителя = Лев(Разделитель, 1);
Для НомерСимвола = 2 по КоличествоСимволовРазделителя Цикл
Строка = СтрЗаменить(Строка, Сред(Разделитель, НомерСимвола, 1), ПервыйСимволРазделителя);
КонецЦикла;
Разделитель = ПервыйСимволРазделителя;
КонецЕсли;
Если Строка = "" Тогда
Если ВключатьПустые Тогда
Результат.Добавить(Строка);
КонецЕсли;
Возврат Результат;
КонецЕсли;
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если ВключатьПустые ИЛИ НЕ Подстрока = "" Тогда
Результат.Добавить(Подстрока);
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Если ВключатьПустые ИЛИ НЕ Строка = "" Тогда
Результат.Добавить(Строка);
КонецЕсли;
Возврат Результат;
КонецФункции Показать
ЛеваяЧастьНайти = ПолучениеФункцииСтрНайти();
// Доподготовка
РезультатРаботы = 0;
ИскомаяПодстрока = "(точка маршрута)";
ИсходнаяСтрока = Строка(ИсходныйТип);
// Составление итоговой строки
ИтоговаяСтрока = "РезультатРаботы=" + ЛеваяЧастьНайти + "(ИсходнаяСтрока, ИскомаяПодстрока);";
// Поиск
Выполнить(ИтоговаяСтрока);
// В зависимости от клиента может работать Найти или СтрНайти
Функция ПолучениеФункцииСтрНайти()
Перем ВозврЗначение, ИспытуемаяЧасть, ПолнаяСтрока;
Перем ВрСтрока, ПоисковыйСимвол;
// Предподготовка
ВозврЗначение = "";
ВрСтрока = "097987897";
ПоисковыйСимвол = "9";
// Попытка "Найти"
ИспытуемаяЧасть = "Найти";
ПолнаяСтрока = ИспытуемаяЧасть + "(ВрСтрока, ПоисковыйСимвол);";
Попытка
Выполнить(ПолнаяСтрока);
ВозврЗначение = ИспытуемаяЧасть;
Исключение КонецПопытки;
// Попытка "СтрНайти"
ИспытуемаяЧасть = "СтрНайти";
ПолнаяСтрока = ИспытуемаяЧасть + "(ВрСтрока, ПоисковыйСимвол);";
Попытка
Выполнить(ПолнаяСтрока);
ВозврЗначение = ИспытуемаяЧасть;
Исключение КонецПопытки;
//// Анализ предыдщей манипуляции
//Если ВозврЗначение="" Тогда
// ВозврЗначение = "СтрНайти";
//КонецЕсли;
Возврат(ВозврЗначение);
КонецФункции ПоказатьА если серьёзно, то данный кривой код (и ещё подобные куски) сэкономил уйму времени, позволил уволить кучу ит-отделов и ит-контор и до сих пор крутится во многих организациях. Вы просто не пробовали оптимизировать работу системы на всех 7 уровнях оптимизации. Попробуйте и с ужасом увидите, что кривой код всегда гораздо эффективней красивого.
Именно поэтому в своё время появилась Майкрософт и 1С
Функция СтрНайти_83_82(Строка, ПодстрокаПоиска) Экспорт
ЗнВозврат = 0;
Попытка
ЗнВозврат = Вычислить("СтрНайти(Строка, ПодстрокаПоиска)");
Исключение
ЗнВозврат = Найти(Строка, ПодстрокаПоиска);
КонецПопытки;
Возврат ЗнВозврат;
КонецФункции
ПоказатьХм, а как скомпилится Найти в конфе, где эта конструкция не поддерживается? Оно ж ошибку выдаст. После исключения надо же тоже в вычислить/выполнить.
(украл код себе)
а вы будущее предсказывать умеете?
Или есть какие-то конкретные тексты от разработчиков платформы, что уберут функцию Найти()?
Мне кажется, что СтрНайти() добавили, чтобы расширить функционал Найти(). Добавить различные варианты поиска. Ну и плюс они, возможно, заметили нелогичность, что все строковые функции начинаются с "Стр", а эта без префикса.
А если серьёзно, то мы уже привыкли к тому, что 1С-вцы всегда стремятся вперёд и плохой прошлый опыт просто вычёркивают. Например, ЗначениеНеОпределено (или как оно там писалось) было жёстко исключено. Только вот цена исключения оказалась высокой.
Далее рекомендую обратить внимание на то, что "ктрл+пробел" не показывает ф-ю Найти. Что это? Начало отказа!
Поэтому, как мне кажется, Найти исчезнет. Хоть и позже, но это случится. И вот тут и возникает повод для "загордиться перед столбом" - а мой код не заметил вселенской катастрофы.
Функция СтрНайти_83_82(Строка, ПодстрокаПоиска) Экспорт
ЗнВозврат = 0;
Попытка
ЗнВозврат = Вычислить("СтрНайти(Строка, ПодстрокаПоиска)");
Исключение
ЗнВозврат = Вычислить("Найти(Строка, ПодстрокаПоиска)");
КонецПопытки;
Возврат ЗнВозврат;
КонецФункции
ПоказатьПри компиляции ошибки не будет, наличие второй "Попытки" не потребуется :)
// Функция - Разделяет строку на массив по указанному разделителю
//
// Параметры:
// ВходящаяСтрока - Строка - Строка для разделения
// Разделитель - Строка - Строка разделитель
//
// Возвращаемое значение:
// Массив - Массив строк, которые получились в результате разделения входной строки
//
Функция СтрРазделить(ВходящаяСтрока, Разделитель)
Рез = Новый Массив();
ВрСтрока = СтрЗаменить(ВходящаяСтрока, Разделитель, Символы.ПС);
Для Сч = 1 По СтрЧислоСтрок(ВрСтрока) Цикл
Стр = СтрПолучитьСтроку(ВрСтрока, Сч);
Если Разделитель = " " и СокрЛП(Стр) = "" Тогда
Продолжить;
КонецЕсли;
Рез.Добавить(Стр);
КонецЦикла;
Возврат Рез;
КонецФункции ПоказатьФункция СтрСоединить(МассивСтрок, Разделитель = "") Экспорт
Возврат СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(МассивСтрок, Разделитель);
КонецФункции
Функция СтрРазделить(Строка, Разделитель, ВключатьПустые = Ложь) Экспорт
Возврат СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, ВключатьПустые);
КонецФункции// СтрРазделить()
(7)
А в чем фишка?
Почему нельзя просто использовать Найти() ?
Я так понимаю, что если нет нужды искать с конца, или искать, скажем второе вхождение, или не с первого символа, то СтрНайти() - ни к чему (если мы хотим поддерживать совместимость с ранними версиями)
Зачем пытаетесь использовать СтрНайти() да еще в попытке?
НачалоПодстроки = 1;
Пока НачалоПодстроки <= СтрДлина(Строка) Цикл
КонецПодстроки = НачалоПодстроки;
Пока КонецПодстроки <= СтрДлина(Строка)
И Не Найти(Разделитель, Сред(Строка, КонецПодстроки, 1)) Цикл
КонецПодстроки = КонецПодстроки + 1;
КонецЦикла;
Если НачалоПодстроки < КонецПодстроки Тогда
Подстрока = Сред(Строка, НачалоПодстроки, КонецПодстроки - НачалоПодстроки);
Результат.Добавить(Подстрока);
ИначеЕсли ВключатьПустые Тогда
Результат.Добавить("");
КонецЕсли;
НачалоПодстроки = КонецПодстроки + 1;
КонецЦикла; Показать
Функция НаправленияПоиска()
Возврат Новый Структура("СНачала,СКонца","СНачала","СКонца");
КонецФункции
Упростит рефакторинг.
Еще проще в начало модуля добавить:
Перем НаправленияПоиска;
В конец:
НаправленияПоиска = Новый Структура("СНачала,СКонца","СНачала","СКонца");
Еще проще в начало модуля добавить:
Перем НаправленияПоиска;
В конец:
НаправленияПоиска = Новый Структура("СНачала,СКонца","СНачала","СКонца");
В этом варианте - инициализация не будет работать из серверного кода, если она прописана в конце клиентского!
Для функции - я могу поставить &НаКлиентеНаСервереБезКонтекста, а вот для этой инициализации - никак.
Добавлю. В контекстах пока не идеально разбираюсь, отсюда вопрос.
Вызов СтрНайти происходит из модуля формы - много раз, из разных функций. Некоторые из вызывающих функций, объявлены, как &НаКлиенте, некоторые - &НаСервере, а некоторые - &НаКлиентеНаСервереБезКонтекста.
Если для СтрНайти - не объявить контекст, то он, по-умолчанию - клиентский. Если объявить её &НаСервере - из &НаКлиенте и &НаСервере - вызывается, а вот из &НаКлиентеНаСервереБезКонтекста - нет, заявляет, что:
Процедура или функция с указанным именем не определена (СтрНайти)
...<<?>>СтрНайти(...; (Проверка: Сервер)
Можно как-то сделать, чтобы не писать несколько клонов, каждый со своим именем?
И что вы думаете, мне дали лист А4 и 15 мин на задачу. В задаче, опуская подробности, нужно было написать код функции СтрНайти(), как раз то, что было написано здесь. И я столкнулся с каким-то барьером в мозгу. Зачем над этим думать, если это уже решено? и 15 мин писал и зачёркивал СтрНайти(). В общем, с треском провалился.
Функция СтрСоединить(Строки, Разделитель) Экспорт
СтрокаВозврата = "";
Если Строки.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
ПоследняяСтрока = Строки.Количество() - 1;
Сч = 0;
Для каждого мСтрока Из Строки Цикл
СтрокаВозврата = СтрокаВозврата + мСтрока;
Если Сч = ПоследняяСтрока Тогда
Продолжить;
КонецЕсли;
СтрокаВозврата = СтрокаВозврата + Разделитель;
Сч = Сч + 1;
КонецЦикла;
Возврат СтрокаВозврата;
КонецФункции ПоказатьСинтаксис:
СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Разделяемая строка.
<Разделитель> (обязательный)
Тип: Строка.
Строка символов, каждый из которых является индивидуальным разделителем.
<ВключатьПустые> (необязательный)
Тип: Булево.
Указывает необходимость включать в результат пустые строки, которые могут образоваться в результате разделения исходной строки.
Значение по умолчанию: Истина.
,Топик 38
Немного модифицировал
//Пример.
XML_Начало = СтрНайти_(ТипСтрокойXML,Поиск_Левое,НаправлениеПоискаСКонца(),,1);
Функция СтрНайти_(Знач Строка, Знач СтрокаПоиска, Знач НаправлениеПоискаСтроки = Неопределено, Знач НачальнаяПозиция = Неопределено, Знач НомерВхождения = 1)
Если (НаправлениеПоискаСтроки = Неопределено Или НаправлениеПоискаСтроки=НаправлениеПоискСНачала(НаправлениеПоискаСтроки))
И (НачальнаяПозиция = Неопределено Или НачальнаяПозиция = 1)
И (НомерВхождения = Неопределено Или НомерВхождения = 1) //И Ложь //Отладка
Тогда
Попытка
Результат = Неопределено;
Выполнить("Результат = СтрНайти(Строка,СтрокаПоиска);");
Возврат Результат;
Исключение
КонецПопытки;
Возврат Найти(Строка,СтрокаПоиска);
КонецЕсли;
Попытка //в=10/0; //Отладка
Результат = Неопределено;
Выполнить("Если НаправлениеПоискаСтроки = Неопределено Тогда
| НаправлениеПоискаСтроки_ = Неопределено;
|ИначеЕсли ТипЗнч(НаправлениеПоискаСтроки) = Тип(""Строка"") Тогда
| Если НаправлениеПоискаСтроки = ""СНачала"" Тогда
| НаправлениеПоискаСтроки_ = НаправлениеПоиска.СНачала;
| ИначеЕсли НаправлениеПоискаСтроки = ""СКонца"" Тогда
| НаправлениеПоискаСтроки_ = НаправлениеПоиска.СКонца;
| Иначе
| НаправлениеПоискаСтроки_ = Неопределено;
| КонецЕсли;
|КонецЕсли;
|Результат = СтрНайти(Строка,СтрокаПоиска,НаправлениеПоискаСтроки_,НачальнаяПозиция,НомерВхождения);");
Возврат Результат;
Исключение
КонецПопытки;
//Попробуем по старинке, с ресурса:
// Но воспользовался только: топик (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);
КонецЕсли;
КонецЕсли;
Возврат Найти(Строка, ПодстрокаПоиска);
КонецФункции
Функция НаправлениеПоискСНачала(НаправлениеПоискаСтроки=Неопределено) Экспорт
Если НаправлениеПоискаСтроки = Неопределено Тогда
ИначеЕсли ТипЗнч(НаправлениеПоискаСтроки) = Тип("Строка") Тогда
Иначе
Попытка
Результат = Неопределено;
Выполнить("Результат = НаправлениеПоиска.СНачала;");
Возврат Результат;
Исключение
КонецПопытки;
КонецЕсли;
Возврат "СНачала";
КонецФункции
Функция НаправлениеПоискаСКонца(НаправлениеПоискаСтроки=Неопределено) Экспорт
Если НаправлениеПоискаСтроки = Неопределено Тогда
ИначеЕсли ТипЗнч(НаправлениеПоискаСтроки) = Тип("Строка") Тогда
Иначе
Попытка
Результат = Неопределено;
Выполнить("Результат = НаправлениеПоиска.СКонца;");
Возврат Результат;
Исключение
КонецПопытки;
КонецЕсли;
Возврат "СКонца";
КонецФункции
ПоказатьРейтинг: 3437
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 841165
Создание 03.06.18 08:27
Обновление 16.06.18 16:40
Просмотры 55942
Загрузки 0
Рейтинг
117
Комментарии 55
Код открыт Да
Рубрики Универсальные функции
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)