Иногда вследствие ручной правки номера документа или кода справочника или после обменов с распределенными информационными базами в 1С нарушается автонумерация.
Вы можете написать код перенумерации или воспользоваться какой-либо обработкой, но иногда, даже после этого номер генерируется опять не верный.
Система «кэширует» последний выделенный номер.
Для того, чтобы обнулить этот кэш существует функция ОбновитьНумерациюОбъектов.
- После вызова объекты с номерами становятся невалидными, т.е. в момент записи, если этот номер уже был выдан, но не записан выйдет ошибка контроля уникальности.
- Для уже записанных документов, ничем не грозит — их номера останутся прежними, даже если они не уникальные.
- Название функции дает неверное толкование, никакого обновления не происходит.
- Вызов допустим либо на сервере, либо в режиме толстого клиента
- Права требуется Полные» или «Административные»
Использование ОбновитьНумерациюОбъектов
ОбновитьНумерациюОбъектов(Метаданные.Документы.ПоступлениеТоваровУслуг);//Один вид документа
МассивМета = Новый Массив;
МассивМета.Добавить(Метаданные.Документы.ПоступлениеТоваровУслуг);
МассивМета.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
ОбновитьНумерациюОбъектов(МассивМета);//Несколько видов
ОбновитьНумерациюОбъектов();//Все объекты системы, не рекомендуется такой вызов
Еще одной причиной неверной нумерации может быть подписки события ПриУстановкеНовогоНомера, если в них заложен какой-то альтернативный алгоритм установки номера, например: добавление префикса узла, организации, склада.
Как проверить ?
- Найти вызовы функций начинающихся с»ДобавитьПрефикс» или вызов метода объекта УстановитьНовыйНомер()
- Перебрать все подписки в конфигурации
Код перенумерации одного вида документа
- Написано для ситуации, когда нумерация у клиента ежемесячно начинается с 0.
- Выполняется без контроля уникальности (Объект.ОбменДанными.Загрузка = Истина)
- Без промежуточных перенумераций (обычно обработки сначала меняют нумерацию на другой префикс, а затем вызывают стандартный УстановитьНовыйНомер(«»), получается аналогично, но дольше.
- В конце можно вызывать ОбновитьНумерациюОбъектов(Метаданные.Документы.ПоступлениеТоваровУслуг); (в монопольном режиме не обязательно)
НачатьС = 1;
Префикс ="10-";
ПолнаяДлинаНомера = 8;
НачПериода = Дата(2016,10,1);
КонПериода = Дата(2016,10,31);
ТекНомер = НачатьС;
ДлинаНомера = ПолнаяДлинаНомера -СтрДлина(Префикс);
Док = Документы.ПоступлениеТоваровУслуг.Выбрать(НачПериода,КонецДня(КонПериода));
Счетчик = 0;
Пока Док.Следующий() Цикл
Объект = Док.ПолучитьОбъект();
НомерНовый = префикс+Прав("000000000000"+формат(ТекНомер,"ЧГ="),ДлинаНомера);
Если не Лев(Объект.Номер,ПолнаяДлинаНомера) = НомерНовый Тогда
Объект.Номер = НомерНовый;
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
Счетчик = Счетчик+1;
КонецЕсли;
ТекНомер = ТекНомер+1;
КонецЦикла;
Сообщить("Выполнено замен "+Счетчик);
Впервые в истории планеты Земля все люди во всех странах задались единой целью: заработать столько денег, чтобы уподобиться героям рекламы.