Добавить лидирующие нули к произвольному значению

14.06.10

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

     Решал задачу переноса элементов справочника из 1с 7.7 в 1с 8.1. Почти все справочнике в 8.1 имели коды с большей длиной чем в 1с 7.7. Захотел при переносе увеличивать длину кода до необходимой длины добавляя лидирующие нули. В итоге родилась функция, которая справляется с поставленной задачей с любым типом данных, будь то текст или число.

Функция ДобавитьНули(Значение, НужнаяДлинаЗначения)
       
    Значение = СтрЗаменить(Формат(Значение, "ЧГ="), " ", "");
    НадоНулей = НужнаяДлинаЗначения - СтрДлина(Значение);
    ВедущиеНули = Формат(0,"ЧЦ="+НадоНулей+";ЧН=; ЧВН=; ЧГ=0");
    Возврат ВедущиеНули + Значение;
   
КонецФункции

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    5399    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46290    dimanich70    83    

164

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    6838    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    57343    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    8603    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

28.08.2023    22757    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Armando 1402 04.06.10 20:28 Сейчас в теме
А в чем ценность, собственно :?: :?: :?:
2. WiseSnake 1521 04.06.10 20:38 Сейчас в теме
Эти функции давно до Вас написаны, можно было использовать уже готовые. Так же написаны обработки и методики переноса между базами.
3. Abadonna 3976 04.06.10 23:50 Сейчас в теме
Ну, прям сходу скажу, в чем порок этой функции (в том виде, как она есть).
Берем ТиС или Комплексную 7.7, там учет многофирменный и есть такая примочка (как и в 8х) под названием префикс.
На
Сообщить(ДобавитьНули("Н-004",7));
получим 00Н-004
Вроде не то, что хотелось, а? ;)
4. Abadonna 3976 05.06.10 00:02 Сейчас в теме
+(3) А, вообще-то, еще и в дремучей 7.7 есть
Функция ДополнитьСтроку(Стр, Символ, Длина, Режим = 1)
	
	КолСимволов = Длина - СтрДлина(Стр);
	Если КолСимволов > 0  Тогда
		Приращ = "";
		Для Сч = 1 По КолСимволов  Цикл
			Приращ = Приращ + Символ;
		КонецЦикла;           
		
		Возврат ?(Режим = 0, Приращ + Стр, Стр + Приращ);
	Иначе     
		
		Возврат	Стр;
	КонецЕсли;      
	
КонецФункции
Показать

Дополняет чем угодно, да еще с любой строны: и слева, и справа.
И код на 8х ложится без всяких вопросов
vano-ekt; simgo83; vladir; +3 Ответить
5. WKBAPKA 216 05.06.10 09:10 Сейчас в теме
А мне понравилось. Нестандартно, через формат. Когда я реализовывал функцию по добавлению нулей, я делал это через цикл. Мне кажется предложенный вариант по скорости будет работать быстрее чем в (4)
7. Abadonna 3976 05.06.10 10:31 Сейчас в теме
(5) А оно тебе надо шибко быстрее? ;)
Если один - разницы не заметишь, если много - львиный кусок перезапись элементов сожрет, тоже не заметишь
12. Tokiy 131 16.06.10 07:57 Сейчас в теме
(7) Скорость как раз важна! Из мелочей складывается общая производительность!
Автору плюс, через Формат однозначно интереснее чем через Цикл.
6. WKBAPKA 216 05.06.10 09:31 Сейчас в теме
а вот другой вопрос, если элементы справочников имеют коды с префиксом ;)
8. yku 380 05.06.10 14:38 Сейчас в теме
еще бы дополнить чтоб параметр значение мог иметь тип "Число".
Типа того:
Если ТипЗнч(пЗначение) = Тип("Число") тогда
Значение = Формат(Значние,"ЧГ=0"); // убираем пробелы в больших числах "1 234" -> "1234"
// За верность не отвечаю, под рукой 1Ски нет.
Иначе
Значение = СокрЛП(Значение);
КонецЕсли;
79044970523; +1 Ответить
19. katavy 19.04.17 13:38 Сейчас в теме
(8) Мне было необходимо использовать перенос документов из Фолио в 1С, предложенную функцию лишь немного "под себя", добавив "Символы.НПП" , т.к. из фолио номера идут с пробелами "283 435".Вот так она выглядит:

Функция ПолучитьКорректныйНомер(Значение, НужнаяДлинаЗначения)
       
    Значение = СтрЗаменить(Формат(Значение, "ЧГ=0"), Символы.НПП,"");
    НадоНулей = НужнаяДлинаЗначения - СтрДлина(Значение);
    ВедущиеНули = Формат(0,"ЧЦ="+НадоНулей+";ЧН=; ЧВН=; ЧГ=0");
    Возврат ВедущиеНули + Значение;
   
КонецФункции


Данная функция оказалась в таком варианте мне очень удобной (у нашей орг-ции нет префикса, а если бы и был, то "внедрить" его несложно было бы), спасибо!
SergeySol-82; +1 Ответить
9. zzerro 277 05.06.10 14:59 Сейчас в теме
А добавть нули в начало можно еще и примерно так:
НужноеЗначение = Прав("0000000000000000000000000000" + Формат(НашеЗначение,"ЧГ=0"),СколькоЗнаковНужно);
Aspire1C; ivprovotorov; Мах; Cujoko; dammit666; ybatiaev; alsegor; Andrekaa; provost_ua; Desnyanka; wau8824ru; Wersia; scanner1980; eruil; Capitullo; egorcheg1; dbachinsky; wowik; YoungHero; user901542; deevil; edyardg; mudrak; dobryak@bk.ru; ogre2007; +25 Ответить
13. AnryMc 849 29.11.11 07:51 Сейчас в теме
Нестадартно.
Сам делал через цикл или похоже на (9)
17. brrart 27 11.12.14 05:54 Сейчас в теме
(9) zzerro, Пригодилось, спасибо!
20. edyardg 23 09.11.17 12:58 Сейчас в теме
22. shoy 19 19.03.19 14:17 Сейчас в теме
(9)
Прав("0000000000000000000000000000" + Формат(НашеЗначение,"ЧГ=0"),СколькоЗнаковНужно);


СтранаКод "36" Строка
Формат(СтранаКод,"ЧЦ=3; ЧВН=; ЧГ=0") "36" Строка
Прав("000" + Формат(СтранаКод,"ЧГ=0"), 3) "036" Строка

и вааще, это как так бывает?
10. Abadonna 3976 05.06.10 16:00 Сейчас в теме
В 4 тем хороша, что она дополняет чем угодно. Знаю одну базу, где в справочнике Номенклатура стоят ведущие пробелы. Манагерам так удобнее искать, как они сказали.
11. 79044970523 940 07.06.10 19:45 Сейчас в теме
Параметр может быть строкой или числом, проверено - работает. Если есть префиксы, то это уже частный случай и дополнить функцию не сложно, тоже самое касается добавления нулей с правой стороны. Обработка показывает нестандартное решение, подобного я не видел, поэтому решил опубликовать.
14. Leannet 5 29.11.11 08:10 Сейчас в теме
15. echo77 1935 18.07.13 07:12 Сейчас в теме
(0) Если уж говорить про КД2, то там есть экспортная функция:

// Приводит номер (код) к требуемой длине. При этом выделяется префикс
// и числовая часть номера, остальное пространство между префиксом и
// номером заполняется нулями.
// Функция может быть использована в обработчиках событий, программный код
// которых хранится в правила обмена данными. Вызывается методом Выполнить()
// Сообщение "Не обнаружено ссылок на функцию" при проверке конфигурации
// не является ошибкой проверки конфигурации
//
// Параметры:
// Стр - преобразовываемая строка;
// Длина - требуемая длина строки.
//
// Возвращаемое значение:
// Строка - код или номер, приведенная к требуемой длине.
//
Функция ПривестиНомерКДлине(Знач Стр, Длина, ДобавлятьНулиЕслиДлинаНеМеньшеТекущейДлиныНомера = Истина, Префикс = "") Экспорт
Мах; slitov; +2 Ответить
16. q4a 103 09.09.13 12:25 Сейчас в теме
А почему бы не использовать Формат с ЧВН=1 (выводить лидирующие нули)?
Код:
Для Инд=1 По 15 Цикл
Сообщить("Номер="+Формат(Инд, "ЧЦ=2; ЧВН=1"));
КонецЦикла;

Выдаст: 01, 02, 03...
Прикрепленные файлы:
18. 9322304@gmail.com 10 03.08.16 12:47 Сейчас в теме
Функция ДобавитьНулиВперед(Знач Значение, НужнаяДлинаЗначения) Экспорт
иначе Значение внутри Вашей функции меняется
21. user723770 12.09.18 12:55 Сейчас в теме
Если Значение длиннее НужнойДлинны... то на управляемых на тонком клиенте дописывает лишний ведущий ноль.
Нужна проверка

Функция ДобавитьНули(Значение, НужнаяДлинаЗначения)
       
    Значение = СтрЗаменить(Формат(Значение, "ЧГ="), " ", "");
    НадоНулей = НужнаяДлинаЗначения - СтрДлина(Значение);
	Если НадоНулей > 0 Тогда
    	ВедущиеНули = Формат(0,"ЧЦ="+НадоНулей+";ЧН=; ЧВН=; ЧГ=0");
	Иначе
		ВедущиеНули="";
	КонецЕсли;	
    Возврат ВедущиеНули + Значение;
   
КонецФункции
Показать
23. Eugen-S 419 28.08.19 22:03 Сейчас в теме
Вот мой вариант:

Функция ДобавитьНули(Значение, НужнаяДлинаЗначения)
	
	Если Значение = 0 Тогда
		Возврат Лев(Формат(1, "ЧЦ=" + НужнаяДлинаЗначения + ";ЧГ=0; ЧВН="), НужнаяДлинаЗначения - 1) + "0";	
	Иначе
		Возврат Формат(Значение, "ЧЦ=" + НужнаяДлинаЗначения + ";ЧГ=0; ЧВН=");
	КонецЕсли;
	
КонецФункции
Показать
24. vkozak 23.12.19 09:14 Сейчас в теме
Интересная тема периодически такая задача возникает. Спасибо за примеры. Особенно понравился 23. Eugen-S
25. wau8824ru 25 03.02.20 15:48 Сейчас в теме
Мой вариант с префиксами УТ10.3 (РИБ + БП) для отбора через модуль
УниверсальныеМеханизмы.УстановитьБыстрыйОтборДанных(ОбъектДанных, Знач ЗначениеОтбора = "", Знач ИмяОтбораДанных = Неопределено) Экспорт

Для облегчения поиска по коду контрагентов с учётом ВсеПрефиксы = РегистрыСведений.ПрефиксыИнформационныхБаз
	Если ОбъектДанных.Отбор[ИмяОтбораДанных].Использование Тогда
		
		ОбъектДанных.Отбор[ИмяОтбораДанных].ВидСравнения  = ВидСравнения.Содержит;
		ОбъектДанных.Отбор[ИмяОтбораДанных].Значение = ЗначениеОтбора;
		//88(
		Если ТипЗнч(ОбъектДанных) = Тип("СправочникСписок.Контрагенты")
			И ИмяОтбораДанных = "Код"
			И Лев(ЗначениеОтбора, 1) = "0"
			И СтрДлина(ЗначениеОтбора) > 1
			Тогда
			// Убираем лидирующие нули у ЗначениеОтбора
			Пока Лев(ЗначениеОтбора, 1) = "0" Цикл
				ЗначениеОтбора = Прав(ЗначениеОтбора, СтрДлина(ЗначениеОтбора) - 1);
			КонецЦикла;
			ДлинаСтрЗначениеОтбора = СтрДлина(ЗначениеОтбора);
			ДлинаСтрКодКонтрагента = Метаданные.Справочники.Контрагенты.ДлинаКода;
			ТаблицаЗначенийЗначениеОтбора = Новый ТаблицаЗначений;
			ТаблицаЗначенийЗначениеОтбора.Колонки.Добавить("Значение");
			ВсеПрефиксы = РегистрыСведений.ПрефиксыИнформационныхБаз.СоздатьНаборЗаписей();
			ВсеПрефиксы.Прочитать();
			Для Каждого Запись Из ВсеПрефиксы Цикл
				ДлинаСтрПрефикса = СтрДлина(Запись.Префикс);
				НужноНулей = ДлинаСтрКодКонтрагента - ДлинаСтрПрефикса - ДлинаСтрЗначениеОтбора;
				Если НужноНулей > 0 Тогда// Префикс+Нули+ЗначениеОтбора - Значение с Префиксом и с Нулями
					ВедущиеНули = Формат(0,"ЧЦ="+НужноНулей+"; ЧН=; ЧВН=; ЧГ=0");
					Стр = ТаблицаЗначенийЗначениеОтбора.Добавить();
					Стр.Значение = Запись.Префикс+ВедущиеНули+Формат(ЗначениеОтбора, "ЧГ=0");
				ИначеЕсли НужноНулей = 0 Тогда// Префикс+ЗначениеОтбора - Значение с Префиксом, без Нулей
					Стр = ТаблицаЗначенийЗначениеОтбора.Добавить();
					Стр.Значение = Запись.Префикс+Формат(ЗначениеОтбора, "ЧГ=0");
				Иначе// Нули+ЗначениеОтбора - Значение с Нулями, без Префиксов
					НужноНулей = ДлинаСтрКодКонтрагента - ДлинаСтрЗначениеОтбора;
					ВедущиеНули = Формат(0,"ЧЦ="+НужноНулей+"; ЧН=; ЧВН=; ЧГ=0");
					Стр = ТаблицаЗначенийЗначениеОтбора.Добавить();
					Стр.Значение = ВедущиеНули+Формат(ЗначениеОтбора, "ЧГ=0");
				КонецЕсли;
			КонецЦикла;
				// + Не уверен что нужный код???
				// Если отсутствует Префикс = "000", тогда добавим значение, после чего свернём таблицу
				НужноНулей = ДлинаСтрКодКонтрагента - ДлинаСтрЗначениеОтбора;
				ВедущиеНули = Формат(0,"ЧЦ="+НужноНулей+"; ЧН=; ЧВН=; ЧГ=0");
				Стр = ТаблицаЗначенийЗначениеОтбора.Добавить();
				Стр.Значение = ВедущиеНули+Формат(ЗначениеОтбора, "ЧГ=0");
				///
				// - Не уверен что нужный код???
			ТаблицаЗначенийЗначениеОтбора.Свернуть("Значение");
			СписокЗначенийЗначениеОтбора = Новый СписокЗначений;
			СписокЗначенийЗначениеОтбора.ЗагрузитьЗначения(ТаблицаЗначенийЗначениеОтбора.ВыгрузитьКолонку("Значение"));
			Если ТаблицаЗначенийЗначениеОтбора.Количество() > 1 Тогда
				ОбъектДанных.Отбор[ИмяОтбораДанных].ВидСравнения  = ВидСравнения.ВСписке;
				ОбъектДанных.Отбор[ИмяОтбораДанных].Значение = СписокЗначенийЗначениеОтбора;
			Иначе
				ОбъектДанных.Отбор[ИмяОтбораДанных].ВидСравнения  = ВидСравнения.Содержит;
				ОбъектДанных.Отбор[ИмяОтбораДанных].Значение = ЗначениеОтбора;
			КонецЕсли;
		КонецЕсли;
		//88)
Показать
26. wau8824ru 25 05.02.20 12:22 Сейчас в теме
(25)
Формат(ЗначениеОтбора, "ЧГ=0");

Т.К ЗначениеОтбора - строка то Формат делать не нужно - просто заменить на
ЗначениеОтбора
27. SHiCK 11.02.20 22:10 Сейчас в теме
для 77 просто Формат(значение, "Ч(0)18"), где 18 нужная длина строки, и все... зачем огород?
ankr; acanta; +2 Ответить
28. wau8824ru 25 14.02.20 11:47 Сейчас в теме
(27)
и все... зачем огород?

ещё счёты вспомни, там всё гораздо проще...
29. kurator1C 09.07.20 05:01 Сейчас в теме
БСП

СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Значение, ДлинаСтроки, Символ, "Слева")
shapa_pro; Мах; e9504100606; InJey; dammit666; slige; KirinaAS; temdj; Jesdva; +9 Ответить
30. lemist 17 11.08.20 17:19 Сейчас в теме
Добавить вначале кучу нулей и обрезать справа по нужной длине строки

Прав("00000000000000000000000000000000" + Значение, ДлинаСтроки)
Enziger; ivprovotorov; dammit666; Yasasha; KolBbl4; Highlander1981; +6 Ответить
Для отправки сообщения требуется регистрация/авторизация