| 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).
 
 Исправить можно так (для СобытияПриУстановкеНовогоНомера через подписку):
 
 
   Если ТекПрефикс=Префикс Тогда
        Возврат; //Защита от рекурсии
    КонецЕсли;
  Источник.УстановитьНовыйНомер(ТекПрефикс);
    Если Источник.Номер<>ВерныйНомер Тогда
        Источник.Номер=ВерныйНомер;
      //Исправ. ошибки       
      //    СтандартнаяОбработка=ложь;
    КонецЕсли; 
  //Исправ ошибки       
    СтандартнаяОбработка=ложь; |