Имя: Пароль:
1C
1С v8
Вытащить значения из строки
0 3achem
 
02.08.19
10:22
Доброе утро,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Всем спасибо!
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс