Имя: Пароль:
1C
1С v8
Выделить комиссию из строки
,
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
Вопрос от старого клюшечника. А чем
Комиссия = ТипЧисло.ПривестиЗначение(МассивСлов[Индекс+1]);  
отличается от
Комиссия = 0 + МассивСлов[Индекс+1]
?
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С написал.