Имя: Пароль:
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" не проще было брать по одной цифре справа пока не встретится "не цифра"?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn