1с убрать буквы из номера

Обновлено: 07.07.2024

Эта заметка вероятно заинтересует Вас, если вы уже работаете в программе 1С: Бухгалтерия предприятия, редакция 3.0 после перехода со второй редакции и столкнулись с новыми форматами нумерации документов. Если вы только планируете переход на редакцию 3.0, то эта информация будет полезна во избежание дальнейших трудностей с корректной нумерацией.

Хотя я и использую слово «трудности», но на самом деле, разработчики позаботились о пользователях и по максимуму упростили восстановление нумерации документов в программе, и никаких сложностей возникнуть у Вас не должно.

Приведу небольшую инструкцию по «перенумерации» и расскажу о префиксах в новом формате номера.

В ПП 1С: Бухгалтерия предприятия, редакция 3.0 был введен новый формат нумерации документов, и при создании нового документа программа автоматически присваивает ему новый номер по шаблону «0000 – 000000». Если на момент изменения нумерации у Вас уже имелись в программе документы, номер которых имеет другой формат (например, «00000000000» - одинадцатизначный номер, где первые три символа отведены под префикс организации), тогда номер у следующего нового документа будет выглядеть так «0000 – 000001», где первые два символа до знака дефиса отведены также под префикс организации.

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

Если изначально такой префикс был задан, то он никуда не исчезнет, только обрежется до двух символов, если он был длиннее, и номер будет выглядеть так - «ТД00-000001».

Многих пользователей смущают и префикс, и знак дефиса в номере, сразу скажу, что ни то, ни другое не выводится на печать и имеет строго «внутребазовое» назначение технического или логического уровня.

Возникает вопрос, для чего нужны еще два символа перед знаком дефиса. Как ни странно, но они тоже отведены под префикс – префикс информационной базы. С течением времени и прогрессом во всех областях постепенно преображается и обмен данными между различными программами, так вот в случае, если вы используете синхронизацию (новое современное названия обмена) с другими ПП 1С, например, 1С: Зарплата и управление персоналом 3.0 или 1С: Управление торговлей, то префикс базы просто необходим. Повторюсь, он также состоит из двух символов и задается в «Настройках синхронизации данных» (Администрирование – Настройки синхронизации данных рис.2), тут указано, для чего необходим префикс и где он будет проставляться в программе.

Предположим, изначально в базе был указан только префикс организации из трех символов «ТДК». Укажем еще префикс информационной базы «БП», префикс организации обрезан до двух символов автоматически «ТД».

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

Чтобы в дальнейшем при создании нового документа этого типа программа знала, какой номер должен быть следующим, задаем вручную номер, следующий за последним, в новом формате, в нашем примере он будет выглядеть так: «ТДБП-000006». И записываем документ

Создаем новый документ, записываем, убеждаемся, что номера теперь идут по порядку. Рис.4.

Эту последовательность действий необходимо будет выполнить для всех объектов, которые должны иметь сквозную нумерацию.

Напомню, что первые два символа – это префикс организации, вторые – префикс информационной базы, в печатную форму попадают только символы, идущие после знака дефиса, они могут так же иметь свой формат, содержать как цифры, так и буквы в зависимости от документа или вида операции и т.д.

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

Забавно. Буквально вчера решал эту общеизвестную задачку и думал, как бы поэффективнее. Способ замен, конечно, тоже рассматривал, но. Автор, простите, а если номер "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) вместо Формат(, "ЧГ=") можно попробовать неявное преобразование в строку ""+Число(

Особенности работы механизма автонумерации

Механизм автонумерации в "1С:Предприятии 8.1" имеет целью обеспечить более эффективную и предсказуемую работу с номерами, по сравнению с механизмом автонумерации предыдущей версии платформы.

В "1С:Предприятии 8.1" реализован специальный менеджер автонумерации, который отвечает за выдачу номеров. Использование менеджера автонумерации позволяет существенно повысить параллельность работы за счет отсутствия блокировок базы данных.

Существуют две возможные стратегии нумерации для разных категорий объектов:

  • для объектов, требующих непрерывной нумерации, - нумерация при записи с поддержкой заполнения пропусков в нумерации, образующихся при откатах транзакций;
  • для объектов, не требующих непрерывной нумерации, - нумерация при открытии формы, но без какого-либо переиспользования номеров.

Режимы автонумерации

Механизм автонумерации позволяет работать в двух режимах: в режиме с возвратом неиспользованных номеров и в режиме без возврата неиспользованных номеров. Режим устанавливается свойством объекта метаданных "Конфигурация" РежимАвтонумерацииОбъектов .

  • Значение данного свойства ОсвобождатьАвтоматически проставляется для ранее созданных конфигураций и используется для обеспечения режима работы нумерации, аналогичного версии 8.0. Полученные автоматически номера и коды будут в дальнейшем использоваться, если объект, для которого они получены, не записан. Этот вариант предполагается использовать для конфигураций, разработанных для версии 8.0 и использующихся в версии 8.1 без изменений.
  • Значение данного свойства НеОсвобождатьАвтоматически используется для поддержки нового режима работы с нумерацией, реализованного в версии 8.1. Этот вариант предполагается использовать для конфигураций, в которых для объектов, требующих непрерывной нумерации, будет реализована нумерация при записи, а не при открытии формы.

Свойство Автонумерация формы объекта (элемента справочника, документа. ) отвечает за автоматическое получение номера при открытии формы. Если в этом свойстве указано значение НеИспользовать, это означает, что при открытии формы номер будет не заполнен и он будет получен автоматически при записи объекта.

Таким образом, для реализации возможных стратегий нумерации рекомендуется использовать следующие значения описанных свойств:

  • для объектов, требующих непрерывной нумерации, - РежимАвтонумерацииОбъектов = НеОсвобождатьАвтоматически, Автонумерация = НеИспользовать ;
  • для объектов, не требующих непрерывной нумерации, - РежимАвтонумерацииОбъектов = НеОсвобождатьАвтоматически, Автонумерация = Авто;
  • для работы механизма автонумерации аналогично версии 8.0 - РежимАвтонумерацииОбъектов = ОсвобождатьАвтоматически , Автонумерация = Авто .

Особенности хранения номеров и использования префиксов

Механизм автонумерации выдает номера в разрезе пространств номеров и префиксов. Пространство номера в зависимости от типа объекта может содержать метаданные, владельца, период и др. В пределах пространства номеров номер выдается в разрезе префиксов. По каждому префиксу хранится максимальный выданный номер, на основании которого выдается следующий номер. Один и тот же максимальный номер может соответствовать нескольким префиксам.

Например, в БД хранится максимальный номер 001. Мы получили очередной номер по префиксу 0, нам вернули 002. Далее мы получили очередной номер по префиксу 00, нам вернули номер 003, т. к. в этом случае максимальный номер соответствует обоим префиксам. Механизм автонумерации учитывает этот факт и изменяет максимальный номер зависимых префиксов соответствующим образом. Следует отметить, что на максимальный номер, соответствующий пустому префиксу, влияет изменение максимального номера по любому префиксу, если он превышает максимальный номер по пустому префиксу. Например, мы по пустому префиксу получили номер 001, далее по префиксу 0 получили номер 002, далее по префиксу А получили номер А01, далее по пустому префиксу получили номер А02, т. к. максимальный номер по пустому префиксу соответствует наибольшему из максимальных выданных номеров.

В режиме автоматического возврата номеров механизм автонумерации по каждому пространству номеров и префиксу хранит список свободных номеров. Номер становится свободным, если он не записан в базу данных, а объект был удален из памяти или после автоматического получения номера номер был установлен явно. Под явной установкой номера подразумеваем любое изменение номера объекта, не связанное с его автоматическим получением. Это может быть программная установка номера через свойство объекта Номер или Код (в зависимости от типа объекта) или заполнение номера в форме объекта вручную. Номер может стать свободным также при откате транзакции.

При получении очередного номера механизм автонумерации сначала ищет свободный номер. Если номер найден, то он удаляется из списка свободных и выдается объекту. Если номер не найден, выполняется увеличение максимального номера и полученный номер выдается объекту. Свободные номера хранятся до перезапуска сервера для серверных информационных баз и до момента закрытия последнего клиентского приложения, работающего с данной информационной базой, для файловых информационных баз. Если необходимо, чтобы номер переиспользовался только в пределах заданного периода (день, месяц), то нужно явно установить номер, больший максимального номера по данному пространству номеров и префиксу. Тогда механизм автонумерации удалит все свободные номера меньше устанавливаемого, и следующий номер будет получен от установленного.

Работа автонумерации в различных режимах

Рассмотрим, как работает механизм автонумерации при первом получении номера, при очередном получении номера, при явной установке номера, при удалении объекта, при изменении реквизитов объекта, касающихся автонумерации, а также при фиксации и откате транзакции.

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

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

При явной установке номера механизм автонумерации увеличивает максимальный номер, если явно устанавливаемый номер больше максимального, и блокирует все свободные номера меньше явно устанавливаемого номера. Блокированные свободные номера не используются при получении очередного номера. При явной установке номера префикс не указывается, поэтому механизм автонумерации использует уже выданные номера для определения префикса. Для этого по всем префиксам пространства номеров ищется, подходит ли явно устанавливаемый номер под префикс. Если да, то найденный префикс используется при явной установке номера (таких префиксов может быть несколько). Следствием этого алгоритма является то, что явная установка номера может повлиять на выдачу номеров по нескольким префиксам. Например, по префиксу 00 мы получили номер 001, далее по префиксу 0 мы получили номер 002, далее мы установили номер 005, по префиксу 0 будет получен номер 006, а по префиксу 00 будет получен номер 007, т. к. префиксы 0 и 00 являются зависимыми.

При удалении объекта автонумератор уведомляется об этом факте с тем, чтобы если максимальный номер по пространству номеров (или нескольким пространствам номеров), соответствующему удаляемому номеру, еще не был загружен, учесть факт наличия удаляемого номера при загрузке максимального номера.

Некоторые реквизиты объекта могут неявно влиять на номер. Так, например, владелец и родитель справочника, родитель плана вида характеристик, дата документа или бизнес-процесса участвуют в формировании пространства номеров, в рамках которого выдается номер объекта. Их изменение неявно приводит к изменению пространства номеров объекта и эквивалентно тому, как автонумератор реагирует на явную установку номера. Например, имеем справочник с нумерацией в пределах подчинения. Имеем элемент справочника с номером 001, который находится в группе 001. При переносе элемента справочника в группу с номером 002 механизм автонумерации возвращает номер 001 по пространству номеров родителя 001 и выполняет действия по явной установке номера 001 в пространстве номеров родителя 002.

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

Восстановление при ошибочно введенном максимальном номере

Механизм автонумерации имеет возможности по восстановлению максимального номера после исправления или удаления неверно введенного максимального номера. Например, имеем текущий максимальный номер АА001, пользователь при вводе документа ошибся и явно ввел номер ААБСД. После этого автонумератор запомнил введенный номер и перестал выдавать корректные номера, все время выдавая номер ААБСД. Пользователь исправил неправильно введенный номер документа на АА002. Поcле этого автонумератор стал выдавать правильные номера - АА003, АА004. Альтернативой исправлению может быть удаление объекта с неверно введенным номером.

Данная возможность избавляет пользователя от проблем, связанных с остановкой сервера или вызовом функции ОбновитьНумерациюОбъектов , которые были необходимы ранее для восстановления нумерации объектов.

Читайте также: