14 июля 2020 г.

1С Удалить до числа включительно в строке

Задача:

В строке "Лот ..12345... Новая облицовка" удалить число и все что перед ним.

Задача слегка расплывчата, т.к. первая реализация столкнулась с тем, что первое число может быть и не в начале и не подпадать под определение. Поэтому решил сделать так:
  1. Функция имеет два параметра: строка и длина предполагаемого числа
  2. Функция ищет первое вхождение числа в обрезанной строке
  3. Если число найдено, то ищет первое вхождение буквы после первого числа в обрезанной строке
  4. Обрезает строку
  5. Проверяет наличие в начале строки не букв (пробелы, точки, запятые и т.д.)
  6. Возвращает новую строку

Писалось под БП2.0, поэтому не использовалась функция СтрНайти()

Функция ОбработатьСтроку(СтрокаПоиска, ДлинаЧисла=10)
 МассивСимволов="абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
 НомерСимвола=1;
 СтрокаПоискаОбрезанная=Лев(СтрокаПоиска,ДлинаЧисла);
 НовоеЗначение=Неопределено;
 ПервоеЧислоНайдено=Ложь;
 ПервоеНеЧислоНайдено=Ложь;
 
 Пока НомерСимвола<>ДлинаЧисла Цикл
  СимволСтроки=Сред(СтрокаПоискаОбрезанная,НомерСимвола,1);
  Для Цифры=0 По 9 Цикл
   ВхождениеЧисла=Найти(СимволСтроки,Цифры); 
   Если ВхождениеЧисла>0 И НЕ ПервоеЧислоНайдено Тогда
    ПервоеЧислоНайдено=Истина;
    Прервать;
   ИначеЕсли ВхождениеЧисла=0 И ПервоеЧислоНайдено Тогда
    ПервоеНеЧислоНайдено=Истина;
    Прервать
   КонецЕсли; 
  КонецЦикла;
  Если ПервоеНеЧислоНайдено Тогда
   Прервать;
  Иначе
   НомерСимвола=НомерСимвола+1; 
  КонецЕсли;
 КонецЦикла;
 Если ПервоеНеЧислоНайдено Тогда
  НовоеЗначение=Прав(СтрокаПоиска,СтрДлина(СтрокаПоиска)-НомерСимвола);
 Иначе
  Возврат(СтрокаПоиска);
 КонецЕсли;
 
 ЭтоНеБуква=Истина;
 Каунт=1;
 Пока ЭтоНеБуква Цикл 
  Если Найти(НРег(МассивСимволов), сред(НРег(НовоеЗначение),Каунт,1))=0 Тогда
   Каунт=Каунт+1;
  Иначе
   ЭтоНеБуква=Ложь;
  КонецЕсли;
 КонецЦикла;
 Если Каунт<>1 Тогда
  НовоеЗначение=Прав(НовоеЗначение,СтрДлина(НовоеЗначение)-(Каунт-1));
 КонецЕсли;
 Возврат(НовоеЗначение);
КонецФункции

И применяем к полному наименованию справочника "номенклатура"

Процедура ВыполнитьСопоставление()
  //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
 // Данный фрагмент построен конструктором.
 // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | Номенклатура.Ссылка КАК Ссылка
  |ИЗ
  | Справочник.Номенклатура КАК Номенклатура
  |ГДЕ
  | Номенклатура.ЭтоГруппа = ЛОЖЬ";
 
 
 РезультатЗапроса = Запрос.Выполнить();
 
 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
  ЭлементСправочника=ВыборкаДетальныеЗаписи.Ссылка;
  
  НовоеНаименование=ОбработатьСтроку(ЭлементСправочника.Наименование);
  Если НовоеНаименование<>ЭлементСправочника.НаименованиеПолное Тогда
   ЭлементОбъект=ЭлементСправочника.ПолучитьОбъект();
   ЭлементОбъект.НаименованиеПолное=НовоеНаименование;
   //Справочники.Номенклатура.СоздатьЭлемент().Записать();
   Попытка
    ЭлементОбъект.Записать();
   Исключение
    Сообщить(ОписаниеОшибки());
   КонецПопытки;
   Сообщить(""+ЭлементОбъект.Код+" - "+НовоеНаименование+" +++ "+Лев(ЭлементСправочника.Наименование,10));
   
  КонецЕсли;
 КонецЦикла;
 
 //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
 
КонецПроцедуры


Комментариев нет:

Отправка комментария