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

14.06.10

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

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

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

См. также

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

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

21.05.2024    20130    dimanich70    81    

144

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

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

1 стартмани

18.03.2024    4091    3    John_d    11    

57

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

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

12.02.2024    18067    atdonya    24    

56

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

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

30.11.2023    5502    ke.92@mail.ru    16    

65

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

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

28.08.2023    14734    YA_418728146    7    

166

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

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

2 стартмани

22.08.2023    3581    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 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    18478    171    sapervodichka    112    

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

Дополняет чем угодно, да еще с любой строны: и слева, и справа.
И код на 8х ложится без всяких вопросов
vano-ekt; simgo83; vladir; +3 Ответить
5. WKBAPKA 215 05.06.10 09:10 Сейчас в теме
А мне понравилось. Нестандартно, через формат. Когда я реализовывал функцию по добавлению нулей, я делал это через цикл. Мне кажется предложенный вариант по скорости будет работать быстрее чем в (4)
7. Abadonna 3968 05.06.10 10:31 Сейчас в теме
(5) А оно тебе надо шибко быстрее? ;)
Если один - разницы не заметишь, если много - львиный кусок перезапись элементов сожрет, тоже не заметишь
12. Tokiy 131 16.06.10 07:57 Сейчас в теме
(7) Скорость как раз важна! Из мелочей складывается общая производительность!
Автору плюс, через Формат однозначно интереснее чем через Цикл.
6. WKBAPKA 215 05.06.10 09:31 Сейчас в теме
а вот другой вопрос, если элементы справочников имеют коды с префиксом ;)
8. yku 376 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");
    Возврат ВедущиеНули + Значение;
   
КонецФункции


Данная функция оказалась в таком варианте мне очень удобной (у нашей орг-ции нет префикса, а если бы и был, то "внедрить" его несложно было бы), спасибо!
9. zzerro 277 05.06.10 14:59 Сейчас в теме
А добавть нули в начало можно еще и примерно так:
НужноеЗначение = Прав("0000000000000000000000000000" + Формат(НашеЗначение,"ЧГ=0"),СколькоЗнаковНужно);
Мах; 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; +23 Ответить
13. AnryMc 848 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 3968 05.06.10 16:00 Сейчас в теме
В 4 тем хороша, что она дополняет чем угодно. Знаю одну базу, где в справочнике Номенклатура стоят ведущие пробелы. Манагерам так удобнее искать, как они сказали.
11. 79044970523 934 07.06.10 19:45 Сейчас в теме
Параметр может быть строкой или числом, проверено - работает. Если есть префиксы, то это уже частный случай и дополнить функцию не сложно, тоже самое касается добавления нулей с правой стороны. Обработка показывает нестандартное решение, подобного я не видел, поэтому решил опубликовать.
14. Leannet 5 29.11.11 08:10 Сейчас в теме
15. echo77 1906 18.07.13 07:12 Сейчас в теме
(0) Если уж говорить про КД2, то там есть экспортная функция:

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

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

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

Функция ДобавитьНули(Значение, НужнаяДлинаЗначения)
	
	Если Значение = 0 Тогда
		Возврат Лев(Формат(1, "ЧЦ=" + НужнаяДлинаЗначения + ";ЧГ=0; ЧВН="), НужнаяДлинаЗначения - 1) + "0";	
	Иначе
		Возврат Формат(Значение, "ЧЦ=" + НужнаяДлинаЗначения + ";ЧГ=0; ЧВН=");
	КонецЕсли;
	
КонецФункции
Показать
24. vkozak 23.12.19 09:14 Сейчас в теме
Интересная тема периодически такая задача возникает. Спасибо за примеры. Особенно понравился 23. Eugen-S
25. wau8824ru 23 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 23 05.02.20 12:22 Сейчас в теме
(25)
Формат(ЗначениеОтбора, "ЧГ=0");

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

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

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

Прав("00000000000000000000000000000000" + Значение, ДлинаСтроки)
dammit666; Yasasha; KolBbl4; Highlander1981; +4 Ответить
Оставьте свое сообщение