Как восстановить автонумерацию в справочнике Номенклатура в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Сбой автонумерации в справочниках платформы 1С — достаточно распространенная проблема, с которой сталкиваются как разработчики, так и администраторы баз данных. Типичный сценарий: после добавления элемента с коротким кодом (например, 1 вместо 00000077778) система начинает генерировать новые коды начиная с 2, 3 и так далее до 9, а затем выдает ошибку уникальности или выхода за пределы разрядности.

Даже если вручную исправить код элемента в интерфейсе программы, платформа всё равно продолжает выдавать короткие номера. Разберем подробнее, почему так происходит и как правильно восстановить штатный порядок автонумерации.

Выясним причину сбоя нумерации

Для понимания механики работы платформы важно учесть три ключевых аспекта:

  1. Лексикографическое сравнение строк. В 1С строковые коды сравниваются посимвольно (алфавитная сортировка). Текстовый символ "1" платформой считывается как значение, большее, чем символ "0" в кодах вида "00000077777". Достаточно ввести хотя бы один код без лидирующих нулей, чтобы платформа посчитала его максимальным в базе данных.
  2. Кэширование счетчиков номеров. Для оптимизации производительности сервер 1С:Предприятие кэширует в оперативной памяти текущие максимальные номера. Обычное редактирование строки в справочнике исправляет запись в базе, но не сбрасывает закешированный счетчик на сервере.
  3. Предопределенные элементы. Если некорректный код (например, "1") был задан предопределенному элементу в Конфигураторе, при обновлении конфигурации базы данных платформа может снова записать его поверх исправленного. Поэтому менять код предопределенного элемента необходимо и в режиме 1С:Предприятие, и в самих метаданных Конфигуратора.

Шаг 1. Приведение кодов к единому формату

Проанализируем необходимые действия для исправления данных в информационной базе. Прежде чем обновлять счетчик номеров, нужно убедиться, что в базе не осталось элементов с некорректным форматом кода.

  1. Откроем справочник Номенклатура и отсортируем элементы по колонке Код.
  2. Найдем все элементы, у которых отсутствуют лидирующие нули (например, коды 1, 2, 3).
  3. Вручную или с помощью специализированной обработки установим для них правильную длинную нумерацию с нулями (например, 00000077778, 00000077779).
  4. Если короткий код был задан у предопределенного элемента, обязательно откроем Конфигуратор и исправим значение свойства Код в окне редактирования предопределенного элемента.

Шаг 2. Обновление нумерации в интерфейсе программы

В конфигурациях на обычных формах (включая Управление производственным предприятием) предусмотрен встроенный механизм сброса кэша нумераторов.

  1. Перейдем в главное меню: Сервис — Настройка стратегии редактирования номеров (кодов) объектов.
  2. В открывшемся списке элементов метаданных найдем справочник Номенклатура.
  3. На верхней панели команд нажмем кнопку Обновить нумерацию объектов.

После выполнения этого действия платформа пересчитает максимальный код непосредственно из таблиц базы данных, и новые элементы снова будут создаваться с продолжением корректной последовательности.

Шаг 3. Программный сброс нумератора через код 1С

Если требуется выполнить сброс счетчика программно или в конфигурации отсутствует специальный диалог настройки стратегии нумерации, используем платформенный метод глобального контекста ОбновитьНумерациюОбъектов().

Рассмотрим пример кода для вызова процедуры сброса нумерации по конкретному справочнику:


МассивМетаданных = Новый Массив;
МассивМетаданных.Добавить(Метаданные.Справочники.Номенклатура);

ОбновитьНумерациюОбъектов(МассивМетаданных);

Если вызван метод ОбновитьНумерациюОбъектов() без параметров, платформа выполнит обновление счетчиков для всех типов объектов в информационной базе:


// Выполнение обновления нумерации для всех объектов базы
ОбновитьНумерациюОбъектов();

Важное замечание: Данный метод доступен для выполнения только пользователям с административными правами. После его вызова все автоматически сформированные, но еще не записанные в сессиях пользователей номера и коды становятся недействительными.

Дополнительные нюансы и рекомендации

  1. Помеченные на удаление элементы. Помните, что помеченные на удаление объекты продолжают физически находиться в базе данных. Если элемент с кодом 1 был помечен на удаление, но не удален окончательно, метод ОбновитьНумерациюОбъектов() все равно прочитает его код. Такой объект нужно либо полностью удалить через удаление помеченных объектов, либо переименовать его код.
  2. Перезапуск службы сервера. В клиент-серверном режиме работы сбросить закешированные значения автонумерации также помогает полный перезапуск службы 1С:Предприятия (процесса rphost), но только после того, как физические данные в базе приведены к правильному виду.
← На главную