Имя: Пароль:
1C
1С v8
Из строки выделить слово.
0 lirt82
 
13.02.26
10:52
Есть строка
НаименованиеОфиса = "РФ, 119334, (Москва, ул. Вавилова, дом № 5, корпус 3, помещ. 2П, этаж 3)";
по условию задачи необходимо выделить из этой строки название города. В примере это "Москва", шаблон строки строгий,
"хххххххх(<НазваниеГорода>,ххххххххххххх)" х - любой символ, включая пробел.
т.е. необходимо сформировать название города начиная от первой скобки "(" и заканчивая первой запятой после этой скобки.
Начал писать функцию, но не могу дальше продолжить:) прошу подсказать.

Функция НайтиГород(НаименованиеОфиса) Экспорт
    
    Если ПустаяСтрока(НаименованиеОфиса) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    // Обойдем все
    Для ТекСимвол = 1 По СтрДлина(НаименованиеОфиса) Цикл
        
        // Получим текущий элемент, сохранив в переменную
        ТекЭлемент = Сред(НаименованиеОфиса, ТекСимвол, 1);
        
        Если ТекЭлемент <> "(" Тогда
            Продолжить;
        Иначе
1 Kuzmich123
 
13.02.26
10:52
(0) в 8.3.23 появилось

СтрНайтиПоРегулярномуВыражению (StrFindByRegularExpression)

Возможно, это тебе поможет
2 evgen48
 
13.02.26
10:54
МассивПодстрок = СтрРазделить(НаименованиеОфиса,",", истина);
    Город = СОКРЛП(СтрЗаменить(МассивПодстрок[2],"(",""));
3 1cVandal
 
13.02.26
10:57
если шаблон строгий, то находишь скобку через
ПозицияНачала = СтрНайти(Наименованиеофиса, "(") + 1;

Это позиция с которой начинается твой город, берешь все что правее нее
СтрокаПарамПамПам = Сред(ПозицияНачала,СтрДлина(НаименованиеОфиса) -СтрДлина(ПозицияНачала ))

Далее ищешь позицию первой запятой после города через
ПозицияКонца = СтрНайти(СтрокаПарамПамПам, ",")

Ну и берешь только город
Город = Лев(СтрокаПарамПамПам, ПозицияКонца)
4 Ногаминебить
 
13.02.26
10:58
Через СтрНайти ищешь номер символа скобки, через Сред отрезаешь кусок после нее, через СтрНайти ищешь запятую, через Лев отрезаешь свой город. :)
5 ass1c
 
13.02.26
11:05
(0) Черновой алгоритм для теста, отладки и улучшения:

    Результат         = "";
    НаименованиеОфиса = "РФ, 119334, (Москва, ул. Вавилова, дом № 5, корпус 3, помещ. 2П, этаж 3)";
    
    ПозицияВхождения = СтрНайти(НаименованиеОфиса, "(");
    Если ПозицияВхождения Тогда
        
         ПозицияКонец = СтрНайти(Сред(НаименованиеОфиса, ПозицияВхождения + 1), ",");
        
         Если ПозицияКонец Тогда
            
              Результат = Сред(Сред(НаименованиеОфиса, ПозицияВхождения + 1), 1, ПозицияКонец - 1);
            
         КонецЕсли;
        
    КонецЕсли;
    
    Сообщить(Результат);
6 vbus
 
13.02.26
12:07
НаименованиеОфиса = "РФ, 119334, (Москва, ул. Вавилова, дом № 5, корпус 3, помещ. 2П, этаж 3)";   
Город = СтрНайтиПоРегулярномуВыражению(НаименованиеОфиса,"(?<=\().*?(?=,)").Значение;
7 lirt82
 
13.02.26
12:37
(6) супер лаконичный вариант, работает.
Снимаю шляпу как говориться.
8 Garykom
 
гуру
13.02.26
12:38
Задача учебная?
Если нет - только в парсер адресов загонять и получать населенный пункт с его типом

В примере это "Москва", шаблон строки строгий,
"хххххххх(<НазваниеГорода>,ххххххххххххх)" х - любой символ, включая пробел.


Получается в любых X так же может быть "шаблон города" и не один
Какой надо получить? Первый? Второй? Из Середины? Последний?
9 PR
 
14.02.26
21:57
(6) А мне нейронка выдала такую регулярку (?<=\()[^,]*(?=,)

Написала, что твой вариант с ленивым квантификатором и предпочтительнее использовать (?<=\()[^,]*(?=,), потому что:

    Чётко ограничивает набор символов (без запятых внутри результата).
    Работает быстрее за счёт отсутствия отката.
    Поведение предсказуемо и легко читается.
    Безопаснее при обработке больших или сложных строк.

Ленивый вариант .*? допустим в простых случаях, но менее оптимален и потенциально менее надёжен.
10 lirt82
 
13.02.26
13:31
(9) тоже вариант рабочий.
11 lEvGl
 
гуру
14.02.26
00:15
все как всегда упирается в стабильность структуры исходной строки, а если стабильно, то хоть сред хоть рег. А если нет, то полномочия все. НО, конкретно в этом случае для универсальности я бы сделал классификатор городов (а кто то уже постарался) и через него искал в строке, а то и наоборот
12 Волшебник
 
14.02.26
01:34
(11) Плохое решение. Давно уже сделан классификатор городов России
13 Ногаминебить
 
14.02.26
10:49
(11) Названия городов часто встречаются в названиях улиц, повторяются и пересекаются между собой. Придется накручивать много хитрых условий и универсальность уже будет так себе.
14 lEvGl
 
гуру
14.02.26
21:54
(13) если классификатор из названий городов, то проблем нет - Найти(Строка, Город) и все. Типовой посмотреть, что в нем есть
15 PR
 
14.02.26
21:57
(11) Действительно, Ростов и Ростов-на-Дону и все, уже пишите письма
Кроме того, 100 городов — 100 поисков?
К чему вообще вот это все, если есть (6)?
16 lEvGl
 
гуру
14.02.26
22:24
(15) он ростов Великий
прервать;
ладно ладно, но регулярные или перебор символов быстро валятся при изменении структуры исходной строки
17 VladZ
 
14.02.26
22:41
(0) Есть классификатор адресов и функции для работы с этим добром. Смотри туда.
18 lucky_
 
14.02.26
23:11
запятую не поставил-не работает.
скобку не поставил-не работает.
регулярка в этой задаче-это выстрел себе в ногу.
19 palsergeich
 
15.02.26
22:46
(18) Автоматизируя бардак - получится автоматизированный бардак и модуль на 100500 строк с Если Иначе (и насамом деле безумной стоимостью разработки и владения)
И придется внедрять средства нечеткого поиска, скорее всего на базе ИИчницы.
Только денег никто не даст как правило)
20 DrZombi
 
гуру
16.02.26
06:57
(5) А если две скобки? :)

Пример:
"Набор любых символов (100) и тут (Город,адреса)"
21 lirt82
 
26.02.26
09:34
а если это поле в запросе НаименованиеОфиса, как в запросе реализовать поиск города? с условием от первой скобки "(" и заканчивая первой запятой "," после этой скобки.
22 Fish
 
гуру
26.02.26
10:07
(14) Ага. И тогда в адресе "Санкт-Петербург, ул. Тамбовская" легко найдёшь город Тамбов :))))
23 1cVandal
 
26.02.26
10:11
(21) лучше ненадо
24 Garykom
 
гуру
26.02.26
10:11
Есть огромный класс задач которые кажутся простыми
Но фактические они нерешаемы
Когда хочется решений без ошибок и на любых исходных данных
25 Гипервизор
 
26.02.26
10:36
(0) Это поди представление из контактной информации? Так там составные части адреса уже в отдельных полях лежат, плюс json.
26 craxx
 
26.02.26
10:47
(25) видимо нет, это из старых баз КИ надо создать
27 1cVandal
 
26.02.26
11:18
есть сервис dadata разбора строковых адресов на составляющие, можно через него
28 spiller26
 
26.02.26
12:20
Ну свою лепту внесу.
А если будет город в области/крае, то что?
РФ, 119334, (Московская облась, Город-Там,  ул. Петрова, дом № 5, корпус 3, помещ. 2П, этаж 3)
29 CaptanG
 
гуру
26.02.26
13:03
(18) Город не указали не нашло совсем...Будем все возможные извращения искать? В ТЗ сказано шаблон строки строгий.
30 spiller26
 
26.02.26
13:41
(29) Вы не занете на что способны пользователи.
31 Garykom
 
гуру
26.02.26
13:45
(29) Шаблон может и строгий а вот адреса произвольные
32 Fish
 
гуру
26.02.26
13:46
(28) Всё. Это разрыв шаблона.
33 Fish
 
гуру
26.02.26
14:49
Кстати, в РФ есть города с одинаковыми названиями. Есть по 3 шт, есть и по 2.
34 Ногаминебить
 
26.02.26
15:18
(27) Да, он прикольный, хотя и платный. Но в свое время просто спас.
35 sergeev-ag-1977
 
27.02.26
05:21
А если не будет города? Не всегда же бывают именно города.
К примеру:
397920, Воронежская обл., Лискинский р-н, с. Залужное, ул. Центральная, дом ХХХ
36 CaptanG
 
гуру
27.02.26
12:20
(30) я как раз знаю на что способны пользователи. Поэтому считаю, что все их выкрутасы предусмотреть все равно невозможно.
37 CaptanG
 
гуру
27.02.26
12:21
(35) Видимо предполагается что филиалы только в городах.
38 CaptanG
 
гуру
27.02.26
12:30
(31) ну всех вариантов все равно не предусмотреть.
39 Fragster
 
гуру
27.02.26
16:08
прикрутите по апи БЯМ. ну или дадату.
40 Злопчинский
 
27.02.26
21:51
Работающий рецепт
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.