gifts2017

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

Опубликовал Андрей Чунихин (ApocalypseNTC) в раздел Программирование - Практика программирования

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

 

 

 

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

См. также

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

Дополняет чем угодно, да еще с любой строны: и слева, и справа.
И код на 8х ложится без всяких вопросов
5. Ярослав Радкевич (WKBAPKA) 05.06.10 09:10
А мне понравилось. Нестандартно, через формат. Когда я реализовывал функцию по добавлению нулей, я делал это через цикл. Мне кажется предложенный вариант по скорости будет работать быстрее чем в (4)
6. Ярослав Радкевич (WKBAPKA) 05.06.10 09:31
а вот другой вопрос, если элементы справочников имеют коды с префиксом ;)
7. Аркадий Кучер (Abadonna) 05.06.10 10:31
(5) А оно тебе надо шибко быстрее? ;)
Если один - разницы не заметишь, если много - львиный кусок перезапись элементов сожрет, тоже не заметишь
8. Александр Гладких (yku) 05.06.10 14:38
еще бы дополнить чтоб параметр значение мог иметь тип "Число".
Типа того:
Если ТипЗнч(пЗначение) = Тип("Число") тогда
Значение = Формат(Значние,"ЧГ=0"); // убираем пробелы в больших числах "1 234" -> "1234"
// За верность не отвечаю, под рукой 1Ски нет.
Иначе
Значение = СокрЛП(Значение);
КонецЕсли;
ApocalypseNTC; +1 Ответить
9. Никита Уколов (zzerro) 05.06.10 14:59
А добавть нули в начало можно еще и примерно так:
НужноеЗначение = Прав("0000000000000000000000000000" + Формат(НашеЗначение,"ЧГ=0"),СколькоЗнаковНужно);
mudrak; dobryak@bk.ru; ogre2007; +3 Ответить 2
10. Аркадий Кучер (Abadonna) 05.06.10 16:00
В 4 тем хороша, что она дополняет чем угодно. Знаю одну базу, где в справочнике Номенклатура стоят ведущие пробелы. Манагерам так удобнее искать, как они сказали.
11. Андрей Чунихин (ApocalypseNTC) 07.06.10 19:45
Параметр может быть строкой или числом, проверено - работает. Если есть префиксы, то это уже частный случай и дополнить функцию не сложно, тоже самое касается добавления нулей с правой стороны. Обработка показывает нестандартное решение, подобного я не видел, поэтому решил опубликовать.
12. Алексей Северянин (Ledokol-alt) 16.06.10 07:57
(7) Скорость как раз важна! Из мелочей складывается общая производительность!
Автору плюс, через Формат однозначно интереснее чем через Цикл.
13. anry mc (AnryMc) 29.11.11 07:51
Нестадартно.
Сам делал через цикл или похоже на (9)
14. Anneta86 (Leannet) 29.11.11 08:10
15. Александр Крынецкий (echo77) 18.07.13 07:12
(0) Если уж говорить про КД2, то там есть экспортная функция:

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

Выдаст: 01, 02, 03...
Прикрепленные файлы:
17. Sergei Karpushev (brrart) 11.12.14 05:54
(9) zzerro, Пригодилось, спасибо!
18. Vladimir Ru (9322304@gmail.com) 03.08.16 12:47
Функция ДобавитьНулиВперед(Знач Значение, НужнаяДлинаЗначения) Экспорт
иначе Значение внутри Вашей функции меняется