Имя: Пароль:
1C
1С v8
Работа со строкой
,
0 DEaD_EGOR
 
27.05.16
17:05
Народ, докатился до того, что не могу решить простую задачку, помогите плз. БП 2,0. Имеется в отчёте "кассовая книга" номера РКО и ПКО в формате Префикс (2 или 4 буквы) + ноли + собсна номер . всего 11 символов...
Задача проста. Написать функцию, отсекающую все символы слева, оставляющую номер в чистом виде... Прошу помощи))
1 Nuobu
 
27.05.16
17:07
ПолучитьНомерНаПечать?
2 Волшебник
 
модератор
27.05.16
17:07
Число(Сред(стр,2))
3 DEaD_EGOR
 
27.05.16
17:08
(1) она не срабатывает по какой то причине. я хотел просто дописать маленькую функцию

(2) а номер если больше 2х символов будет?
4 Nuobu
 
27.05.16
17:10
(3) Число(Сред(стр,3))
5 Nuobu
 
27.05.16
17:19
(3) Функция ПолучитьНомерБезПрефиксовИНулей(НомерСПрефиксамиИНулями)
Пока СтрДлина(НомерСПрефиксамиИНулями) > 0 Цикл

НомерСПрефиксамиИНулями = Сред(НомерСПрефиксамиИНулями, 1);

Попытка
НомерБезПрефиксовИНулей = Число(НомерСПрефиксамиИНулями);
Прервать;
Исключение
НомерБезПрефиксовИНулей = 0;
Продолжить;
КонецПопытки;
КонецЦикла;

возврат НомерБезПрефиксовИНулей;

КонецФункции
6 Волшебник
 
модератор
27.05.16
17:21
7 Fram
 
27.05.16
17:24
(5) а это зачем?
НомерБезПрефиксовИНулей = 0;
8 Fram
 
27.05.16
17:25
+(7) мне кажется это перед циклом надо было прописать
9 Nuobu
 
27.05.16
17:26
(7) Не подумал, тысяча извинений. Всё остальное норм? Нравится?
10 DEaD_EGOR
 
27.05.16
17:26
(5) а буквенный префикс тоже тут уберётся?
11 Nuobu
 
27.05.16
17:29
(10) Префикс, как таковой, только буквенный и бывает.
12 DEaD_EGOR
 
27.05.16
17:31
(11) не так написал. префикс тоже должен убраться? просто я попробовал, начал ругаться на Число...
13 Nuobu
 
27.05.16
17:32
(12) Потому что ты не поместил в "попытку".
14 DEaD_EGOR
 
27.05.16
17:33
(13)что именно не поместил в Попытку?
15 Nuobu
 
27.05.16
17:33
(14) Преобразование к типу "Число".
16 DEaD_EGOR
 
27.05.16
17:36
(15) Функция ПолучитьНомерНаПечать(НомерСПрефиксамиИНулями)
        
        НомерБезПрефиксовИНулей = 0;
        
        Пока СтрДлина(НомерСПрефиксамиИНулями) > 0 Цикл
            
            НомерСПрефиксамиИНулями = Сред(НомерСПрефиксамиИНулями, 1);
            
            Попытка
                НомерБезПрефиксовИНулей = Число(НомерСПрефиксамиИНулями);
                Прервать;
            Исключение
                Продолжить;
            КонецПопытки;
        КонецЦикла;
        
        возврат НомерБезПрефиксовИНулей;
        
    КонецФункции

Преобразование значения к типу Число не может быть выполнено
17 Nuobu
 
27.05.16
17:38
(16) Ты отладкой смотришь?
18 DEaD_EGOR
 
27.05.16
17:39
(17) да. я помоему неправильно её вызываю...
19 Nuobu
 
27.05.16
17:40
(18) Забей на отладку.
20 DEaD_EGOR
 
27.05.16
17:40
(18) хотя нет, правильно..
21 DEaD_EGOR
 
27.05.16
17:41
(19) если забиваю на отладку, вешается кассовая книга наглухо
22 DEaD_EGOR
 
27.05.16
17:45
(19) как я понял, он ругается, что в номере есть буквы, а они числом не являются
23 Zhuravlik
 
27.05.16
17:49
(0) Удалить первые символы не встречающиеся в строке 0987654321, все что осталось - преобразовать к числу. Если  вас только бухи не любят баловаться заменой "0" на "O".
24 Zhuravlik
 
27.05.16
17:51
Слово = "";
ДлинаСтроки = СтрДлина(НомерДок);
Для сч = 1 По ДлинаСтроки Цикл

сим = сред(НомерДок, сч, 1);

Если Найти("0987654321", сим) > 0 Тогда
Слово = Слово + сим;
КонецЕсли;

КонецЦикла;

Попытка
НомерЧислом = Число(Слово);
Исключение
НомерЧислом = 0;
КонецПопытки

Возврат НомерЧислом


Как-то так
25 DEaD_EGOR
 
27.05.16
17:52
(23)я пробовал вот так
ГотоваяСтрока = "";
КоличествоСимволов = СтрДлинна (Номер);

Для НомерСимвола=1 ПО КоличествоСимволов Цикл
мКод = КодСимвола (Сред (Номер,  НомерСимвола,1);
Если мКод< 57 Или мКод> 49 Тогда

ГотоваяСтрока=ГотоваяСтрока+Сред (Номер,  НомерСимвола,1);
Конецесли;
КонецЦикла;
Возврат ГотоваяСтрока;
26 Zhuravlik
 
27.05.16
17:54
(25) Тогда по идее осталось

Попытка
НомерЧислом = Число(ГотоваяСтрока);
Исключение
НомерЧислом = 0;
КонецПопытки

Возврат НомерЧислом


Чтоб нули убрать, и заодно проверить что в самом номере нет букв.
27 Garykom
 
гуру
27.05.16
17:57
Возьми вместо ваяния своего лисапеда готовую обработку по сверке.
28 DEaD_EGOR
 
27.05.16
18:00
(27) какую? Получитьномернапечать ?
29 Garykom
 
гуру
27.05.16
18:06
(28) Ты понимаешь что не возможно выделить не зная длину префикса "числовой номер" из значений "ДЯ100000000" и "ДУБЫ1000000"?
30 Garykom
 
гуру
27.05.16
18:08
(29)+ если префикс 2 символа то Результат = Число(Прав(Строка, 9)), а если префикс 4 символа то Результат = Число(Прав(Строка, 7))

И все
31 Garykom
 
гуру
27.05.16
18:09
(29)+ Чтобы было понятнее выдели номер из "ДЯ1Д0000001"
32 Fram
 
27.05.16
18:40
В (16) рабочий код. Что не так?
33 hhhh
 
27.05.16
22:56
(26) можно ведь без попыток убрать нули слева. Что за дикость писать попытку по поводу и без повода.
34 Wern
 
27.05.16
23:38
(33) А почему бы не писать попытку? У тебя фобия на попытки?
35 alle68
 
28.05.16
04:30
(32) Вечный цикл... И "Знач" у параметра не хватает.
(34) Использовать попытки без необходимости - плодить ГК.
А верный подход в (30), т.к. префикс может и из цифр состоять.
36 hhhh
 
28.05.16
06:26
(34) это в десятки раз медленнее, чем просто найти первый не ноль. И лишнее преобразование. Он делает из строки число, а потом опять из числа строку.
37 DEaD_EGOR
 
30.05.16
17:27
сделал вот так
    Функция ПолучитьНомерНаПечать(Номер)
        
        ГотоваяСтрока = "";
        КоличествоСимволов = СтрДлина (Номер);
        Индекс = 0;
        
        Для Индекс=1 ПО КоличествоСимволов Цикл
            текСимвол = КодСимвола(номер, индекс);
            Если текСимвол< 58 и текСимвол> 48 Тогда
                Прервать;                
            Конецесли;
        КонецЦикла;
        
        ГотоваяСтрока = Прав(номер, КоличествоСимволов - индекс +1);
        Возврат ГотоваяСтрока;
        
    КонецФункции


всё заработало. Даже если номер имеет формат АА10Б0000321, на выходе получаем 321. Всем спасибо за помощь)
38 Nuobu
 
30.05.16
17:30
Даже если номер имеет формат АА10Б0000321, на выходе получаем 321. Всем спасибо за помощь)

А Если номер имеет формат:

АА10Б0055321, то всё равно получим "321"))
39 DEaD_EGOR
 
30.05.16
17:38
(38) почему?
40 DEaD_EGOR
 
30.05.16
17:42
(38) я сейчас проверял, у меня есть разные номера: 2 цифры после нулей, 4 цифры после нулей.. всё распознаёт ...
41 Nuobu
 
30.05.16
17:46
42 DEaD_EGOR
 
30.05.16
17:56
(41) не, это уже другое. мне требовалось оставить все цифры после нулей. потому я и справа собираю... в префикс цифры не попадают
43 Garykom
 
гуру
30.05.16
22:36
(42) Если нужны "все цифры после 0" не проще было брать по одной цифре справа пока не встретится "не цифра"?