Как исправить сбившуюся нумерацию документов в 1С:Бухгалтерии 3.0?

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

Сбой автоматической нумерации документов — одна из распространенных проблем в типовых конфигурациях 1С, в частности в 1С:Бухгалтерия предприятия 3.0. Часто ситуация возникает из-за ручного вмешательства пользователя: достаточно изменить формат одного номера (добавить лишний дефис, убрать лидирующие нули или изменить префикс), как последующие документы начинают создаваться с некорректными номерами, а стандартный вызов метода обновления нумерации не дает ожидаемого результата.

Разберем детально, как платформа 1С и библиотека стандартных подсистем (БСП) формируют номера, почему возникают сбои и как по шагам восстановить правильную последовательность.

Почему сбивается автонумерация в 1С

Проанализируем базовые механизмы платформы и типовых конфигураций, влияющие на расчет нового номера:

  1. Алгоритм выделения числовой части платформой. Платформа 1С определяет числовую часть номера строго справа налево до первого нецифрового символа (буквы, пробела или дефиса). Все символы, находящиеся левее этой позиции, воспринимаются как префикс. Если пользователь сохраняет документ с номером вида С-00-1, платформа определяет префикс как С-00-, а числовую часть — всего лишь как 1. Разрядность числа резко сокращается, и следующий номер не может корректно масштабироваться в пределах стандартной длины.
  2. Лексикографическое сравнение строк в базе данных. Поле номера в метаданных имеет строковый тип фиксированной длины (в типовой БП 3.0 для платежных поручений — 11 символов вида 0000-000000). Поиск максимального существующего номера СУБД выполняет посимвольно. Если пользователь вручную ввел короткий номер без лидирующих нулей (например, С000-9 вместо С000-000009), то при сравнении строк С000-9 оказывается лексикографически больше, чем С000-000009. В итоге автоинкремент пытается сформировать следующий номер от некорректной короткой строки.
  3. Подсистема префиксации БСП. В типовых решениях номер генерируется через подписку на событие ПриУстановкеНовогоНомера. Префикс формируется по строгому шаблону: [ПрефиксОрганизации(2)][ПрефиксИБ(2)]-[Номер(6)]. Вызов метода ОбновитьНумерациюОбъектов() лишь сбрасывает кэш нумератора на сервере, но если в информационной базе остался хотя бы один документ с нарушенной маской, при первой же попытке сформировать новый номер БСП снова выберет этот максимальный «кривой» номер в качестве базового.

Особенность поведения поиска по номеру с дефисами

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

В языке поисковых выражений полнотекстового поиска 1С знак дефиса (минуса -) зарезервирован как оператор логического отрицания (НЕ / NOT), а также может разделять слова. При поиске по шаблону С-00-0 система пытается найти вхождения буквы «С», исключая последующие части строки. Чтобы найти точный номер с дефисами через строку поиска, обязательно заключайте выражение в двойные кавычки: "С-00-0".

Пошаговый алгоритм восстановления нумерации

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

Шаг 1. Поиск всех документов с нарушенной структурой номера

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


ВЫБРАТЬ
    Док.Ссылка КАК Документ,
    Док.Дата КАК Дата,
    Док.Номер КАК Номер,
    ДЛИНА(Док.Номер) КАК ДлинаНомера
ИЗ
    Документ.ПлатежноеПоручение КАК Док
ГДЕ
    Док.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ТекущаяДата, ГОД) И КОНЕЦПЕРИОДА(&ТекущаяДата, ГОД)
    И (ДЛИНА(Док.Номер) <> 11
        ИЛИ Док.Номер ПОДОБНО "%-%-%"
        ИЛИ Док.Номер ПОДОБНО "% %")

Этот запрос позволит выявить документы, где длина номера отличается от 11 символов, присутствуют лишние дефисы или случайные пробелы.

Шаг 2. Исправление номеров и восстановление разрядности

Приведем номера всех найденных документов к типовому формату: 4 знака префикса + дефис + 6 знаков номера с лидирующими нулями (например, 0000-000123 или С000-000123). Для массового исправления воспользуемся типовой обработкой «Групповое изменение реквизитов» или выполним программную перезапись:


Выборка = Документы.ПлатежноеПоручение.Выбрать(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата()));
Пока Выборка.Следующий() Цикл
    // Проверяем и корректируем номер при необходимости
    ОбъектДок = Выборка.ПолучитьОбъект();
    ОбъектДок.ОбменДанными.Загрузка = Истина; // Отключаем подписки БСП при перезаписи
    
    // Пример приведения: устанавливаем верный номер вручную
    // ОбъектДок.Номер = "0000-000124";
    // ОбъектДок.Записать();
КонецЦикла;

Важно: При программном изменении номеров обязательно устанавливайте режим ОбменДанными.Загрузка = Истина, чтобы избежать срабатывания типовых обработчиков подсистемы префиксации БСП при записи объекта.

Шаг 3. Сброс нумератора платформы

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

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

Шаг 4. Очистка кэша и перезапуск сервера (при необходимости)

Если после выполнения предыдущих действий при создании нового документа номер продолжает формироваться некорректно:

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