Как правильно настроить автоматическую перенумерацию документов в 1С:Предприятие 8.3

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

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

Почему не стоит изменять номер в модуле формы

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

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

Использование метода УстановитьНовыйНомер()

Для того чтобы система пересчитала номер с учетом вашего префикса, в платформе предусмотрен стандартный метод УстановитьНовыйНомер(). Проанализируем, как его правильно применять. Наилучшим местом для вызова этого метода является процедура ПередЗаписью в модуле объекта документа.

Рассмотрим пример кода, который добавляет префикс в зависимости от определенного условия (например, если в документе выбран определенный флаг или реквизит):


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Проверяем, что это новый документ, чтобы не менять номер у уже существующих
    Если ЭтоНовый() Тогда
        ПрефиксДокумента = "НС00-";
        Если ДополнительныйПризнак Тогда
            ПрефиксДокумента = ПрефиксДокумента + "тс";
        КонецЕсли;
        
        // Метод устанавливает следующий свободный номер с учетом указанного префикса
        УстановитьНовыйНомер(ПрефиксДокумента);
    КонецЕсли;
    
КонецПроцедуры

При использовании этого метода важно помнить: если вы передаете префикс, который ранее не использовался в системе, 1С начнет нумерацию для него с единицы (например, «НС00-тс00001»).

Динамическая нумерация через подписки на события

Наиболее современным и «чистым» способом изменения нумерации в 1С является использование подписок на события. Этот метод позволяет не изменять типовую конфигурацию (если вы работаете в расширении или просто хотите сохранить модули объектов в чистоте). Для управления нумерацией идеально подходит событие ПриУстановкеНовогоНомера.

Разберем алгоритм работы с подпиской:

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

Пример обработчика в общем модуле:


Процедура ПриУстановкеНовогоНомераДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
    
    // Источник — это сам объект документа
    // Мы можем изменить переменную Префикс, и платформа сама подставит её в номер
    
    НовыйПрефикс = "ОТД1-";
    
    // Если нужно добавить логику БСП (Библиотеки стандартных подсистем):
    // ПрефиксацияОбъектовСобытия.УстановитьПрефикс(Источник, НовыйПрефикс);
    
    Префикс = НовыйПрефикс;
    
КонецПроцедуры

Механизм кэширования номеров в 1С 8.3

Начиная с версии платформы 8.3.15, по умолчанию включено кэширование номеров. Проанализируем ситуацию: сервер 1С «бронирует» для себя пачку номеров (например, с 1 по 10). Если в процессе записи документа произошла ошибка или пользователь закрыл форму, номер 1 «сгорает», и следующий документ получит номер 2. Это приводит к пропускам («дырам») в нумерации.

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

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

Исправление «сбитой» нумерации: ОбновитьНумерациюОбъектов

Иногда автонумерация перестает работать корректно: система выдает ошибку «Номер не уникален» или предлагает странные индексы. Выясним причину: в базе данных хранится таблица последних выданных номеров. Если вы вручную редактировали номера или программно записывали документы с нарушением логики префиксов, эта таблица может содержать некорректные данные.

Для «сброса» этого состояния используем метод ОбновитьНумерациюОбъектов(). Рассмотрим пример небольшого кода для исправления ситуации:


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

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

Особенности сортировки и ведущие нули

Платформа 1С использует строковое представление номера и посимвольное сравнение. Проанализируем пример: если у вас есть номера «А9» и «А10», то с точки зрения системы «А9» больше, чем «А10», потому что символ «9» стоит позже «1». Чтобы автонумерация работала правильно, всегда сохраняйте ведущие нули (например, «А0009» и «А0010»).

Если при ручной перенумерации или использовании внешних обработок вы случайно уберете нули, автонумерация может «застрять» на одном номере. При массовой программной перенумерации всегда используйте флаг ОбменДанными.Загрузка = Истина, чтобы отключить лишние проверки, но будьте предельно внимательны к формату строки номера.

Итоги и рекомендации

Подведем итог нашему разбору. Для реализации надежной системы нумерации в 1С 8.3 придерживайтесь следующих принципов:

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

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

← На главную