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