Сбой автонумерации в справочниках платформы 1С — достаточно распространенная проблема, с которой сталкиваются как разработчики, так и администраторы баз данных. Типичный сценарий: после добавления элемента с коротким кодом (например, 1 вместо 00000077778) система начинает генерировать новые коды начиная с 2, 3 и так далее до 9, а затем выдает ошибку уникальности или выхода за пределы разрядности.
Даже если вручную исправить код элемента в интерфейсе программы, платформа всё равно продолжает выдавать короткие номера. Разберем подробнее, почему так происходит и как правильно восстановить штатный порядок автонумерации.
Для понимания механики работы платформы важно учесть три ключевых аспекта:
"1" платформой считывается как значение, большее, чем символ "0" в кодах вида "00000077777". Достаточно ввести хотя бы один код без лидирующих нулей, чтобы платформа посчитала его максимальным в базе данных."1") был задан предопределенному элементу в Конфигураторе, при обновлении конфигурации базы данных платформа может снова записать его поверх исправленного. Поэтому менять код предопределенного элемента необходимо и в режиме 1С:Предприятие, и в самих метаданных Конфигуратора.Проанализируем необходимые действия для исправления данных в информационной базе. Прежде чем обновлять счетчик номеров, нужно убедиться, что в базе не осталось элементов с некорректным форматом кода.
Номенклатура и отсортируем элементы по колонке Код.1, 2, 3).00000077778, 00000077779).В конфигурациях на обычных формах (включая Управление производственным предприятием) предусмотрен встроенный механизм сброса кэша нумераторов.
Номенклатура.После выполнения этого действия платформа пересчитает максимальный код непосредственно из таблиц базы данных, и новые элементы снова будут создаваться с продолжением корректной последовательности.
Если требуется выполнить сброс счетчика программно или в конфигурации отсутствует специальный диалог настройки стратегии нумерации, используем платформенный метод глобального контекста ОбновитьНумерациюОбъектов().
Рассмотрим пример кода для вызова процедуры сброса нумерации по конкретному справочнику:
МассивМетаданных = Новый Массив;
МассивМетаданных.Добавить(Метаданные.Справочники.Номенклатура);
ОбновитьНумерациюОбъектов(МассивМетаданных);
Если вызван метод ОбновитьНумерациюОбъектов() без параметров, платформа выполнит обновление счетчиков для всех типов объектов в информационной базе:
// Выполнение обновления нумерации для всех объектов базы
ОбновитьНумерациюОбъектов();
Важное замечание: Данный метод доступен для выполнения только пользователям с административными правами. После его вызова все автоматически сформированные, но еще не записанные в сессиях пользователей номера и коды становятся недействительными.
1 был помечен на удаление, но не удален окончательно, метод ОбновитьНумерациюОбъектов() все равно прочитает его код. Такой объект нужно либо полностью удалить через удаление помеченных объектов, либо переименовать его код.rphost), но только после того, как физические данные в базе приведены к правильному виду.