Почему при создании элемента справочника появляется лишний префикс и как восстановить нумерацию?

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

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

Как платформа 1С формирует новые коды и почему возникает сбой

Проанализируем базовый механизм автонумерации платформы. Когда вызывается метод УстановитьНовыйКод(), платформа определяет следующий номер на основе существующих записей в таблице базы данных. Выделение числовой части происходит справа налево: последовательность цифр с правого края воспринимается как числовой номер, а всё, что находится левее, интерпретируется как префикс.

При сортировке строковых кодов используется лексикографический порядок. В кодировке символов любая буква (включая «И») располагается старше цифр от 0 до 9. Если в информационной базе хотя бы один раз появился элемент, чей код начинается с буквы, платформа считает этот код наибольшим и начинает генерировать все последующие значения с тем же префиксом.

При этом удаление ошибочного элемента или исправление его кода в режиме «1С:Предприятие» не всегда сразу возвращает прежнюю нумерацию. Рассмотрим основные факторы, влияющие на это:

  1. Кэш сервиса нумерации: В клиент-серверном варианте кластер серверов 1С кэширует диапазоны свободных номеров и кодов в оперативной памяти рабочих процессов для оптимизации производительности. Даже если объект был изменен или удален, сервис кластера может продолжать выдавать коды на основе устаревших данных из памяти.
  2. Помеченные на удаление элементы: Стандартный генератор платформы учитывает все существующие записи, в том числе помеченные на удаление. Если объект не был удален физически, он продолжает сбивать автонумерацию.
  3. События назначения префикса: В конфигурациях префиксы часто задаются через событие ПриУстановкеНовогоКода модуля объекта или соответствующие подписки на события, а также могут считываться из кодов предопределенного узла плана обмена ЭтотУзел либо констант префикса базы.

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


тмц = Справочники.Номенклатура.СоздатьЭлемент();
// До вызова метода код остается пустым
тмц.УстановитьНовыйКод();
// После вызова генерируется код со сбившимся префиксом
Сообщить("Сгенерированный код: " + тмц.Код);

Способ 1. Программный сброс кэша с помощью ОбновитьНумерациюОбъектов

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

Этот метод заставляет сервер перечитать максимальные номера непосредственно из таблиц базы данных. Выполнять его должен пользователь с административными правами. Посмотрим на пример кода обработки:


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

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

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

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

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

Способ 2. Поиск и устранение элементов, нарушивших последовательность

Разберем по шагам, как найти источник проблемы, если визуально в списке справочника «кривой» код не виден:

  1. Выполним запрос к базе данных, чтобы найти все элементы (включая группы и помеченные на удаление объекты), содержащие подозрительный префикс:
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Номенклатура.Ссылка,
        |	Номенклатура.Код,
        |	Номенклатура.ПометкаУдаления
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |	Номенклатура.Код ПОДОБНО ""И%""";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Сообщить("Найден объект: " + Строка(Выборка.Ссылка) + " с кодом " + Выборка.Код);
    КонецЦикла;
    
  2. Если найдены помеченные на удаление элементы, выполним их окончательное удаление через стандартную обработку Удаление помеченных объектов с обязательным контролем ссылочной целостности.
  3. Если элементы используются в документах, исправим их коды вручную или с помощью группового изменения реквизитов, приведя к требуемому числовому формату.
  4. После корректировки выполним метод ОбновитьНумерациюОбъектов(), описанный выше.

Способ 3. Перезапуск службы сервера или очистка кэша

Проанализируем ситуацию, когда все коды в базе исправлены, но метод автонумерации все равно выдает старый префикс. Это указывает на то, что информация застряла в оперативной памяти процессов сервера 1С.

В этом случае помогают административные действия:

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