Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Обрезать строку 8.2

Обрезать строку 8.2
Я
   illiona
 
20.06.18 - 10:49
Добрый день. Нужно у строки справа обрезать скобки и что в скобках.

А-церумен ср-во (ЛАБОРАТОРИЯ ЖИЛЬБЕР) -> А-церумен ср-во
Авелокс (Bayer AG (рецепт.)) -> Авелокс
Амлотоп №30 (амлодипин) (Нижфарм ОАО) -> Амлотоп №30 (амлодипин)
Не могу алгоритм придумать. Всем заранее спасибо
 
 
   butterbean
 
1 - 20.06.18 - 10:54
ты сначала на бумаге задачу как-то опиши, критерии обрезания чтобы были четкие
   vladko
 
2 - 20.06.18 - 10:58
(0) пока вижу алгоритм:
- определяем справа позицию первой открытой скобки и вытираем до конца строки всё что есть.
   vladko
 
3 - 20.06.18 - 11:00
+(2)точнее, определяем справа позицию открытой скобки, соответствующей первой закрытой.
   Пес Барбос
 
4 - 20.06.18 - 11:00
я бы через СтрРазделить(<Строка>, "(") сделал.
если (...) начинаются всегда в конце (после нужного наименования) , то первым в массиве будет то, что тебе нужно
   vladko
 
5 - 20.06.18 - 11:04
(4) для "Амлотоп №30 (амлодипин) (Нижфарм ОАО)" не сработает, чтобы выдало "Амлотоп №30 (амлодипин)"
   illiona
 
6 - 20.06.18 - 11:06
да не сработает, вот и думаю сижу как сделать
   Гипервизор
 
7 - 20.06.18 - 11:06
(4) СтрРазделить() в 8.2, ну-ну ))
   Пес Барбос
 
8 - 20.06.18 - 11:08
(5) тогда делать как (2)-(3) через 
Сред и СтрНайти

(7) мда.. бывает..просто уже и забыл, что есть еще и 8.2
   Гипервизор
 
9 - 20.06.18 - 11:10
(8) И СтрНайти() не покатит по той же причине ))
   vladko
 
10 - 20.06.18 - 11:11
(6) я бы тупо перебирал справа налево позиции символов в строке, чтобы определить нужную мне скобку как в (3) даже в таком случае как в строке "Авелокс (Bayer AG (рецепт.))" считать сколько встретилось закрытых скобок до первой открытой и как только открытых столько же стало, то СТОП и обрезаем до этой позиции.
 
 Рекламное место пустует
   novichok79
 
11 - 20.06.18 - 11:14
чего-то тип такого

НоваяСтрока = СтрЗаменить(ИсходнаяСтрока, "(", Символы.ПС);
ЧислоСтрок = СтрЧислоСтрок(НоваяСтрока);

Если ЧислоСтрок > 2 Тогда 
    
    Для Счетчик = 1 По ЧислоСтрок - 1 Цикл 
        
        Результат = Результат + "(" + СтрПолучитьСтроку(НоваяСтрока);

    КонецЦикла;

КонецЕсли;

но тогда нужно понять какие скобки нужны, а какие нет
   butterbean
 
12 - 20.06.18 - 11:18
(6) проблема то еще видимо в том, что нужно убирать названия производителей в скобках, а название действующего вещества или аналога в скобках оставлять
   FIXXXL
 
13 - 20.06.18 - 11:21
(6) РазложитьСтрокуВМассивПодстрок
   FIXXXL
 
14 - 20.06.18 - 11:23
(13) +
http://helpme1c.ru/razlozhitstrokuvmassivpodstrok-1s-8-3-8-2
если нет в конфе

затем обратно собрать, игнорируя последний элемент массива
   FIXXXL
 
15 - 20.06.18 - 11:25
по этим Жильберам-Баерам можно массив собрать?
тогда игнорировать подстроки, в которые входит название производителя
в общем придумать можно, если есть порядок заведения инфы в названиях...
   catena
 
16 - 20.06.18 - 12:17
ВЫБРАТЬ 1 КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов9
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 0;
Выбрать &Строка как Наименование поместить ном; 
ВЫБРАТЬ
    тзКоличествоСимволов9_Лев.КолСимв * 10 + тзКоличествоСимволов9_Прав.КолСимв КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов100
ИЗ
    тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Лев,
    тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Прав;
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ Различные
    Номенклатура.Наименование как Наименование,
    КоличествоСимволовДоОткрытия.КолСимв+1 как Позиция,
    1 как сум,"(" как сим
Поместить НаимИнтерв    
ИЗ
    ном КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоОткрытия
        ПО Подстрока(Номенклатура.Наименование,КоличествоСимволовДоОткрытия.КолСимв+1,1) = "("
объединить все
ВЫБРАТЬ Различные
    Номенклатура.Наименование,
    КоличествоСимволовДоЗакрытия.КолСимв+1,
    -1,")"
ИЗ
    ном КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоЗакрытия
        ПО Подстрока(Номенклатура.Наименование,КоличествоСимволовДоЗакрытия.КолСимв+1,1) = ")";
Выбрать т1.Наименование,т1.Позиция,т1.сум,Сумма(т2.сум) поместить ПозицияЗакрытия из НаимИнтерв как т1 левое соединение НаимИнтерв как т2 по т1.Позиция<т2.Позиция
Сгруппировать по т1.Наименование,т1.Позиция,т1.сум Имеющие Сумма(т2.сум)+т1.сум=0;
Выбрать Максимум(т.Наименование),Выразить(Подстрока(Максимум(т.Наименование),1, Максимум(т.Позиция)-1)как строка(100)) результат из ПозицияЗакрытия как т
   novichok79
 
17 - 20.06.18 - 12:46
(0) о господи, что это? зачем ради такой задачи делать запрос?
   novichok79
 
18 - 20.06.18 - 12:47
(17) --> (16)
   catena
 
19 - 20.06.18 - 12:56
(17)Потому что, как решать не запросом очевидно - перебрать с конца, найти первое полное закрытие. Я такое еще в универе на паскале делала.
   lodger
 
20 - 20.06.18 - 13:06
(0) держи алгоритм:
1) обходим строчку с конца по одному символу.
2) по ходу движения считаем сколько было значков ")".
3) если нашли "(" и колво из п.п.2 = 1 тогда выходим из цикла, иначе считаем сколько было значков "(".
4) если нашли "(" и колво из п.п.2 сравнялось с колвом из п.п.3 тогда выходим из цикла.
5) обрезаем строку от первого и до значка на котором вышли в п.п.3 или п.п.4.
   lodger
 
21 - 20.06.18 - 13:07
+(20) там осталось еще пару доп.условий, но общий смысл думаю ясен.
   catena
 
22 - 20.06.18 - 13:10
(20)Да без если. Заводим счетчик. Если встречаем ")" - счетчик+1, если встречаем "(" - счетчик-1. Как только счетчик в 0, значит это наша позиция обрезания.
   illiona
 
23 - 20.06.18 - 13:37
МассивСтрок = Новый Массив;
        Если СтрЧислоВхождений(Строка,") (") = 1 ТОгда
            стр = СтрЗаменить(Строка,") (", "&");
            Разделитель = "&";
            МассивСтрок = РазложитьСтрокуВМассивПодстрок(стр, Разделитель,ПропускатьПустыеСтроки);
            СтрокаВерная = МассивСтрок[0] + ")";
        Иначе
             
            МассивСтрок = РазложитьСтрокуВМассивПодстрок(Строка, Разделитель,ПропускатьПустыеСтроки);
            Если МассивСтрок.Количество()>3 Тогда
                СтрокаВерная = СокрЛП(МассивСтрок[0]) + " (" + СокрЛП(МассивСтрок[1]);
            Иначе
                СтрокаВерная = СокрЛП(МассивСтрок[0]);
            КонецЕсли;
        КонецЕсли;


Сделала так
   novichok79
 
24 - 20.06.18 - 13:47
(19) так и большего не требуется, имхо конечно.
   illiona
 
25 - 03.07.18 - 10:35
Если СтрЧислоВхождений(Строка,") (") = 1 ТОгда
            стр = СтрЗаменить(Строка,") (", "&");
            Разделитель = "&";
            МассивСтрок = РазложитьСтрокуВМассивПодстрок(стр, Разделитель,ПропускатьПустыеСтроки);
            СтрокаВерная = МассивСтрок[0] + ")";
        ИначеЕсли СтрЧислоВхождений(Строка,") (") = 2 ТОгда
            стр = СтрЗаменить(Строка,") (", "&");
            Разделитель = "&";
            МассивСтрок = РазложитьСтрокуВМассивПодстрок(стр, Разделитель,ПропускатьПустыеСтроки);
            СтрокаВерная = МассивСтрок[0] + ") (" + МассивСтрок[1] + ")";
    
        Иначе
             
            МассивСтрок = РазложитьСтрокуВМассивПодстрок(Строка, Разделитель,ПропускатьПустыеСтроки);
            Если МассивСтрок.Количество()>= 3 Тогда
                СтрокаВерная = СокрЛП(МассивСтрок[0]) + " (" + СокрЛП(МассивСтрок[1]);
            Иначе
                СтрокаВерная = СокрЛП(МассивСтрок[0]);
            КонецЕсли;
        КонецЕсли;

На всех строках работает кроме Авелокс таб 400мг №5 (Bayer AG (рецепт.))
   illiona
 
26 - 03.07.18 - 10:36
Авелокс (Bayer AG (рецепт.)) -> Авелокс


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует