Каждый разработчик и администратор 1С рано или поздно сталкивается с ситуацией, когда автонумерация документов «сбивается». Пользователи вручную корректируют номера, добавляют лишние символы, после чего платформа начинает выдавать некорректные или слишком большие номера. Более того, даже полное удаление ошибочных документов не всегда решает проблему: система продолжает генерировать новые документы, отталкиваясь от несуществующих (удаленных) номеров. В этой статье мы подробно разберем, почему так происходит, и рассмотрим проверенные способы приведения автонумерации в «девственно чистый» вид.
Выясним причины: почему автонумерация продолжает сбиваться после удаления документов?
Давайте проанализируем причины, по которым платформа «помнит» ошибочные номера даже после их физического удаления из базы данных:
Кэширование номеров на сервере «1С:Предприятие»: За генерацию новых кодов отвечает специальный внутренний менеджер автонумерации платформы. Он кэширует последний выданный номер в оперативной памяти сервера приложений. Когда вы удаляете документы непосредственно из базы данных, служба ragent продолжает удерживать в памяти последнее максимальное значение и инкрементирует новые номера на его основе.
Скрытые символы и пробелы в номерах: При ручном редактировании пользователи могут случайно добавить пробел в начало или конец строки, либо ввести неразрывные спецсимволы. Поскольку сравнение номеров выполняется лексикографически (как текстовые строки), номер с лишним пробелом может распознаваться платформой как «наибольший», блокируя стандартный порядок.
Смешение раскладок в префиксах: Использование визуально похожих букв кириллицы и латиницы (например, русская «С» и английская «C») заставляет платформу считать их разными префиксами. В результате создается параллельная цепочка нумерации.
Режим автонумерации объектов: Если для свойства «Режим автонумерации объектов» установлено значение Не освобождать автоматически, то номера, затребованные системой, но не записанные (например, при отмене создания документа), безвозвратно теряются, приводя к пропускам.
Основное решение: Использование метода ОбновитьНумерациюОбъектов()
Для принудительного обновления кэша автонумерации в платформе 1С предусмотрен специальный программный метод ОбновитьНумерациюОбъектов(). Этот метод принудительно синхронизирует менеджер автонумерации с текущим актуальным состоянием базы данных.
Рассмотрим пример кода для сброса автонумерации конкретного документа:
// Пример вызова метода для конкретного типа документа
// Метод принудительно синхронизирует менеджер автонумерации с базой данных
ОбновитьНумерациюОбъектов(Метаданные.Документы.ИмяВашегоДокумента);
Если запустить данный метод без параметров, платформа выполнит обновление номеров для абсолютно всех объектов метаданных в базе данных:
// Обновление нумерации для всех типов объектов в системе
ОбновитьНумерациюОбъектов();
Выполнить этот код можно с помощью любой внешней обработки или через стандартную консоль кода (обработку «Групповая обработка объектов» / «Выполнение произвольного алгоритма»).
Ограничения платформы при работе с методом обновления нумерации
Перед тем как применить метод ОбновитьНумерациюОбъектов(), обязательно учтите следующие важные особенности работы системы:
Глобальность сброса: Метод сбрасывает кэш для всей таблицы указанного метаданного. Выполнить выборочный сброс с фильтрацией по конкретной организации, периоду или префиксу невозможно.
Аннулирование незаписанных номеров: Вызов метода делает недействительными все выданные, но еще не записанные в базу данных номера у открытых в этот момент документов. Если в этот момент другие пользователи попытаются записать новые документы, система может выдать ошибку неуникальности. Рекомендуется выполнять данную процедуру в монопольном режиме или во время отсутствия активных пользователей.
Длина номера: Автонумерация будет работать стабильно только при сохранении одинаковой длины текстового поля номера во всех документах. Лексикографическая сортировка крайне чувствительна к ведущим нулям (например, номер «54» будет считаться платформой больше, чем «0054»).
Проверенные альтернативные варианты решения
Если программный метод по какой-то причине не решил проблему или вам требуются другие административные инструменты, рассмотрим альтернативные варианты:
Очистка кэша через перезапуск службы сервера 1С: Если у вас нет возможности написать код, можно просто перезапустить службу сервера «1С:Предприятие» (ragent) или временно удалить и заново добавить базу в консоли администрирования кластера. Это принудительно очистит оперативную память менеджера автонумерации.
Ручная корректировка последнего номера: Если в базе остался хотя бы один документ с некорректным номером, который является максимальным по значению, платформа продолжит отталкиваться от него. Найдите этот документ и вручную исправьте его номер на правильный (с сохранением длины строки и ведущих нулей). Следующий документ автоматически получит корректный инкрементированный номер.
Групповое изменение реквизитов: Если ошибочных документов много и удалять их нельзя, воспользуйтесь стандартной обработкой «Групповое изменение реквизитов». Чтобы отредактировать заблокированное системное поле Номер, откройте дополнительные параметры обработки, включите «Режим разработчика» и активируйте видимость служебных реквизитов.
Встроенный инструмент «Экспресс-проверка»: В типовых конфигурациях (таких как «1С:Бухгалтерия») присутствует встроенный инструмент «Экспресс-проверка ведения учета». С его помощью можно проанализировать нумерацию кассовых документов или счетов-фактур на наличие дублей и пропусков, а также запустить автоматическую последовательную перенумерацию за выбранный период.