1с добавить лидирующие нули в номере
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Формат
Описание:
Формирует удобное для чтения представление значений. Полезно использование в отчетах и при прочем визуальном отображении значений.
Синтаксис:
Параметры:
Форматная строка представляет собой строковое значение, включающее параметры форматирования.
Параметры форматирования перечисляются через символ ";". Наличие параметра означает отличие форматирования от стандартного.
Если параметр не задан, то применяется стандартное форматирование, которое в основном соответствует преобразованию значения к строке. Однако для значений типа Число и Дата по умолчанию (0 и 01.01.0001 00:00:00 соответственно) будет выдаваться пустая строка.
- 0 (0) - строка вида "(1,1)";
- 1 (1) - строка вида "-1,1";
- 2 (2) - строка вида "- 1,1";
- 3 (3) - строка вида "1,1-";
- 4 (4) - строка вида "1,1 -".
- д - день месяца (цифрами) без лидирующего нуля;
- дд - день месяца (цифрами) с лидирующим нулем;
- ддд - краткое название дня недели;
- дддд- полное название дня недели ;
- М - номер месяца (цифрами) без лидирующего нуля;
- ММ - номер месяца (цифрами) с лидирующим нулем;
- МММ - краткое название месяца;
- ММММ - полное название месяца;
- к - номер квартала в году;
- г - номер года без века и лидирующего нуля;
- гг - номер года без века с лидирующим нулем;
- гггг - номер года с веком;
- ч - час в 12 часовом варианте без лидирующих нулей;
- чч - час в 12 часовом варианте с лидирующим нулем;
- Ч - час в 24 часовом варианте без лидирующих нулей;
- ЧЧ (HH) - час в 24 часовом варианте с лидирующим нулем;
- м - минута без лидирующего нуля;
- мм - минута с лидирующим нулем;
- с - секунда без лидирующего нуля;
- сс - секунда с лидирующим нулем;
- вв - отображение половины дня AM/PM (действительно только для языков конфигурирования, поддерживающих 12 часовой вариант представления времени).
- Д - дата (цифрами);
- ДД - длинная дата (месяц прописью);
- В - полное время, дата может объединяться со временем;
- ДВ - дата время.
Функция Формат в языке 1С 8.3, 8.2 (в примерах)
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Данная обработка предназначена для того, чтобы подрезать/добавить незначащие лидирующие нули в номерах выбранных документов. По сути это косметическая операция, которая не влияет на ведение учета. Но, тем не менее, приятнее видеть в журнале документов и в отчетах короткие номера, вместо номеров, которые начинаются с кучи нулей.
Предыстория
Как известно, в типовых конфигурациях для большинства документов установлена длина номера документа = 11 знаков, т.е. достаточная длина, причем с большим запасом. Это все хорошо и позволяет вводить свои достаточно длинные префиксы. Там, где я работаю, префиксов у документов нет, и номера документов выглядят как куча нулей в и несколько значащих цифр. Поскольку не всем пользователям все равно, некоторые из них попросили меня подрезать длину номера. Как известно, при печати лидирующие нули отсекаются, поэтому сначала был написан простой скрипт для обработки Универсальный подбор и обработка объектов, затем я создал эту обработку, т.к. резать нули пришлось для десятка-другого вида документов.
Плюсы подхода:
- не надо менять конфигурацию
- после того, как перенумеруете все документы с начала года - дальше нумерация в этом году пойдет сама "короткая"
- уже есть готовая программа (вот она)
Минусы
- если прошло много времени с начала года, придется переписывать много документов
Выдержка из справки к обработке:
Порядок работы
При открытии обработки формируется перечень всех видов документов, которые присутствуют в конфигурации
В списке Документы необходимо отметить виды документов, номера которых будем приводить к нужной длине При необходимости, в правой верхней части формы можно установить отбор по реквизитам документов Номер, Дата, Проведен, ПометкаУдаления. Данный отбор будет действовать для всех видов документов. Например, можно отобрать только документы с начала этого года(Отбор: Дата Больше либо равно 01.01.2016) Устанавливаем новую длину номера в поле Новая длина номера.Длина устанавливается с учетом префикса, т.е. если исходный номер выглядит как "ТД000000001"(всего 11 знаков) и установить новую длину номера = 5, то получится номер вида "ТД001" При необходимости ставим флаг ОбменДанными.Загрузка = Истина - рекомендуется ставить Жмем кнопку Изменить длину номера. Будет задан вопрос, предупреждающий, что вот-вот все произойдет и у вас еще есть шанс передумать.
Сервисные функции
В списке видов документов (Документы) в заголовке отображается сколько видов документов отмечено и сколько их всего В контекстном меню списка видов документов (Документы) есть два пункта: Отметить все, Снять пометки Вставая курсором на каждый вид документа справа внизу отображается мини-список документов данного вида. В этом списке уже применен отбор, указанный в поле выше При работе с обработкой автоматически сохраняются: Отбор, Отметки в списке видов документов, Новая длина номера, Текущее положение в списке видов документов Во время исполнения отображается индикатор прогресса. Обработку можно прервать.Внимание! При перезаписи документов Табель учета рабочего времени могут бы очищены записи регистра сведений Графики работ по видам времени
Часто возникает необходимость вывести в печатную форму номер документа без префикса и лидирующих нулей.
Для этого можно воспользоватся маленькой обработкой прикрепленной к статьи или использовать ниже приведенный код.
НомерБезНулей = НомерБезПрефикса ;
Пока Найти ( НомерБезНулей ,"0") = 1 Цикл
НомерБезНулей = Сред( НомерБезНулей , 2 ); //удаляет лидирующие нули
КонецЦикла;
Объект . ОбработанныйНомер = НомерБезНулей ;
Специальные предложения
Забавно. Буквально вчера решал эту общеизвестную задачку и думал, как бы поэффективнее. Способ замен, конечно, тоже рассматривал, но. Автор, простите, а если номер "00012034", что будет? Верно, лажа будет. Вот если использовать Лев(,1) и Прав(,1) или новомодные СтрНачинаетсяС и СтрЗаканчиваетсяНа, тогда ещё куда ни шло. А так явный минус.
Ну и вообще, кажется мне, что не самый это изящный и быстрый способ.
(2) Yashazz, функции СтрНачинаетсяС и СтрЗаканчиваетсяНа не на всех релизах конфигурации работают.Если номер документа "00012034" после обработки станет "12034", что вполне корректно..
(5) не релизах конфигурации, а релизах платформы. Не ниже 8.3.7, ну я и написал, что "новомодные")
Хожу второй день и пытаюсь решить задачу в духе работ Ильдаровича. Чтобы стильно и извратно)))
а зачем изобретать "велосипед", если можно вызвать готовую функцию общего модуля ОбщегоНазначения.ПолучитьНомерНаПечать(документ); KDZorkov; intelligentvadik; zoikins; unduty; wolfsoft; Eillecho; user598655_ilia-bers; timurkhann; TManukovskaya; temdj; mark_oilbass; synelf; BIT_vnedr; vadimlp77; vovan_victory; eksdak; + 16 – Ответить (3) alex-l19041, ОбщегоНазначения.ПолучитьНомерНаПечать(документ) удаляет только ПрефиксПодразделения или ПрефиксИнформационнойБазы. Если вручную бухгалтер поменял префикс на какой захотел, он не удалится стандартной функцией. (4) ОбщегоНазначения.ПолучитьНомерНаПечать если её вызывать в цикле и много документов, то она очень медленно работает. в БП 3.0 с нумерацией типа ААББ-000001 корректно работает? (6) c300pm, не могу сказать не проверял на БП 3.0.Тем не менее была просьба доработать такой механизм для печати, поскольку стандартный не отрабатывал.
Какая конфигурация и какой релиз уже не помню.
Мой способ не является эталоном, но как мне кажется имеет право на жизнь)) Очевидно, что это вариант не сработает с номером АА-123, так как в нем ни одного нуля нет. Или, например, с номером АА-101 сработает неверно, оставив от него только 1 Думаю, более правильно будет просматривать посимвольно справа налево до первой не цифры, затем полученную подстроку чистить от ведущих нулей, например так Строка(Число("0"+ПромежуточнаяПодстрока)) (9) v3rter, согласен Ваш вариант более коректный чем мой. Хотя есть альтернативный способ - выкинуть из номера все нецифровые символы, затем ведущие нули. Недостаток: кривые номера типа Н1АБ0000021 превратятся в 10000021, а не в 21. Такие "чудо-номера" бывают от кривых префиксов при обмене. Если исходить из того, что все нецифровые префиксы уже отброшены, то самое топорное решение это Формат(Число(Номер)). Вот простой код, который сработает, если номер содержит число.
Как всегда шедевры. Математики поймут )
Попробую расшифровать для тех, кому лень разбираться.
Первая функция: рекурсивно проверяются символы справа налево до первой не цифры,
затем происходит возврат правой части строки по накопленному значению К;
( КодСимвола() / 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) вместо Формат(, "ЧГ=") можно попробовать неявное преобразование в строку ""+Число(
Читайте также: