1С Найти – поиск подстроки или символа

Функция 1С Найти(СтрокаГдеИщем, СтрокаЧтоИщем) ищет в тексте первое вхождение нужной нам подстроки, и возвращает номер позиции первой буквы найденной подстроки в тексте.


Например:

  • Выполняем 1С Найти(«Ежик смеялся и кушал кактус», «и кушал»)
  • 1С возвращает номер позиции слова «и» — 14
  • Выполняем 1С Найти(«Ежик смеялся и кушал кактус», «и»)
  • 1С возвращает номер позиции буквы «и» в слове «ежик» — 3
  • Выполняем 1С Найти(«Ежик смеялся и кушал кактус», «с иголками»)
  • 1С возвращает 0, так как той подстроки, что мы ищем в тексте нет.

Аккуратно — если в параметре(ах) 1С Найти указана пустая строка, то вернет не 0, а 1.

На примере нашего анализатора текста сделаем с помощью 1С Найти – сохранение списка значений в строку с разделителями, и восстановление из строки в список значений обратно.

Допустим:

  • что нам на «входе» подается массив или список значений (колонку таблицы значений можно выгрузить в массив с помощью метода ВыгрузитьКолонку())
  • что значения в массиве/списке только строковые (т.е. не будем запоминать, число это было или строка)
  • как пример «строки с разделителями»: «12;32;белый»

[VIP_CONTENT]

//Из массива/списка значений в строку
//Второй и третий параметры - необязательные, мы указали для них значение по умолчанию
Функция ВСтрокуСРазделителями(МассивСписокЗначений, Разделитель = ";", ЗаменительРазделителя = "#ЗДЕСЬ_БЫЛ_РАЗДЕЛИТЕЛЬ")

     Если ТипЗнч(МассивСписокЗначений) <> Тип("Массив") и ТипЗнч(МассивСписокЗначений) <> Тип("СписокЗначений") Тогда
          Сообщить("Ошибка. Параметр должен быть массив или список значений");
          Возврат "";
     КонецЕсли;
     
     Строка = ""; //Сюда будем записывать результат
     Для каждого Знч из МассивСписокЗначений Цикл //цикл "Для каждого" позволяет обойти все значения как массива, так и списка значений
          Если не ПустаяСтрока(Строка) Тогда //разделитель нужно добавлять только в том случае, если первое значение уже записано (то есть строка уже не пустая)
               Строка = Строка + Разделитель; //добавляем разделитель
          КонецЕсли;
          
          Если ТипЗнч(Знч) = Тип("Число") Тогда //так как при преобразовании в строку по умолчанию могут быть добавлены пробелы, число приводим к строке особенным образом
               Строка = Строка + Формат(Знч, "ЧГ=0"); //вот так
          Иначе
Строка = Строка + СтрЗаменить(Строка(Знч), Разделитель, ЗаменительРазделителя); //а остальные просто конвертим Строка(Знч); в строковых значениях может встретиться тот символ, который мы выбрали за разделитель, заменим его
          КонецЕсли;
     КонецЦикла;

     Сообщить(Строка);
     
     Возврат Строка;
     
КонецФункции

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

     Возврат Результат;     

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

[/VIP_CONTENT]

Пример использования созданных нами функций:
Список = Новый СписокЗначений();
Список.Добавить(22);
Список.Добавить(33.5);
Список.Добавить("Здесь был Петя");
Список.Добавить("Петя нашел йожика; а тот съел Петю");
Список.Добавить(ТекущаяДата());

Строка = ВСтрокуСРазделителями(Список);
СписокЗначений = ИзСтрокиСРазделителями(Строка);
Массив = СписокЗначений.ВыгрузитьЗначения();

Сообщения от 1С в результате выполнения этого кода:
22;33,5;Здесь был Петя;Петя нашел йожика#ЗДЕСЬ_БЫЛ_РАЗДЕЛИТЕЛЬ а тот съел Петю;25.10.2012 14:14:43

Входящая строка: 22;33,5;Здесь был Петя;Петя нашел йожика#ЗДЕСЬ_БЫЛ_РАЗДЕЛИТЕЛЬ а тот съел Петю;25.10.2012 14:14:43

Результат:
22
33,5
Здесь был Петя
Петя нашел йожика; а тот съел Петю
25.10.2012 14:14:43