|
Выделить комиссию из строки | ☑ | ||
---|---|---|---|---|
0
БИР
09.12.18
✎
12:33
|
Уважаемые шаманы, подскажите, как можно написать код выделения комиссию по из строки. У банка после слово "комм" стоит комиссия, вот ее нужно вытянуть. Был у кого-то такой опыт? В каком направлении двигаться.
|
|||
1
БИР
09.12.18
✎
12:35
|
Нашла код на просторах интернета, но там тянет все цифры:
МассивЧисел = Новый Массив; СтрокаЧисел = ""; Для Индекс = 1 По СтрДлина(Строка) Цикл Символ = Сред(Строка, Индекс, 1); Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57 СтрокаЧисел = СтрокаЧисел + Символ; ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда МассивЧисел.Добавить(Число(СтрокаЧисел)); КонецЕсли; КонецЦикла; Возврат МассивЧисел |
|||
2
vde69
09.12.18
✎
12:36
|
(0) двигатся надо в направлении на север :)
спроси у банка есть-ли у них выгрузка в формате SWIFT там комиссию от платежа легко отделить... (в сбере такая выгрузка есть) |
|||
3
ReaLg
09.12.18
✎
12:51
|
1. Найти позицию «комм».
2. Обрезать строку по эту позицию. 3. Дальше приходится включать телепатический режим, т.к. примера строки нет, телепатирую, что в обрезной строке найти первый пробел и обрезать строку до него. Полученное превратить в число. |
|||
4
ReaLg
09.12.18
✎
12:55
|
Функция поиска Найти, обрезки - Лев, Прав, Сред.
|
|||
5
Конструктор1С
09.12.18
✎
13:04
|
Как строка выглядит?
|
|||
6
БИР
09.12.18
✎
13:09
|
(5) Эквайринг, по мерчанту 451 от 25.011.2018 операции 50 на сумму 5000 удержано ком 25,30 Возвр 0.00/0.00)
|
|||
7
runoff_runoff
09.12.18
✎
13:17
|
слишком просто, поэтому никто не отвечает..
|
|||
8
БИР
09.12.18
✎
13:21
|
(7) Для меня пока сложно
|
|||
9
Конструктор1С
09.12.18
✎
13:28
|
(6) код получится простенький
МассивСлов = СтрРазделить(МояСтрока, " ", Ложь); ТипЧисло = Новый ОписаниеТипов("Число"); Комиссия = 0; Для Индекс = 0 По МассивСлов.ВГраница() Цикл Слово = МассивСлов[Индекс]; Если НРег(Слово) = "ком" Тогда Комиссия = ТипЧисло.ПривестиЗначение(МассивСлов[Индекс+1]); Прервать; КонецЕсли; КонецЦикла; |
|||
10
БИР
09.12.18
✎
13:50
|
(9) Спасибо. Попробую.
|
|||
11
БИР
09.12.18
✎
14:11
|
(9) МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСекции.НазначениеПлатежа, " ", Ложь);
ТипЧисло = Новый ОписаниеТипов("Число"); Комиссия = 0; Для Индекс = 0 По МассивСлов.ВГраница() Цикл Слово = МассивСлов[Индекс]; Если НРег(Слово) = "ком" Тогда Комиссия = ТипЧисло.ПривестиЗначение(МассивСлов[Индекс+1]); Прервать; КонецЕсли; УстановитьСвойство(ОбъектДляЗаписи, Строка("_СуммаУслуги"), Комиссия); КонецЦикла; Что в этом коде не так? Не проставляется услуга в поле при записи документа. |
|||
12
Kigo_Kigo
09.12.18
✎
14:23
|
ТекстПоика = "Эквайринг, по мерчанту 451 от 25.011.2018 операции 50 на сумму 5000 удержано ком 25,30 Возвр 0.00/0.00)"
ПозицияСимвола = СтрНайти(СтрокаПоиска,"ком"); СуммаПоиска = Сред(СтрокаПоиска,ПозицияСимвола+4); ОкончаниеСуммы = СтрНайти(СуммаПоиска," "); СуммаПоиска = Число(СтраЗаменить(Сред(СуммаПоиска,ПозицияСимвола+4,ОкончаниеСуммы),",",".")); |
|||
13
Kigo_Kigo
09.12.18
✎
14:24
|
(12) Но это будет работать, если "ком" более нигде не встретится по этому я бы еще проверку вставил бы
|
|||
14
lEvGl
гуру
09.12.18
✎
14:30
|
да ну, это не серьезно, где гарантия, что строка всегда будет одного "формата", лучше поискать какие то выгрузки, которые формируются по определенным правилам.
а здесь даже в (0) написано "комм", а в примере уже "ком", да и потом в слове "коммерческий" тоже есть такие буквы и мало ли еще слов с таким сочетанием букв |
|||
15
БИР
09.12.18
✎
14:34
|
(14) я ошиблась со словом комм, правильно будет ком
|
|||
16
lEvGl
гуру
09.12.18
✎
14:38
|
(12) ну да ну да
а что +4, не +5 например (15) это не так важно, важно, чтобы строка состояла из фиксированного набора "блоков" и была разделена символом-разделителем а откуда эта строка, может из документа лучше взять или еще чего |
|||
17
Kigo_Kigo
09.12.18
✎
14:41
|
(16) потому что "ком" + пробел
я же сказал, что проверку бы еще сделал, что после идет слово "Возвр" к ппримеру, я так понимаю это уже фиксированное дополнение, но автор пусть сам решает и делает, мне чтоль за него все делать? |
|||
18
БИР
09.12.18
✎
14:42
|
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСекции.НазначениеПлатежа, " ", Ложь);
ТипЧисло = Новый ОписаниеТипов("Число"); Комиссия = 0; Для Индекс = 0 По МассивСлов.ВГраница() Цикл Слово = МассивСлов[Индекс]; Если НРег(Слово) = "ком" Тогда Комиссия = ТипЧисло.ПривестиЗначение(МассивСлов[Индекс+1]); УстановитьСвойство(ОбъектДляЗаписи, Строка("_СуммаУслуги"), Комиссия); Прервать; КонецЕсли; КонецЦикла; Вот этот код работает. Спасибо всем кто отвечал. А особое спасибо Конструктору1С. |
|||
19
lEvGl
гуру
09.12.18
✎
14:49
|
(12) ну это даже с чисто технической позиции работать вряд ли будет. найти - возвращает номер первого символа вхождения, сумма может занимать и 5 и 6 символов и т д и т д, тут много вариантов извращения, само виденье ТСом задачи - мягко говоря неверное
|
|||
20
БИР
09.12.18
✎
14:54
|
вот на слово "комиссия" это не сработало
|
|||
21
БИР
09.12.18
✎
14:54
|
у меня несколько банков и там есть слова"ком" и "комиссия"
|
|||
22
lEvGl
гуру
09.12.18
✎
14:56
|
как эти данные попадают в вашу базу?
|
|||
23
БИР
09.12.18
✎
14:57
|
(22) по строке назначение платежа
|
|||
24
lEvGl
гуру
09.12.18
✎
14:57
|
а строку откуда берете
|
|||
25
БИР
09.12.18
✎
14:58
|
(22) я сейчас дописываю обработку клиент-банка внешний отчет, и там при записи должно все это вытягиваться из назначение платежа
|
|||
26
БИР
09.12.18
✎
14:58
|
(24) из файла загрузки
|
|||
27
lEvGl
гуру
09.12.18
✎
15:06
|
когда я этого краем уха касался(около 10 лет назад), то были текстовые файлы, их формировали и отправляли в банк, принимали из банка и обрабатывали, были правила обмена с каждым банком, то есть один банк говорит "у меня файл формируется так:
в первой строке ваш номер счета + ИНН через табуляцию во второй строке сумма платежа + валюта через табуляцию и т д" другой говорит по-другому ну и в соответствии с этими правилами пишем код, который точно отработает, пока банк не изменит правила обмена)) тут еще в (2) сказали правильный вариант хотя это все лирика, вам сейчас не до правильности и надежности, надо что бы работало |
|||
28
lEvGl
гуру
09.12.18
✎
15:07
|
(26) да, вот он и файл загрузки, он формируется по определенным правилам, в соответствии с ними вам и надо разбирать текст, а не искать слово "ком" в строке
|
|||
29
lEvGl
гуру
09.12.18
✎
15:08
|
ну только если сумма комиссии не Только в этой строке содержится
|
|||
30
MishaD
09.12.18
✎
15:10
|
Вопрос от старого клюшечника. А чем
отличается от
? |
|||
31
lEvGl
гуру
09.12.18
✎
15:18
|
(30) хз что имеется ввиду, но при 0 + "10" сработает неявное преобразование "10" к 10 и если не будет исключения, то в результате будет 10. Привести явно в 8ке - Число(Массив[1])
|
|||
32
lEvGl
гуру
09.12.18
✎
15:20
|
или тут в чем то подвох?
|
|||
33
Конструктор1С
09.12.18
✎
15:24
|
(30) если в МассивСлов[Индекс+1] будет некорректная строка, то
ПривестиЗначение(МассивСлов[Индекс+1]) - вернёт 0 0 + МассивСлов[Индекс+1] - упадёт с ошибкой преобразования к числу (31) также небезопасно. Функция Число() переваривает только подходящие значения. Если попадёт туда некорректная (с точки зрения фукнции) строка, то код упадёт с ошибкой |
|||
34
lEvGl
гуру
09.12.18
✎
15:25
|
а, да ничем. результат будет тем же, если у ТипЧисло с размером и запятой все будет нормально. Собственно, такую конструкцию приведения "ТипЧисло.Привести" если и встречал то не запомнил, муторно что то. 0 + "10" тоже "дурной тон"
|
|||
35
lEvGl
гуру
09.12.18
✎
15:27
|
(33)"ПривестиЗначение(МассивСлов[Индекс+1]) - вернёт 0" - тоже насчет корректности можно поспорить)
|
|||
36
Конструктор1С
09.12.18
✎
15:27
|
(21) завернуть код в функцию. В качестве параметра передавать слово для поиска, "ком", "комиссия". Кстати, в том коде нужна дополнительная защита, если слово "ком" будет последним в строке, то получим ошибку "индекс находится за границами..."
|
|||
37
lEvGl
гуру
09.12.18
✎
15:30
|
например при расчете среднего значения из нескольких аргументов, набор которых формируется опять же из строки, то есть "нечисловая" строка будет участвовать как 0. Не всегда "надо любой ценой получить Число, хотя бы ноль"
|
|||
38
Конструктор1С
09.12.18
✎
15:32
|
(37) а если строка некорректная? Ожидается число, а там "с новым годом"?
|
|||
39
lEvGl
гуру
09.12.18
✎
15:34
|
да, будет грустно, поэтому пишут Если Найти("0123456789", ТекущийСимвол) перебирая посимвольно, где то как в (1)
|
|||
40
lEvGl
гуру
09.12.18
✎
15:36
|
а если есть "ожидания", то есть мы знаем что должно прийти число, то можно не переживать и писать Число()
|
|||
41
lEvGl
гуру
09.12.18
✎
15:37
|
а через ПривестиЗначение все строки будут нулями, что это за число такое получится
"1020вафля" будет числом 102000000, что не совсем мне кажется |
|||
42
lEvGl
гуру
09.12.18
✎
15:39
|
+ прокатит как цена вафли
|
|||
43
Kigo_Kigo
09.12.18
✎
15:47
|
(19) А зачем я прибавляю 4 к найденой позиции?и потом ищу пробел после цифры, вы наверно не в курсе, да?
|
|||
44
lEvGl
гуру
09.12.18
✎
15:52
|
ну так там 4 это для ком, для ком. будет 5, для комиссия будет 9 кажется, не считал
|
|||
45
lEvGl
гуру
09.12.18
✎
15:54
|
запятую можно не заменять, число() и запятую и точку принимает корректно
|
|||
46
lEvGl
гуру
09.12.18
✎
15:59
|
(43)кстати спасибо от ТС)
в приведенной строке разделитель есть - двойной пробел, что заметно упрощает процедуру РазобратьСтрокуВМассив(Строка, " ") |
|||
47
Kigo_Kigo
09.12.18
✎
16:02
|
(45) Были у меня траблы с этими запятыми, по этому перестраховываюсь
|
|||
48
БИР
10.12.18
✎
16:22
|
717.97, Дата выручки 06-12-18/M
у 7,844.60 удержано ком 123.41 Уважаемые, подскажите, как из этих двух строк вытянуть суммы 717.97 и 123.41. Эти строки обрезаны. Расположение знаков постоянно. Суммы могут быть разные. |
|||
49
Мыш
10.12.18
✎
16:28
|
(47) Делай анализ по шаблону. Пока цифра или один из возможных разделителей и нет двух разделителей подряд - значит это продолжается число.
|
|||
50
БИР
12.12.18
✎
17:09
|
всем привет. Почему из это кода тянется только сумма по слову ком, а по слову комиссия нет?
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСекции.НазначениеПлатежа, " ", Ложь); ТипЧисло = Новый ОписаниеТипов("Число"); Комиссия = 0; Для Индекс = 0 По МассивСлов.ВГраница() Цикл Слово = МассивСлов[Индекс]; Если НРег(Слово) = "ком" Тогда Комиссия = ТипЧисло.ПривестиЗначение(МассивСлов[Индекс+1]); |
|||
51
БИР
12.12.18
✎
17:10
|
Пожалуйста, очень надо.
|
|||
52
lxs
12.12.18
✎
17:11
|
(51)
... Если НРег(Слово) = "ком" или Если НРег(Слово) = "комиссия" Тогда ... |
|||
53
Numerus Mikhail
12.12.18
✎
17:17
|
Используй регулярки
|
|||
54
БИР
12.12.18
✎
17:19
|
(52) Не работает, со словом ком проставляет комиссию, а со словом комиссия-нет.
|
|||
55
БИР
12.12.18
✎
17:21
|
(53) я новичек, как понять регулярки?
|
|||
56
Numerus Mikhail
12.12.18
✎
17:25
|
||||
57
dezss
12.12.18
✎
17:30
|
(53) Регулярки - это хорошо, но зачем же так издеваться над новичками?
|
|||
58
БИР
12.12.18
✎
18:22
|
(56) неет, это пока не для меня
|
|||
59
БИР
12.12.18
✎
18:31
|
А по слову ком или комиссия можно вытягивать сумму из строки? Как это сделать???
|
|||
60
БИР
12.12.18
✎
18:34
|
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСекции.НазначениеПлатежа, " ", Ложь);
ТипЧисло = Новый ОписаниеТипов("Число"); услуга = 0; Для Индекс = 0 По МассивСлов.ВГраница() Цикл Слово = МассивСлов[Индекс]; Если НРег(Слово) = ("ком") ИЛИ НРег(Слово) = ("комиссия") Тогда услуга = ТипЧисло.ПривестиЗначение(МассивСлов[Индекс+1]); УстановитьСвойство(ОбъектДляЗаписи, Строка("_СуммаУслуги"), услуга); Прервать; КонецЕсли; КонецЦикла; Этот код тоже не захватывает комиссию по слову комиссия |
|||
61
SleepyHead
гуру
12.12.18
✎
18:37
|
(6) Это ж обычный КА на цифры, ты чего?
|
|||
62
БИР
12.12.18
✎
18:42
|
(61) ну вот не получается
|
|||
63
hhhh
12.12.18
✎
23:34
|
(62) во-первых
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСекции.НазначениеПлатежа, " ", Истина); похоже не чай вы там пьете. Это непостижимо просто туда Ложь впендюрить. |
|||
64
БИР
14.12.18
✎
19:16
|
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСекции.НазначениеПлатежа, " ", Истина);
МассивСлов = СтрНайти(СтрокаСекции.НазначениеПлатежа, "ком", " "); ТипЧисло = Новый ОписаниеТипов("Число"); услуга = 0; Для Индекс = 0 По МассивСлов.ВГраница() Цикл Слово = МассивСлов[Индекс]; Если НРег(Слово) = "ком" ИЛИ НРег(Слово) = "комиссия" Тогда услуга = ТипЧисло.ПривестиЗначение(МассивСлов[Индекс+1]); УстановитьСвойство(ОбъектДляЗаписи, "Комментарий", услуга); Прервать; КонецЕсли; КонецЦикла; берет комиссию по слову ком, и не берет по слову комиссия. |
|||
65
БИР
15.12.18
✎
08:30
|
МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаСекции.НазначениеПлатежа, " ", истина);
ТипЧисло = Новый ОписаниеТипов("Число"); Для Индекс = 0 По МассивСлов.ВГраница() Цикл Слово = МассивСлов[Индекс]; Если СтрНайти(Слово, "ком") Тогда услуга = 0 + ТипЧисло.ПривестиЗначение(МассивСлов[Индекс+1]); УстановитьСвойство(ОбъектДляЗаписи, "Комментарий", услуга); Прервать; КонецЕсли; КонецЦикла; Что в этом коде не так, опять комиссию со словом ком находит, а со словом комиссия возвращает 0. |
|||
66
Мимохожий Однако
15.12.18
✎
09:48
|
Сначала ищи по "комиссия", а если не нашла то ищи по "ком "(с пробелом).
Но сам по себе подход неверный. ИМХО. Верное направление в (2) |
|||
67
hhhh
15.12.18
✎
10:21
|
(65) Если СтрНайти(Слово, "ком") > 0 Тогда
|
|||
68
hhhh
15.12.18
✎
10:27
|
СтрНайти(НРег(Слово), "комиссия")
|
|||
69
Конструктор1С
15.12.18
✎
13:48
|
(66) подход вполне себе нормальный, если позволяет решить задачу в полной мере. Когда-то имел дело с одной "правильной" конторой. Там могли два месяца утверждать форму отчета для 1С, чтобы потом 1Сник этот отчет за два часа на той самой 1С написал.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |