1. Создаём общий модуль, например "Процедуры разработчика"
2. Устанавливаем в свойствах модуля необходимые признаки "Клиент (обычный)","Сервер" и "Внешнее приложение"
3. Вносим в созданный общий модуль следующий код:
Процедура УстановитьНомерДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
СтандартнаяОбработка = Ложь;
Префикс = СокрЛП(Источник.Организация.Префикс);
ВидДокумента = Источник.Метаданные().Имя;
Если ВидДокумента = "СчетФактураВыданный" Тогда
Если Источник.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс Тогда
Префикс = "А"+Префикс;
КонецЕсли;
КонецЕсли;
Префикс4 = Префикс;
НомерЧисло = 1;
Запрос = Новый Запрос;
Запрос.Текст="ВЫБРАТЬ ПЕРВЫЕ 1
| ПОДСТРОКА(Документ.Номер, 5, 10) КАК Номер
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ
|ГДЕ
| ПОДСТРОКА(Документ.Номер, 1, 4) = &Префикс
| И Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ГОД) И КОНЕЦПЕРИОДА(&Дата, ГОД)
| И НЕ ПОДСТРОКА(Документ.Номер, 5, 10) ПОДОБНО ""%[^0-9]%""
|
|УПОРЯДОЧИТЬ ПО
| Номер УБЫВ";
Запрос.Текст = СтрЗаменить(Запрос.Текст,"РеализацияТоваровУслуг",ВидДокумента);
Пока СтрДлина(Префикс4)
Префикс4 = Префикс4 + "0";
КонецЦикла;
Запрос.УстановитьПараметр("Префикс",Префикс4);
Запрос.УстановитьПараметр("Дата",Источник.Дата);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Попытка
НомерЧисло = Число(Выборка.Номер)+1;
Источник.Номер = Префикс+Формат(НомерЧисло,"ЧЦ="+Строка(СтрДлина(Источник.Номер)-СтрДлина(Префикс))+"; ЧВН=; ЧГ=");
Исключение
КонецПопытки;
Иначе
НомерЧисло = 1;
Источник.Номер = Префикс+Формат(НомерЧисло,"ЧЦ="+Строка(СтрДлина(Источник.Номер)-СтрДлина(Префикс))+"; ЧВН=; ЧГ=");
КОнецЕсли;
КонецПроцедуры
4. Добавляем новую подписку на событие, даём имя, в поле "Источник" выбираем необходимые документы, в поле "Событие" выбираем "ПриУстановкеНовогоНомера", в поле "Обработчик" выбираем созданную нами процедуру.
5. Сохраняем всё это в базу.
Результат: после "кривых" номеров создаётся документ с правильным номером.
6. Несложная доработка позволяет сделать периодическую префиксацию.
Для этого создаём периодический регистр сведений "ПрефиксыОрганизаций" (ресурс - префикс) и вносим небольшое изменение в код.
Вместо:
Префикс = СокрЛП(Источник.Организация.Префикс);
Пишем:
СтруктураОтбора = Новый Структура("Организация",Источник.Организация);
Префиксы = РегистрыСведений.ПрефиксыОрганизаций.СрезПоследних(Источник.Дата,СтруктураОтбора);
Если Префиксы.Количество()>0 Тогда
Префикс = Префиксы[0].Префикс;
Иначе
Префикс = СокрЛП(Источник.Организация.Префикс);
КонецЕсли;