Простой способ убрать префикс и лидирующие нули из номера.

22.06.16

Разработка - Универсальные функции

Статья в которой описан, простой способ убрать префикс и лидирующие нули из номера документа.

Скачать файлы

Наименование Файл Версия Размер
УбратьПрефиксИЛидирующиеНулиИзНомера
.epf 5,97Kb
26
.epf 1 5,97Kb 26 Скачать

Часто возникает необходимость вывести в печатную форму номер документа без префикса и лидирующих нулей.

Для этого можно воспользоватся маленькой обработкой прикрепленной к статьи или использовать ниже приведенный код.

Процедура ОбработатьНомерДокумента()

       НомерБезПрефикса Объект.ВходящийНомер;
       Пока Найти(НомерБезПрефикса,"0") <> 1 Цикл
               НомерБезПрефикса = Сред(НомерБезПрефикса,2); //удаляет лидирующие ненули
       КонецЦикла;

       НомерБезНулей = НомерБезПрефикса;
       Пока Найти(НомерБезНулей,"0") = 1 Цикл
                НомерБезНулей = Сред(НомерБезНулей,2); //удаляет лидирующие нули
       КонецЦикла;
       Объект.ОбработанныйНомер = НомерБезНулей;

КонецПроцедуры

 

Печать Префикс Лидирующие

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2665    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4598    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3956    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8807    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16141    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7242    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. aleksey2 86 22.06.16 21:09 Сейчас в теме
2. Yashazz 4709 23.06.16 00:37 Сейчас в теме
Забавно. Буквально вчера решал эту общеизвестную задачку и думал, как бы поэффективнее. Способ замен, конечно, тоже рассматривал, но... Автор, простите, а если номер "00012034", что будет? Верно, лажа будет. Вот если использовать Лев(,1) и Прав(,1) или новомодные СтрНачинаетсяС и СтрЗаканчиваетсяНа, тогда ещё куда ни шло. А так явный минус.

Ну и вообще, кажется мне, что не самый это изящный и быстрый способ.
elga2012; optnpk; klinval; ardn; shalimski; +5 Ответить
5. bad_boys 16 23.06.16 10:16 Сейчас в теме
(2) Yashazz, функции СтрНачинаетсяС и СтрЗаканчиваетсяНа не на всех релизах конфигурации работают...
Если номер документа "00012034" после обработки станет "12034", что вполне корректно..
13. Yashazz 4709 23.06.16 19:38 Сейчас в теме
(5) не релизах конфигурации, а релизах платформы. Не ниже 8.3.7, ну я и написал, что "новомодные")

Хожу второй день и пытаюсь решить задачу в духе работ Ильдаровича. Чтобы стильно и извратно)))
graphbuh; +1 Ответить
15. v3rter 24.06.16 09:36 Сейчас в теме
(13) Yashazz, Подкину для вдохновения https://meduza.io/shapito/2016/06/21/politehnicheskiy-muzey-nauchilsya-svorachivat-artema-chayku-v-lsdu3 , политота, конечно, но алгоритм многообещающий )
3. alex-l19041 8 23.06.16 09:44 Сейчас в теме
а зачем изобретать "велосипед", если можно вызвать готовую функцию общего модуля ОбщегоНазначения.ПолучитьНомерНаПечать(документ);
bondaleksey; SuhoffGV; Котяня; criptid; KDZorkov; intelligentvadik; zoikins; unduty; wolfsoft; Eillecho; user598655_ilia-bers; timurkhann; TManukovskaya; temdj; mark_oilbass; synelf; BIT_vnedr; vadimlp77; vovan_victory; eksdak; +20 Ответить
4. bad_boys 16 23.06.16 10:14 Сейчас в теме
(3) alex-l19041, ОбщегоНазначения.ПолучитьНомерНаПечать(документ) удаляет только ПрефиксПодразделения или ПрефиксИнформационнойБазы... Если вручную бухгалтер поменял префикс на какой захотел, он не удалится стандартной функцией.
44. NoRazum 29 16.11.21 16:53 Сейчас в теме
(4) ОбщегоНазначения.ПолучитьНомерНаПечать если её вызывать в цикле и много документов, то она очень медленно работает.
6. c300pm 23.06.16 10:57 Сейчас в теме
в БП 3.0 с нумерацией типа ААББ-000001 корректно работает?
7. bad_boys 16 23.06.16 11:02 Сейчас в теме
(6) c300pm, не могу сказать не проверял на БП 3.0...
Тем не менее была просьба доработать такой механизм для печати, поскольку стандартный не отрабатывал...
Какая конфигурация и какой релиз уже не помню...
Мой способ не является эталоном, но как мне кажется имеет право на жизнь))
8. 1С_Мастер 61 23.06.16 11:07 Сейчас в теме
Очевидно, что это вариант не сработает с номером АА-123, так как в нем ни одного нуля нет. Или, например, с номером АА-101 сработает неверно, оставив от него только 1
Alex17; klinval; +2 Ответить
10. bad_boys 16 23.06.16 11:17 Сейчас в теме
(8) 1С_Мастер, да на Ваших примерах работать не будет(((
9. v3rter 23.06.16 11:11 Сейчас в теме
Думаю, более правильно будет просматривать посимвольно справа налево до первой не цифры, затем полученную подстроку чистить от ведущих нулей, например так Строка(Число("0"+ПромежуточнаяПодстрока))
bad_boys; +1 Ответить
11. bad_boys 16 23.06.16 11:18 Сейчас в теме
(9) v3rter, согласен Ваш вариант более коректный чем мой....
48. vik2006 137 14.06.23 08:13 Сейчас в теме
(11) вставить в конце цикла условие, и приращение счетчика. Условие - длина номера. а так оно будет зацикливать, если нет нулей
12. v3rter 23.06.16 11:25 Сейчас в теме
Хотя есть альтернативный способ - выкинуть из номера все нецифровые символы, затем ведущие нули. Недостаток: кривые номера типа Н1АБ0000021 превратятся в 10000021, а не в 21. Такие "чудо-номера" бывают от кривых префиксов при обмене.
14. Yashazz 4709 24.06.16 09:29 Сейчас в теме
Если исходить из того, что все нецифровые префиксы уже отброшены, то самое топорное решение это Формат(Число(Номер)).
16. Ovrfox 14 24.06.16 09:48 Сейчас в теме
Вот простой код, который сработает, если номер содержит число.
Функция ТолькоНомер(ВхНомер)
	Рез = СокрЛП(ВхНомер);
	Ном = СтрДлина(Рез);
	Пока Ном > 0 Цикл
		Если Найти("0123456789", Сред(Рез,Ном,1))=0 Тогда
			прервать;
		Иначе
			Ном = Ном - 1;
		КонецЕсли; 
	КонецЦикла; 
	Возврат ""+Число(Сред(Рез,Ном+1));
КонецФункции
Показать
maksa2005; +1 Ответить
19. v3rter 24.06.16 12:51 Сейчас в теме
Как всегда шедевры. Математики поймут )

Попробую расшифровать для тех, кому лень разбираться.

Первая функция: рекурсивно проверяются символы справа налево до первой не цифры,
затем происходит возврат правой части строки по накопленному значению К;
( КодСимвола() / 5 - 10.5 ) возвращает значение от -0,9 до 0,9 для символов с "0" до "9",
Цел() отсекает дробную часть, в результате для цифр получится 0, для остальных символов не ноль;
?(Цел(КодСимвола(Прав("!" + Стр, К + 1)) / 5 - 10.5),<не цифра>,<цифра>) базируется на особенности преобразования нуля в булево ложь, а "!" + Стр - подстраховка от пустой строки на входе.

Вторая функция: все числа заменяются пробелами "матрёшкой" вложенных функций
СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Номер
, "0", " "), "1", " "), "2", " "), "3", " "), "4", " "), "5", " "), "6", " "), "7", " "), "8", " "), "9", " ")
СокрП отсекает пробелы справа, остаток замереятся через СтрДлина и вырезается часть с середины до конца с позиции +1, где должны начинаться цифры.

Формат( , "ЧГ=") в обоих случаях убирает разделители разрядов при обратном преобразовании числа в текст, потом что через Строка() "формируется ... полное представление в стандартном виде, соответствующем национальным установкам". Или как у Ovrfox в (16) вместо Формат(, "ЧГ=") можно попробовать неявное преобразование в строку ""+Число(
Ovrfox; region.eburg; +2 Ответить
17. likelol.91 24.06.16 09:49 Сейчас в теме
у меня во всех базах так:
Формат(Число(Прав(Номер,7)),"ЧГ=0")
user2007341; user1577131; criptid; inems; Bessondo; Igorro82IT; Олег Ящеров; +7 Ответить
18. ildarovich 7850 24.06.16 11:54 Сейчас в теме
Вот еще варианты:
Функция ЧислоСправа(Стр, К = 0)
	Возврат ?(Цел(КодСимвола(Прав("!" + Стр, К + 1)) / 5 - 10.5), Формат(Число("0" + Прав(Стр, К)), "ЧГ="), ЧислоСправа(Стр, К + 1))
КонецФункции

Функция ЧислоСправа1(Номер)
	Возврат Формат(Число("0" + Сред(Номер, СтрДлина(СокрП(
	СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Номер
	, "0", " "), "1", " "), "2", " "), "3", " "), "4", " "), "5", " "), "6", " "), "7", " "), "8", " "), "9", " "))) + 1)), "ЧГ=")
КонецФункции
user1119853; dgolovanov; bad_boys; region.eburg; v3rter; +5 1 Ответить
22. m..adm 255 29.06.16 15:17 Сейчас в теме
(18) ildarovich, Код должен быть читабелен, чтобы не ломать голову в рекурсиях.
20. NoMax 232 27.06.16 00:12 Сейчас в теме
21. v3rter 27.06.16 09:15 Сейчас в теме
(20) NoMax,
Было еще на клюшках http://infostart.ru/public/57242/

Было, да сплыло - нет больше этой ссылки. И вот что там было:
Функция ClearZero(PERNR)  экспорт
Воз = PERNR;
апр=СтрДлина(Воз);
Для АНК = 1 По апр Цикл
аст = Сред(Воз, АНК);
Если Лев(аст, 1) <> "0" Тогда
Воз = Сред(Воз, АНК );
Возврат Воз;
КонецЕсли;
КонецЦикла;
КонецФункции
//В модуле формы ищем поля для которых нужно применить функцию.
//К примеру нужно чтобы поле  НомерДокумента = Докум.НомерДок; печаталось без нулей,
//заменяем на   НомерДокумента = ClearZero(Докум.НомерДок);
Показать

То есть убираются только ведущие нули, на номерах с префиксами не сработает.
23. m..adm 255 29.06.16 15:52 Сейчас в теме
я бы так отсеивал лишние нули
	НовыйНомер = "";
	Начнем = Ложь;
	Для Ном = 1 По СтрДлина(Номер) Цикл
		тКод 	 = КодСимвола(Номер,Ном);
		ЭтоЧисло = тКод > 47 И тКод < 58; //цифры от 0 до 9
		Начнем 	 = Начнем ИЛИ ЭтоЧисло И НЕ тКод = 48;
		Если Начнем И ЭтоЧисло Тогда 
			НовыйНомер = НовыйНомер + Сред(Номер,Ном,1);
		КонецЕсли;
	КонецЦикла;
Показать
v3rter; bad_boys; +2 Ответить
24. v3rter 29.06.16 17:16 Сейчас в теме
(23) m..adm, Кстати, это способ, упомянутый в (12), в целом годный, хороший с единственным недостатком
кривые номера типа Н1АБ0000021 превратятся в 10000021, а не в 21
40. mounter 21.08.20 13:27 Сейчас в теме
Доработал (23). Удаляет любые префиксы перебором справа-налево до первого не числового символа. Мне нужно было для передачи на внешний веб-сервис, а префиксов в базе не типовых полно. Встроенные процедуры не справляются. Возвращает строку без разделителей разрядов и ведущих нулей.
Функция ОбработатьНомерДокумента(ВхНомер)

    Номер = ВхНомер ;   
    НовыйНомер = "";
    СтрДлина=СтрДлина(Номер);
    Для Ном = 0 По СтрДлина-1 Цикл
        тКод      = КодСимвола(Номер, СтрДлина - Ном);
        ЭтоЧисло = тКод > 47 И тКод < 58; //цифры от 0 до 9
        Если ЭтоЧисло Тогда 
            НовыйНомер = Сред(Номер,СтрДлина - Ном,1) + НовыйНомер; 
        Иначе
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Возврат СтрЗаменить(Формат(Число(НовыйНомер),"ЧРГ='-'"),"-","");
	
КонецФункции
Показать
25. vadim1011985 99 29.06.16 17:45 Сейчас в теме
Решил и я предложить свой вариант

Процедура Команда1(Команда)
	
	НомерНаПечать = ПолучитьНомерНаПечать(Объект.Номер);
	
	Объект.Номер = НомерНаПечать;
	
КонецПроцедуры

Функция ПолучитьНомерНаПечать (Номер) 
	
	Пока СтрДлина(Номер)>0 Цикл 
		
		Попытка 
			
			НомерНаПечать = Строка(Число(Номер));
			
			Возврат НомерНаПечать;
			
		Исключение
			//Если СтрДлина > 0 Тогда
			Номер = Прав(номер,СтрДлина(Номер)-1);
                      //  Иначе
                     //   Возврат 0;
                    //    конецЕсли; 
	
	      //  Продолжить;
			
		КонецПопытки;	
			
		КонецЦикла;

Возврат  "";
		
КонецФункции
Показать
26. v3rter 30.06.16 09:50 Сейчас в теме
(25) vadim1011985, тоже хороший способ. На случай кривых номеров я бы сделал Возврат "________"; чтобы была возможность вписать номер вручную не перепечатывая документ повторно.
27. Ovrfox 14 30.06.16 10:48 Сейчас в теме
(25) Вы меня мзвините, но этот код не годится.
Пример Номер А24.0000147. Правильно вернуть 147, а не 24.0000147
28. vadim1011985 99 30.06.16 11:10 Сейчас в теме
(27) Ovrfox, согласен, есть такое , но опять же можно использовать функцию СтрЗаменить где поменять точки и запятые на какой-нибудь символ. А вообще можно придумать такой пример который с предельной функцией не будет работать

Процедура Команда1(Команда)
    
    НомерНаПечать = ПолучитьНомерНаПечать(Объект.Номер);
    
    Объект.Номер = НомерНаПечать;
    
КонецПроцедуры

Функция ПолучитьНомерНаПечать (Номер) 
    
Номер = СтрЗаменить(Номер,".","@");
Номер = СтрЗаменить(Номер,",","@");

 

    Пока СтрДлина(Номер)>0 Цикл 
        
        Попытка 
            
            НомерНаПечать = Строка(Число(Номер));
            
            Возврат НомерНаПечать;
            
        Исключение
            //Если СтрДлина > 0 Тогда
            Номер = Прав(номер,СтрДлина(Номер)-1);
                      //  Иначе
                     //   Возврат 0;
                    //    конецЕсли; 
    
          //  Продолжить;
            
        КонецПопытки;    
            
        КонецЦикла;

Возврат  "______________";
        
КонецФункции
Показать
29. v3rter 30.06.16 11:40 Сейчас в теме
(27) Ovrfox, а так?
НомерНаПечать = Строка(Цел(Число(Номер)));
30. vadim1011985 99 30.06.16 11:50 Сейчас в теме
(29) v3rter, так вернет 24.

Ovrfox прав , нужно заменять "." и "," то есть знаки которые могу повлиять на формирование числа
31. v3rter 30.06.16 12:06 Сейчас в теме
Получаются два основных подхода:
1. число справа
2. все нецифровые символы удаляются, оставшиеся цифровые склеиваются
И куча промежуточных вариантов, когда нецифровые последовательности символов в номере переносятся, объединяются, заменяются на точки-прочерки-тире и т.д.
32. dakork 32 05.08.17 13:20 Сейчас в теме
Попробуйте типовой механизм (БП 3.0) ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(НомерОбъекта, УдалитьПрефиксИнформационнойБазы, УдалитьПользовательскийПрефикс) По умолчанию УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь
33. lda0312 15.11.18 11:01 Сейчас в теме
НомерБезПрефикса = Объект.ВходящийНомер;
Пока Найти(НомерБезПрефикса,"0") <> 1 Цикл
НомерБезПрефикса = Сред(НомерБезПрефикса,2); //удаляет лидирующие ненули
КонецЦикла;

Опасный код. Если в номере не будет нуля то попадаешь в вечный цикл.
34. user633533_encantado 11 15.11.18 11:06 Сейчас в теме
Статья ради статьи: как пользоваться функцией "Найти", которая , кстати, устарела.
35. Simonov_NPM 05.06.19 07:02 Сейчас в теме
Пока Лев(Номер, 1)="0" Цикл
Номер = Сред(Номер, 2);
КонецЦикла;
36. user679305_admn.nns 01.09.19 15:12 Сейчас в теме
Мой вариант:

Функция УдалитьЛидирующиеНули(Знач Номер)
Пока Лев(Номер,1) = "0" Цикл
Длина = СтрДлина(Номер);
Номер = Прав(Номер,Длина-1);
КонецЦикла;
Возврат Номер;
КонецФункции
gala2009; rabota.v8.1c; +2 Ответить
37. user679305_admn.nns 01.09.19 15:15 Сейчас в теме
Если длина префикса известна, а во всех стандартных конфигурациях она равна 5, тогда

Функция УдалитьПрефикс(Знач Номер)
Длина = СтрДлина(Номер);
Номер = Прав(Номер,Длина-ДлинаПрефикса);
Возврат Номер;
КонецФункции
38. MrTom 10.04.20 13:12 Сейчас в теме
Поучаствую и я в конкурсе изобретателей велосипедов ))

Номер = Объект.Номер;
Поз = Найти(Номер,"-");
Если Поз>0 Тогда Номер = Сред(Номер, Поз+1); КонецЕсли;

Пока Лев(Номер,1)<"1" ИЛИ Лев(Номер,1)>"9" Цикл
	Номер = Сред(Номер,2);
КонецЦикла;
39. Jane1508 4 20.07.20 09:53 Сейчас в теме
(38) А если такой вариант номера А1307.002, и надо что бы лидирующие нули после "." уходили и на выходе чтобы было А1307.2. Как в таком случае?
41. daniyar5436 08.10.20 18:06 Сейчас в теме
вот по проверял и вы проверьте рабочий вариант )
Функция ПолучитьНомерНаПечать (НомДок)

	ДлСтр=СтрДлина(НомДок);
	поз=1;
	ПоследняПозицияБуквы=0;
	пока поз <= длСтр Цикл
		СимвИзНомДок=прав(Лев(НомДок,Поз),1);
		ЭтоЦифра=СтрНайти("0123456789",СимвИзНомДок)>0;
		поз=поз+1;
		если не ЭтоЦифра Тогда
			ПоследняПозицияБуквы=Поз;
		КонецЕсли;
	КонецЦикла;
	СтрокаТолькоЧисла=Прав(НомДок,ДлСтр-ПоследняПозицияБуквы+1);
	
		Пока Лев(СтрокаТолькоЧисла, 1) = "0" Цикл
			СтрокаТолькоЧисла = Сред(СтрокаТолькоЧисла, 2);
		КонецЦикла;

       возврат СтрокаТолькоЧисла ;

КонецФункции

Показать
klaus38; Yackov; ulen; progr-2008; maksa2005; +5 Ответить
42. progr-2008 118 22.07.21 18:05 Сейчас в теме
43. user1208936 02.11.21 22:51 Сейчас в теме
Для какой конфигурации данная обработка?
45. kassbar 157 16.01.23 12:26 Сейчас в теме
СтроковыеФункцииКлиентСервер.УдалитьПовторяющиесяСимволы(Строка,УдаляемыйСимвол)
46. websamson 306 17.03.23 10:48 Сейчас в теме
Если вдруг..
Для Альфа авто 6:
ПрефиксацияОбъектовПлатформа.ПолучитьНомерНаПечать
47. user633533_encantado 11 22.05.23 14:00 Сейчас в теме
(46)
ПрефиксацияОбъектовПлатформа.ПолучитьНомерНаПечать
это не везде в типовых есть
Оставьте свое сообщение