Сбилась автонумерация документов или справочников в 1С? Разбираемся в причинах и восстанавливаем порядок по шагам

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

Каждый технический специалист или опытный пользователь 1С рано или поздно сталкивается с неприятной ситуацией: при создании нового документа или элемента справочника система внезапно предлагает совершенно «левый» номер. Например, вместо ожидаемого очередного номера БП00-000456 программа генерирует короткий код 1, 0001 или вовсе выдает ошибку «Код не уникален». При этом восстановить правильную последовательность вручную не удается — следующий созданный объект все равно генерируется с нарушением логики.

В рамках этой статьи мы подробно разберем, почему ломается механизм автонумерации в платформе «1С:Предприятие 8.3», как быстро локализовать ошибочный объект в базе данных и какими программными средствами вернуть нумератор в рабочее состояние.

Физика процесса: почему ломается автонумерация?

Прежде чем переходить к активным действиям, проанализируем, как устроен механизм генерации номеров и кодов. В большинстве конфигураций 1С номера документов и коды справочников имеют текстовый тип данных. Это необходимо для поддержки префиксов организаций, подразделений или узлов распределенных информационных баз (РИБ). Платформа анализирует существующие номера и автоматически прибавляет единицу к самому большому текстовому коду.

Основными причинами сбоя автонумерации являются:

  1. Нарушение разрядности и лидирующих нулей. Если длина номера в конфигурации составляет 11 символов (например, 00000000001), а пользователь вручную сократил его, записав документ с номером 1 или 45, платформа теряет ориентир по разрядности. В следующий раз система попробует создать номер, базируясь на этой некорректной длине.
  2. Игнорирование префиксов. Если в базе настроен учет по нескольким фирмам, документы должны иметь вид УТ00-000001. Если кто-то вручную убирает префикс и записывает просто 00000001, платформа запоминает эту новую ветку нумерации и продолжает вести ее отдельно, что приводит к хаосу.
  3. Неверные символы. Добавление в номер букв, дефисов в неположенных местах (например, 0001/1 или 0001-01 вместо стандартной структуры) полностью ломает встроенный парсер платформы.
  4. Коды папок (групп) в иерархических справочниках. Это неочевидная, но крайне частая проблема. Иерархические справочники хранят коды как для конечных элементов, так и для папок. Если пользователь создал папку и вручную задал ей некорректный или слишком короткий код, система при создании обычных элементов внутри этой папки (или вообще в справочнике) начнет ориентироваться на код папки.
  5. Кэширование номеров сервером 1С. В клиент-серверном режиме работы сервер «1С:Предприятия» (процесс rphost) в целях повышения производительности кэширует диапазон номеров. Если вы исправили ошибочный документ, сервер может «не заметить» этого изменения, продолжая выдавать старые закэшированные значения из своей оперативной памяти.

Шаг 1. Локализуем «косячный» объект в базе данных

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

Например, если система упорно предлагает новому документу номер 000005, значит, в системе уже записан документ с номером 000004 (или похожим кривым кодом), который сбивает алгоритм. Воспользуемся поиском или сортировкой по колонке «Номер» (или «Код») в списке документов/справочника, чтобы обнаружить этого виновника.

Если визуально в списке найти документ не удается (например, из-за огромного объема данных), целесообразно написать простой запрос в консоли запросов. Напишем пример запроса для поиска последних по коду элементов справочника:


ВЫБРАТЬ ПЕРВЫЕ 50
    Дети.Ссылка КАК Ссылка,
    Дети.Код КАК Код,
    Дети.ЭтоГруппа КАК ЭтоГруппа
ИЗ
    Справочник.Дети КАК Дети
УПОРЯДОЧИТЬ ПО
    Код УБЫВ

Обратите внимание на поле ЭтоГруппа. Если мы анализируем справочник, обязательно проверяйте не только элементы, но и папки (группы). Очень часто именно папка с некорректным кодом (например, код 99 при длине кода 8 символов) мешает автонумерации элементов.

Шаг 2. Корректируем ошибочные номера вручную

Выяснив причину и найдя проблемные объекты, перейдем к их исправлению. Нам необходимо вручную отредактировать коды у всех найденных некорректных элементов.

Приведите номера в соответствие со стандартным шаблоном конфигурации. Например, если длина номера должна быть 11 символов с учетом префикса организации, то вместо 45 запишите БП00-0000045. Обязательно сохраняйте все лидирующие нули и префиксы. Если исправлений требуется слишком много, можно воспользоваться стандартной обработкой «Групповое изменение реквизитов».

Шаг 3. Сбрасываем кэш нумерации на сервере 1С

Даже после того как все некорректные номера в базе данных были успешно исправлены, при создании нового объекта система все равно может предлагать старый ошибочный номер. Это связано с работой кэша сервера приложений 1С. Чтобы очистить кэш и заставить систему пересчитать последний свободный номер на основе реальных данных в таблицах СУБД, нам потребуется выполнить метод ОбновитьНумерациюОбъектов().

Рассмотрим варианты применения этого метода программным путем.

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

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

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

Для точечного обновления нумератора конкретного справочника передадим в качестве параметра объект метаданных этого справочника:


// Обновляем нумерацию только для справочника "Дети"
ОбновитьНумерациюОбъектов(Метаданные.Справочники.Дети);

Если сбой произошел в документах, передаем объект метаданных соответствующего документа:


// Обновляем нумерацию только для документа "РеализацияТоваровУслуг"
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);

Обратите внимание на частую ошибку начинающих разработчиков: передача строкового представления вместо объекта метаданных. Код вида ОбновитьНумерациюОбъектов("Дети") вызовет исключение «Несоответствие типов».

Как запустить этот код в пользовательском режиме?

Разберем, как выполнить данный программный код, если у вас нет под рукой конфигуратора или база находится во фреше (облаке).

  1. Если у вас есть права администратора, откройте меню «Функции для технического специалиста» (в старых версиях — «Все функции»).
  2. Найдите стандартную обработку «Групповое изменение реквизитов».
  3. Выберите нужный тип объекта (например, справочник «Дети»).
  4. Перейдите в локальное меню «Дополнительные параметры» и включите возможность выполнения произвольного алгоритма на встроенном языке.
  5. В поле ввода кода напишите команду обновления нумерации для выбранного объекта и нажмите кнопку выполнения.

Также можно воспользоваться любой внешней обработкой, позволяющей выполнять произвольный код на встроенном языке 1С, открыв ее через меню «Файл» — «Открыть».

Профилактика: как не допустить сбоев нумерации в будущем

Для того чтобы обезопасить базу данных от повторения подобных инцидентов, рекомендуем выполнить следующие настройки:

Мы полностью разобрали проблему сбоя автонумерации в 1С, изучили причины ее возникновения, включая влияние кодов папок и серверного кэширования, и рассмотрели надежный способ исправления с помощью метода ОбновитьНумерациюОбъектов(). Применяйте эти знания на практике, и работа в вашей информационной базе всегда будет стабильной и комфортной.

← На главную