Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вытащить значения из строки

Вытащить значения из строки
Я
   3achem
 
02.08.19 - 10:22
Доброе утро,

Естьзадача над механизмом которой я думаю несколько дней, а именно
Существует сервис, который передаёт строки следующего вида:

Комиссия за реализацию товара от 21.05.2019 склад Центральный склад Москва по счету 152356
Комиссия за реализацию товара от 23.05.2019 склад Склад-1 Подольск по счету 124543

Маска такая:
Комиссия за реализацию товара от %Дата% склад %НаименованиеСклада% %Город% по счету %НомерСчета%

Задача вытащить эти реквизиты (Дата, НаименованиеСклада, Город, НомерСчета) из строки.
Всё было бы просто, если бы не сдвоенные реквизиты, а так же то, что изначально в 1С значения реквизита может не быть.

Как красиво решить эту задачу?

Я думал над справочником шаблонов в котором будет маска (как я написал выше) и ТЗ с параметрами, но дальше не продвинулся. Может в типовой есть где-то пример подобного? Сам я вспомнить не смог
 
 
   Cyberhawk
 
1 - 02.08.19 - 10:23
РазложитьСтрокуВМассивПодстрок с любым разделителем
   Cyberhawk
 
2 - 02.08.19 - 10:23
Вкупе с ПервоеВхождение... решается элементарно
   АгентБезопаснойНацио
 
3 - 02.08.19 - 10:34
(2) не совсем элементарно надо разобрать неизвестное количество слов  в группе НаименованиеСклада-Город.
и наименование склада, и город могут быть из нескольких слов.
причем и в названии склада, и в городе слова могут повторяться. типа "первый консигнационный склад нижний новгород нижний новгород"
но и это решается ведением списка городов.
   Cyberhawk
 
4 - 02.08.19 - 10:37
(3) В общем случае конечно можно все что угодно придумать, что сломает. Но может у чувака в названиях складов нет городов, либо в него всегда слово содержащее "склад" это последнее в названии склада
   3achem
 
5 - 02.08.19 - 10:38
(3) Да, предполагается где-то отдельно хранить города и склады, как раз из-за этой ситуации. Вопрос по механизму остаётся открытым, если это регистр, то в запросе подставлять значение и сравнивать с переданной строкой?
Где лучше и удобнее будет хранить информацию такого рода?

(1) (2) Об этом я подумал, но данные надо будет отфильтровать вручную.

(4) Изначальное значение параметра для 1С неизвестно
   ДядяМитяй
 
6 - 02.08.19 - 11:02
Если есть доступ к правилам формирования входящей строки задача решается просто. Если нет или вообще нет таких правил (баба Маша пишет от руки все, что вздумается) - задача не решается совсем (разве что с помощью ИИ).
   3achem
 
7 - 02.08.19 - 11:07
(6) Правила есть, маска, которую я написал, от руки ничего не заполняется. То есть известно как будет выглядеть строка, но неизвестен список параметров (его нужно как-то копить в 1С)
   Кирпич
 
8 - 02.08.19 - 11:27
(0) Вообще, это задача для регулярных выражений. А так, будь мужиком, потрать полчаса на маленькую функцию. Используй СтрНайти("от ") СтрНайти("склад ") СтрНайти("по счету ")
   ДядяМитяй
 
9 - 02.08.19 - 11:27
а есть возможность изменить маску? надо добавить разделитель между следующими подряд параметрами (например / ) и все упростится
   SpitfireIX
 
10 - 02.08.19 - 12:07
Я решал через регулярные выражения. Смысл в том, что между словами всегда есть якоря типа "товара от %Дата% склад". В случае с "склад %НаименованиеСклада% %Город% по счету", ищется слово "по счету" и слово от 2х пробелов назад до слова по счету считается городом.

Если интересно, то могу попробовать найти регулярку, ближе к вечеру.
   SpitfireIX
 
11 - 02.08.19 - 12:08
А, сори, тупанул, там жеж еще склад, тоже может быть с пробелом.
   AlvlSpb
 
12 - 02.08.19 - 12:13
(0) Какого реквизита может не быть? Судя по строке, запись или есть и в полном объеме или ее е существует
   3achem
 
13 - 02.08.19 - 12:17
(9) Изменить маску возможности нет, я подумал о чтении строки в обратном порядке и есть идея с перебором уже записанных значений

(12) Здесь имеется в виду, что может придти название склада, которого в 1С нет (то есть его надо будет создать, для этого и идёт сбор параметров)
Если бы весь список значений параметров был бы известен, то задача решалась бы намного проще (без ручного вмешательства)
   Консультант Баранов
 
14 - 02.08.19 - 12:21
(0) > Существует сервис, который передаёт строки следующего вида:

1. А нельзя у сервиса попросить выгружать

Комиссия за реализацию товара от 21.05.2019 склад Центральный склад город-герой Москва по счету 152356 

2. Второе слово у склада наверняка будет со строчной буквы. Считать начало города с первого слова после склада с Заглавной буквы.
   AlvlSpb
 
15 - 02.08.19 - 12:24
(13) Я бы попытался сделать комбинацией из средств языка 1С и регулярки.
1. Отсекаем известное и не нужное "Комиссия за реализацию товара от "
2. После этого Дата вычленяется легко Лев строка и кол-во знаков
3. Регуляркой ищем вхождение заглавных букв, если 2, то есть и склад и город
4. Найти позицию каждой заглавной. С первой позиции до второй - склад, со второй до "по счету" город
5. номер счета тоже просто выделяется
   vova1122
 
16 - 02.08.19 - 12:37
(15) Поправка.
1. Отсечь "Комиссия за реализацию товара от "
2. Найти "по счету" и все что после него -это номер счета
3. Взять левое от найденой позиции "номер счета"
4. Теперь нам остается в строкн только Склад Город
5. Город всегда одно слово справа (или может быть исключения?)
6. Остальное - название склада
   unregistered
 
17 - 02.08.19 - 12:38
Не совсем понял в чем проблема.

Комиссия за реализацию товара от %Дата% склад %НаименованиеСклада% %Город% по счету %НомерСчета%.

Дата - вычисляется легко - 10 знаков после "Комиссия за реализацию товара от ".
Счет - символы от последнего пробела и до конца строки.
НаименованиеСклада и Город - самая сложная часть.
Сначала получаем эту часть целиком, которая находится между первым вхождением слова "склад" и словосочетанием "по счету".
Потом пытаемся откусить Город. Это одно или два (Нижний Новгород, Великий Новгород) последних слова.
Оставшееся - это Склад. И плевать - есть там в этой стоке город или нет.
   unregistered
 
18 - 02.08.19 - 12:40
(16) >> Город всегда одно слово справа (или может быть исключения?).

Бывают исключения ))))
Великий Новгород, Нижний Новгород, New Васюки,...
Городов, состоящих из нескольких слов дофига.
   vova1122
 
19 - 02.08.19 - 12:42
(18) вот тут маленькая засада с городами. Хотя можно сделать список таких городов
   unregistered
 
20 - 02.08.19 - 12:44
Список городов можно взять в базе КЛАДРа (не помню как он там сейчас называется по-модному).
   SpitfireIX
 
21 - 02.08.19 - 13:10
А %Склад% - это наименование склада из этой базы? Если да, то если предположить что склады в базе всегда есть, то можно взять пару "%Город% %Склад%", найти ссылку на склад, и потом удалить из строки его наименование, а все что осталось - это уже город.
   3achem
 
22 - 02.08.19 - 13:25
(21) Склада может не быть в базе и нужно будет его создать

(15) (16) (17)  Остановился на таком варианте

А теперь усложним задачу - механизм должен быть универсальный под несколько масок
   АгентБезопаснойНацио
 
23 - 02.08.19 - 13:51
(14) разделять ";" (хотя бы склад и город), или писать слово "город" -  и все сводится к элементарщине.
(17) ага, именно так.
   vova1122
 
24 - 02.08.19 - 14:11
(22) полнотю универсальным никогда не сделаете. Ну а если известны все маски то определить по какой именно из этих масок создана строка не составит труда - тупо проверить на известные слова в строке в нужном порядке следования
   3achem
 
25 - 03.08.19 - 17:42
(24) (23) Я сделал, для полной универсальности не реализовал ситуацию, когда среди любого количества [1..n] параметров в подряд, есть то, которое не обращается к поиску в таблицах (регистрах и т.д.). Но над этим подумаю в понедельник.

Всем спасибо!


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