Проблема сбитой нумерации в справочнике Номенклатура — одна из самых частых и неприятных задач, с которыми сталкиваются пользователи и администраторы 1С. Система внезапно начинает предлагать странные коды с пробелами, точками или просто перепрыгивает через огромные диапазоны чисел. В этой статье мы подробно разберем, почему это происходит и как вернуть нумерацию в правильное русло, ориентируясь на формат типа ФР-00000000000003098.
Для начала проанализируем внутреннюю логику платформы. В 1С коды справочников являются строковыми данными. Это означает, что при поиске «самого большого» номера система использует лексикографическую (строковую) сортировку, а не математическую. Рассмотрим простой пример: если в базе есть код 000001 и код 7, то с точки зрения системы код 7 будет больше, чем 000001, потому что первый символ «7» старше, чем «0».
Когда вы создаете новый объект, 1С выполняет поиск максимального кода в таблице. Если в базе затесался хотя бы один код вида ФР-745442.084, система увидит, что символ «7» идет после «0», и начнет генерировать следующие номера на основе этого «кривого» значения. Даже если визуально номер кажется короче или длиннее, для автонумератора это новый эталон для инкремента.
Выясним причину сбоя, обнаружив «виновника». Нам необходимо найти все записи, чей код выбивается из общей структуры (например, отсутствуют лидирующие нули или присутствуют лишние точки и пробелы) — для этого подойдёт обработка для массового изменения реквизитов и очистки кодов номенклатуры.
Важный момент: часто визуально код кажется нормальным, но в конце строки могут содержаться скрытые неразрывные пробелы. Проанализируем ситуацию в списке номенклатуры. Нам нужно отсортировать список по колонке Код в порядке убывания. Самые «большие» (с точки зрения системы) коды окажутся сверху. Все, что начинается не на ФР-000..., подлежит ручной корректировке.
Рассмотрим порядок действий по исправлению:
Номенклатура.ФР-745442.084 или любыми другими, где после префикса сразу идут значащие цифры вместо нулей.ФР-00000000000003098.Групповое изменение реквизитов, однако будьте осторожны с маской номера — для массового исправления кодов подойдёт универсальная обработка группового изменения реквизитов для 1С.После того как мы почистили «мусорные» коды, нам нужно сообщить системе, что максимальное значение в базе изменилось. Для этого в платформе существует специальный метод. Посмотрим на пример вызова этой функции через консоль кода или внешнюю обработку:
ОбновитьНумерациюОбъектов(Метаданные.Справочники.Номенклатура);
Этот метод очищает внутренние таблицы платформы, в которых хранится информация о последнем выданном номере. Однако, как показывает практика, в версиях 8.3 этого не всегда достаточно из-за механизма кэширования. Для удобного сброса счетчиков без написания кода подойдёт обработка для вызова обновления нумерации объектов.
В современных версиях 1С:Предприятие 8.3 сервер приложений для повышения производительности резервирует диапазоны номеров (обычно по 10 штук) в памяти. Если вы исправили коды в базе, сервер может продолжать выдавать старые номера из своего кэша. Для решения этой проблемы можно использовать обработку для синхронизации кэша нумератора с базой данных.
Чтобы гарантированно сбросить счетчик, выполните одно из следующих действий:
Автоматически на Не использовать, обновить конфигурацию БД, а затем вернуть настройки назад. Это заставит систему пересчитать актуальный номер.Проанализируем еще одну скрытую проблему: символы-двойники. Иногда префикс ФР- в одном коде написан кириллицей, а в другом — латиницей (буква «Р» выглядит одинаково). Для 1С это абсолютно разные префиксы. Если система видит «латинский» префикс, она будет строить отдельную очередь нумерации для него.
Рекомендуется запустить простую обработку или запрос, чтобы проверить уникальность префиксов:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЛЕВ(Номенклатура.Код, 3) КАК Префикс
ИЗ
Справочник.Номенклатура КАК Номенклатура
Если в результате вы увидите две строки, которые выглядят как ФР-, значит, одна из них содержит латинские символы. Их необходимо исправить на кириллицу.
Если штатная нумерация продолжает сбиваться (например, из-за внешних обменов или специфических обработок), мы можем вмешаться в процесс программно. Для этого в расширении конфигурации перехватим событие ПриУстановкеНовогоКода.
Рассмотрим пример кода, который принудительно устанавливает номер по нужной маске:
&НаСервере
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ЭтоНовый() И ЗначениеЗаполнено(ЭтотОбъект.Код) = Ложь Тогда
// Здесь можно реализовать поиск последнего правильного номера
// и инкрементировать его вручную, игнорируя "кривые" коды.
КонецЕсли;
КонецПроцедуры
Однако помните, что это «костыльное» решение. Правильнее один раз навести порядок в данных и устранить причину появления некорректных номеров (например, запретить пользователям редактировать поле Код вручную через настройки прав доступа).
Мы выяснили, что сбой нумерации — это всегда следствие появления в базе кода, который нарушает строковую последовательность. Для исправления ситуации выполним следующие действия:
ФР-000....ОбновитьНумерациюОбъектов.Соблюдение чистоты данных в справочниках — залог стабильной работы механизмов автонумерации 1С.