В процессе работы с платформой 1С 8.3 пользователи часто сталкиваются с ситуацией, когда после ручного изменения номера документа — например, при удалении одного или нескольких ведущих нулей — платформа начинает генерировать все последующие номера в коротком формате. В результате сбивается автонумерация, а новые документы получают некорректные номера.
В данной статье мы разберем причины возникновения этой проблемы, изучим механики работы платформы 1С с номерами объектов, а также рассмотрим пошаговые алгоритмы восстановления нумерации — в том числе для случая, когда менять номера у ранее проведенных и распечатанных документов категорически нельзя.
Для того чтобы правильно исправить нумерацию, проанализируем внутренние механизмы платформы, отвечающие за формирование номеров документов:
0 располагается раньше цифр от 1 до 9. Номер без ведущих нулей (например, 124) воспринимается платформой как лексикографически «больший», чем номер с лидирующими нулями (например, 0000000123). Платформа берет этот короткий номер за основу и продолжает нумерацию с него.Главным инструментом для сброса кэша и пересчета последовательности номеров в платформе 1С является процедура ОбновитьНумерациюОбъектов(). Рассмотрим, как она работает.
Данный метод сбрасывает счетчик номеров в кэше сервера для указанного типа объектов и заставляет платформу заново проанализировать существующие в базе документы для поиска максимального номера.
Выполнить эту процедуру можно с помощью внешней обработки. Создадим обработку с одной кнопкой и пропишем в модуле команды следующий код:
// Пример вызова обновления нумерации для конкретного типа документов
МетаданныеДокумента = Метаданные.Документы.РеализацияТоваровУслуг;
ОбновитьНумерациюОбъектов(МетаданныеДокумента);
Если требуется обновить нумерацию сразу для всех метаданных в системе, метод можно вызвать без параметров:
// Обновление нумерации для всех объектов информационной базы
ОбновитьНумерациюОбъектов();
Важно: Выполнение данного метода желательно производить в монопольном режиме, когда с базой не работают другие пользователи, чтобы исключить блокировки и повторные сбои кэша.
Часто возникает сложная ситуация: сбой затронул сотни документов, но менять их номера нельзя, так как печатные формы уже переданы контрагентам или в контролирующие органы. Если просто исправить номера во всех документах, это приведет к расхождениям в учете.
Рассмотрим алгоритм, который позволяет сохранить номера старых документов и вернуть правильную автонумерацию для новых:
ОбновитьНумерациюОбъектов().Разберем пример программного кода внешней обработки для решения этой задачи:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.ПолучитьОбъект();
// Проверяем длину номера и наличие ведущих нулей
Если СтрДлина(СокрЛП(ДокОбъект.Номер)) < 11 Тогда
// Форматируем номер, дополняя пробелами слева
НовыйНомер = ДокОбъект.Номер;
Пока СтрДлина(НовыйНомер) < 11 Цикл
НовыйНомер = " " + НовыйНомер;
КонецЦикла;
ДокОбъект.Номер = НовыйНомер;
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЦикла;
// В последнем документе устанавливаем правильный номер с нулями
// И затем обновляем кэш нумерации
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
Проанализируем дополнительные способы восстановления порядка в номерах, если стандартная корректировка не подходят под условия учета:
00 на ПР). Для нового префикса платформа начнет нумерацию заново с единицы и правильного количества нулей (ПР-00000001), не затрагивая прошлую историю.00000000201). Если его номер окажется лексикографически больше всех ошибочных коротких номеров, платформа продолжит нумерацию от него.ПриУстановкеНовогоНомера: В модуле объекта документа или через подсистемы БСП можно программно контролировать длину формируемого номера и принудительно добавлять лидирующие нули перед записью.Чтобы избежать подобных проблем в будущем, рекомендуется принять следующие меры:
В конфигураторе или через настройки прав пользователей ограничьте право на ручное редактирование номеров документов. В типовых конфигурациях 1С для этого предусмотрены специальные роли и настройки подсистемы редактирования номеров. Если пользователю действительно необходимо изменить номер, данную операцию должен выполнять администратор базы данных с последующим контролем длины строки.