Книга знаний

1С:Предприятие / v8 / Объекты конфигурации / Документы

v8: Укороченный номер документа

У нас возникла ситуация, когда у документа был номер длиной 20 без автонумерации (это был номер договора, достаточно длинный), куда писал кто чего хотел. Затем решили ввести автонумерацию и сделать номер длиной 10 с префиксом 4 знака вида "XXX-". Однако физически номер не урезали, чтобы сохранить старые номера. Описано, как добиться этого в 1С.Автор статьи: Гений 1С | Редакторы:
Последняя редакция №2 от 23.05.08 | История
URL: http://kb.mista.ru/article.php?id=673

В общем, мы решили использовать префикс, например "ППМ-" и номер длиной 10 символов.
Однако физическая длина номера была 20.

Поэтому первый номер был "ППМ-0000000000000001".
Суть алгоритма в том, что такой номер заменяется на короткий "ППМ-000001" и далее нумерация уже идет правильно стандартными средствами:
ППМ-000002
ППМ-000003
ППМ-000004
ППМ-000005
ППМ-000006
ППМ-000007
ППМ-000008
ППМ-000009
ППМ-000010
ППМ-000011
ППМ-000012
...

Соответствующий код приведен здесь:

Функция ПовторитьСимвол(Символ, Сч)
    Р="";
    Для Инд=1 По Сч Цикл
        Р=Р+Символ;
    КонецЦикла;
    Возврат Р;
КонецФункции

Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    НужнаяДлина=10;
    ТекПрефикс = "ППМ-";
    Если ТекПрефикс=Префикс Тогда
        Возврат; //Защита от рекурсии
    КонецЕсли;
    УстановитьНовыйНомер(ТекПрефикс);
    Если Номер=ТекПрефикс+ПовторитьСимвол("0", Метаданные().ДлинаНомера-СтрДлина(ТекПрефикс)-1)+"1" Тогда
        Номер=ТекПрефикс+ПовторитьСимвол("0", НужнаяДлина-1)+"1";
        СтандартнаяОбработка=ложь;
    КонецЕсли;
КонецПроцедуры




Гению 1С сообщили на партнерском, что есть небольшая неточность (если используется подписка на события).
И из-за нее происходит пропуск номеров (через 1).

Исправить можно так (для СобытияПриУстановкеНовогоНомера через подписку):

  Если ТекПрефикс=Префикс Тогда
        Возврат; //Защита от рекурсии
    КонецЕсли;

  Источник.УстановитьНовыйНомер(ТекПрефикс);

    Если Источник.Номер<>ВерныйНомер Тогда
        Источник.Номер=ВерныйНомер;
      //Исправ. ошибки       
      //    СтандартнаяОбработка=ложь;

    КонецЕсли; 

  //Исправ ошибки       

    СтандартнаяОбработка=ложь;

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика