Как восстановить автоматическую нумерацию документов в 1С при сбое префиксов?

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

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

Разберем механизм поиска максимального номера

Для начала проанализируем ситуацию с точки зрения платформы 1С. Когда создается новый документ, система выполняет поиск максимального номера в базе данных для данного типа документа (и, если установлена периодичность, в рамках периода). Важно понимать, что 1С работает с номером не как с числом, а как со строкой. Сравнение идет посимвольно слева направо.

Рассмотрим пример из темы: был префикс ЛП, его сменили на Лпл, а затем решили вернуться к ЛП. Однако система продолжает предлагать Лпл00000125. Почему так происходит? Дело в алфавитном порядке. Строка Лпл при сравнении оказывается «больше», чем ЛП, поскольку строчная буква «п» в кодировке стоит позже заглавной «П» (или просто за счет разницы в символах). Пока в базе существует хотя бы один документ с префиксом Лпл, алгоритм поиска максимального значения будет всегда цепляться за него, считая его «самым свежим».

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

Метод 1. Ручная корректировка и обновление нумерации

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

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

Проанализируем программный вызов этого метода. Его можно запустить через внешнюю обработку или консоль кода:


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

После выполнения этой команды система при создании следующего документа заново просканирует таблицу базы данных и, увидев ваш вручную созданный номер ЛП000000201, предложит ЛП000000202.

Метод 2. Использование обработки «Универсальные подбор и обработка объектов»

Если документов с «неправильными» номерами много, исправлять их вручную трудозатратно. В конфигурациях на обычных формах (таких как «Комплексная автоматизация 1.1» или «УПП») часто используется обработка УниверсальныеПодборИОбработкаОбъектов.

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

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

Метод 3. Проверка скрытых причин в базе данных

Если вышеописанные методы не помогают, выясним причину глубже. Существует несколько «подводных камней»:

1. Помеченные на удаление объекты. Платформа 1С при поиске максимального номера анализирует ВСЕ документы, включая те, что помечены на удаление. Если в базе лежит «битый» документ с префиксом Лпл, помеченный на удаление, он все равно будет влиять на автонумерацию. Необходимо либо окончательно удалить такие объекты через «Удаление помеченных объектов», либо вручную исправить в них номера на старые/другие.

2. Префикс информационной базы. Проанализируем настройки программы. Кроме префикса организации, в 1С существует «Префикс информационной базы» (актуально для распределенных баз данных или обменов). Итоговый префикс документа — это составная строка. Например, ЛП (организация) + 01 (база) = ЛП01.... Если в настройках учета был случайно изменен префикс базы, система начнет новую нумерацию, и старые методы исправления не помогут, пока настройки не будут возвращены в исходное состояние.

3. Кэширование на сервере. В клиент-серверных версиях платформы (начиная с 8.2) реализован механизм кэширования номеров. Сервер «бронирует» диапазон номеров для ускорения работы. Если произошел сбой, эти номера могут «повиснуть» в памяти. В этом случае команда ОбновитьНумерациюОбъектов должна помочь, но в исключительных ситуациях может потребоваться перезапуск службы Server 1C:Enterprise.

Практические советы по работе с префиксами

Чтобы избежать подобных проблем в будущем, рассмотрим рекомендации профессиональных разработчиков:

Посмотрим на пример кода, который можно использовать для отладки текущего состояния нумерации. Этот код выводит в сообщение следующий номер, который выдаст система:


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

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

← На главную