Имя: Пароль:
1C
1С v8
Обрезать строку 8.2
0 illiona
 
naïve
20.06.18
10:49
Добрый день. Нужно у строки справа обрезать скобки и что в скобках.

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

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

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

    КонецЦикла;

КонецЕсли;

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

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


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

На всех строках работает кроме Авелокс таб 400мг №5 (Bayer AG (рецепт.))
26 illiona
 
naïve
03.07.18
10:36
Авелокс (Bayer AG (рецепт.)) -> Авелокс
Ошибка? Это не ошибка, это системная функция.