Почему сбилась нумерация документов после обновления и появились номера вида 0000-0000-1?

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

С ситуацией, когда после планового обновления конфигурации (чаще всего «Управление торговлей», «ERP» или «Комплексная автоматизация») вдруг ломается привычная нумерация документов, сталкивались многие специалисты. Вместо привычного номера 0000-008314 система начинает выдавать странные конструкции вида 0000-0000-1, добавляя лишние дефисы, нули или меняя структуру префикса. Давайте разберем эту проблему подробно, проанализируем причины её возникновения и выработаем алгоритм действий для восстановления порядка.

Суть проблемы: конфликт пространств нумерации

В основе механизма автонумерации в платформе 1С:Предприятие лежит простой принцип: система ищет максимальный номер в базе данных, который соответствует текущему префиксу, и увеличивает его на единицу. Однако, когда мы видим, что номер изменился с 0000-008314 на 0000-0000-1, это означает, что платформа начала работать в новом пространстве нумерации.

Рассмотрим, почему это происходит. Механизм префиксации в современных конфигурациях (на базе БСП — Библиотеки Стандартных Подсистем) формирует итоговый номер из нескольких частей:

  1. Префикс организации (например, "00").
  2. Префикс информационной базы (например, "УТ" или "00").
  3. Пользовательский префикс (если есть).
  4. Собственно цифровой номер.

Если после обновления в алгоритме формирования префикса произошли изменения — например, добавился лишний дефис или изменился порядок сбора строки — система считает, что это совершенно новый поток документов. Для платформы номер с префиксом 0000- и номер с префиксом 0000-00- — это разные вселенные. Не найдя ни одного документа с новым "длинным" префиксом, платформа начинает отсчет с единицы.

Опасное решение: изменение длины номера

В попытках быстро исправить ситуацию, некоторые специалисты (как и автор рассматриваемой темы) прибегают к изменению длины номера в конфигураторе. Например, увеличивают длину строки с 11 до 13 символов, чтобы новые "длинные" номера помещались и не вызывали ошибку уникальности.

Мы настоятельно не рекомендуем так делать по следующим причинам:

  1. Нарушение сортировки. Поля номера имеют строковый тип. При сортировке строк "10" меньше "9", так как первый символ "1" меньше "9". Для корректной работы автонумерации необходимы лидирующие нули (например, "009" и "010"). Увеличив длину и получив номера разной разрядности в одной таблице, мы ломаем механизм поиска максимального номера.
  2. Проблемы с поддержкой. Изменение стандартных реквизитов затрудняет последующие обновления типовой конфигурации.
  3. Визуальный хаос. В списках документов нарушится хронологический порядок, если он был настроен по номеру.

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

Диагностика причин сбоя

Прежде чем приступать к исправлению ("лечению"), необходимо точно установить причину. Рассмотрим возможные варианты:

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

    Решение: Проверить наличие исправлений (патчей) или более свежего релиза конфигурации. В примере автора помогло обновление с версии 3.2 на 3.3.

  2. Ручное вмешательство. Кто-то из пользователей мог вручную отредактировать номер документа, задав ему нестандартный формат. Платформа может "подхватить" этот новый формат как образец.
  3. Смена префиксов. Были изменены настройки префиксации в карточке Организации или в настройках синхронизации (Префикс РИБ).

Алгоритм восстановления нумерации

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

Шаг 1: Поиск и исправление "кривых" номеров

Самое важное правило: пока в системе есть хотя бы один документ с неправильным форматом номера, который хронологически (или по сортировке) является "последним", автонумерация будет работать неправильно.

Нам необходимо найти все документы, созданные после сбоя (вида 0000-0000-1, 0000-0000-2 и т.д.), и перенумеровать их в соответствии со старым форматом (продолжить серию 0000-008315, 0000-008316...).

Для поиска проблемных документов лучше использовать консоль запросов. Обратите внимание, что простая сортировка по убыванию номера может не показать проблему, если длина строк отличается. Используйте сортировку с учетом длины:


ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка,
    РеализацияТоваровУслуг.Дата,
    РеализацияТоваровУслуг.Номер,
    ДЛИНАСТРОКИ(РеализацияТоваровУслуг.Номер) КАК ДлинаНомера
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
    РеализацияТоваровУслуг.Дата >= &ДатаСбоя
УПОРЯДОЧИТЬ ПО
    ДлинаНомера УБЫВ,
    РеализацияТоваровУслуг.Номер УБЫВ

Найденные документы необходимо перенумеровать. Это можно сделать вручную, если документов немного, или написать простую обработку, которая присвоит корректные номера (не забываем про режим ОбменДанными.Загрузка = Истина, чтобы не срабатывали лишние проверки при записи).

Шаг 2: Сброс кеша нумератора

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

Чтобы заставить платформу "забыть" неправильную серию и заново просканировать базу в поисках настоящего максимального номера, необходимо использовать метод ОбновитьНумерациюОбъектов.

Выполнить этот код можно в обработке или через "Функции для технического специалиста" -> "Стандартные" -> "Управление нумерацией" (если такая обработка встроена в БСП вашей конфигурации), либо просто запустить внешний код:


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

// Или, если нужно обновить вообще всё (может занять время)
ОбновитьНумерациюОбъектов();

Этот метод сбрасывает буфер нумератора. При следующем создании документа система обратится к базе данных, увидит наш исправленный номер 0000-0083XX и корректно присвоит следующий 0000-0083(XX+1).

Особенности работы с префиксами в БСП

В конфигурациях на базе БСП (ERP, КА, УТ) логика формирования номера часто вынесена в подписки на события (например, ПриУстановкеНовогоНомера). Если проблема не уходит, имеет смысл включить отладку и поставить точку останова в модуле объекта документа в процедуре ПриУстановкеНовогоНомера или в общем модуле ПрефиксацияОбъектовСобытия.

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


Процедура УстановитьПрефикс(Источник, Префикс, ...)
    // Если здесь "Префикс" уже содержит дефис,
    // а потом код добавляет еще один дефис - мы получим двойной разделитель.
    // Это часто случается при ошибках в обновлении общих модулей.
КонецПроцедуры

В теме на форуме выяснилось, что проблема была именно в обновлении (переход с 3.2 на 3.3). Это подтверждает правило: если код типовой и сбой произошел массово после обновления — в первую очередь проверяем список ошибок релиза на сайте поддержки и ищем обсуждения коллег.

Резюме

Если у вас слетела нумерация после обновления, выполните следующие действия:

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

Такой подход позволит вам сохранить целостность данных и избежать проблем с хронологией документов в будущем.

← На главную