Как исправить сбитую нумерацию номенклатуры в 1С:Управление нашей фирмой 8.3

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

Проблема сбитой нумерации в справочнике Номенклатура — одна из самых частых и неприятных задач, с которыми сталкиваются пользователи и администраторы 1С. Система внезапно начинает предлагать странные коды с пробелами, точками или просто перепрыгивает через огромные диапазоны чисел. В этой статье мы подробно разберем, почему это происходит и как вернуть нумерацию в правильное русло, ориентируясь на формат типа ФР-00000000000003098.

Разберем причину: как 1С выбирает следующий номер

Для начала проанализируем внутреннюю логику платформы. В 1С коды справочников являются строковыми данными. Это означает, что при поиске «самого большого» номера система использует лексикографическую (строковую) сортировку, а не математическую. Рассмотрим простой пример: если в базе есть код 000001 и код 7, то с точки зрения системы код 7 будет больше, чем 000001, потому что первый символ «7» старше, чем «0».

Когда вы создаете новый объект, 1С выполняет поиск максимального кода в таблице. Если в базе затесался хотя бы один код вида ФР-745442.084, система увидит, что символ «7» идет после «0», и начнет генерировать следующие номера на основе этого «кривого» значения. Даже если визуально номер кажется короче или длиннее, для автонумератора это новый эталон для инкремента.

Шаг 1. Поиск и исправление некорректных кодов

Выясним причину сбоя, обнаружив «виновника». Нам необходимо найти все записи, чей код выбивается из общей структуры (например, отсутствуют лидирующие нули или присутствуют лишние точки и пробелы) — для этого подойдёт обработка для массового изменения реквизитов и очистки кодов номенклатуры.

Важный момент: часто визуально код кажется нормальным, но в конце строки могут содержаться скрытые неразрывные пробелы. Проанализируем ситуацию в списке номенклатуры. Нам нужно отсортировать список по колонке Код в порядке убывания. Самые «большие» (с точки зрения системы) коды окажутся сверху. Все, что начинается не на ФР-000..., подлежит ручной корректировке.

Рассмотрим порядок действий по исправлению:

  1. Открываем справочник Номенклатура.
  2. Находим все записи с кодами типа ФР-745442.084 или любыми другими, где после префикса сразу идут значащие цифры вместо нулей.
  3. Вручную переименовываем эти коды, приводя их к правильному виду, например, ФР-00000000000003098.
  4. Если таких записей много, рекомендуется использовать обработку Групповое изменение реквизитов, однако будьте осторожны с маской номера — для массового исправления кодов подойдёт универсальная обработка группового изменения реквизитов для 1С.

Шаг 2. Использование штатных средств восстановления

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

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

Этот метод очищает внутренние таблицы платформы, в которых хранится информация о последнем выданном номере. Однако, как показывает практика, в версиях 8.3 этого не всегда достаточно из-за механизма кэширования. Для удобного сброса счетчиков без написания кода подойдёт обработка для вызова обновления нумерации объектов.

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

В современных версиях 1С:Предприятие 8.3 сервер приложений для повышения производительности резервирует диапазоны номеров (обычно по 10 штук) в памяти. Если вы исправили коды в базе, сервер может продолжать выдавать старые номера из своего кэша. Для решения этой проблемы можно использовать обработку для синхронизации кэша нумератора с базой данных.

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

Шаг 4. Проверка префиксов и раскладки клавиатуры

Проанализируем еще одну скрытую проблему: символы-двойники. Иногда префикс ФР- в одном коде написан кириллицей, а в другом — латиницей (буква «Р» выглядит одинаково). Для 1С это абсолютно разные префиксы. Если система видит «латинский» префикс, она будет строить отдельную очередь нумерации для него.

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


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЛЕВ(Номенклатура.Код, 3) КАК Префикс
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Если в результате вы увидите две строки, которые выглядят как ФР-, значит, одна из них содержит латинские символы. Их необходимо исправить на кириллицу.

Шаг 5. Радикальное решение через расширение

Если штатная нумерация продолжает сбиваться (например, из-за внешних обменов или специфических обработок), мы можем вмешаться в процесс программно. Для этого в расширении конфигурации перехватим событие ПриУстановкеНовогоКода.

Рассмотрим пример кода, который принудительно устанавливает номер по нужной маске:


&НаСервере
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если ЭтоНовый() И ЗначениеЗаполнено(ЭтотОбъект.Код) = Ложь Тогда
        // Здесь можно реализовать поиск последнего правильного номера
        // и инкрементировать его вручную, игнорируя "кривые" коды.
    КонецЕсли;
КонецПроцедуры

Однако помните, что это «костыльное» решение. Правильнее один раз навести порядок в данных и устранить причину появления некорректных номеров (например, запретить пользователям редактировать поле Код вручную через настройки прав доступа).

Выводы и рекомендации

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

  1. Удалим или переименуем все коды, не соответствующие маске ФР-000....
  2. Обязательно проверим отсутствие пробелов в конце строки.
  3. Выполним команду ОбновитьНумерациюОбъектов.
  4. При необходимости перезагрузим сервер 1С для очистки кэша.

Соблюдение чистоты данных в справочниках — залог стабильной работы механизмов автонумерации 1С.

← На главную