Почему в 1С при открытии документа сразу присваивается номер и как это исправить

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

Многие разработчики и пользователи сталкиваются с загадочным поведением системы: при создании нового документа ему сразу присваивается очередной номер. Если пользователь передумал и закрыл форму без сохранения, этот номер «сгорает», и следующий документ получает номер через один. Разберем подробно, почему так происходит, как работает механизм нумерации в 1С и как настроить систему так, чтобы номера не пропадали зря.

Разбираемся в причинах: Механизм «Менеджера нумерации»

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

Рассмотрим два сценария работы системы:

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

В старых конфигурациях или нетиповых документах (как в рассматриваемом случае с БГУ 1.0 на обычных формах) по умолчанию может стоять режим получения номера при открытии. Это и приводит к тому, что нумерация «сходит с ума».

Способ 1. Изменение свойств формы (визуальный метод)

Если вы работаете с обычными формами (что характерно для конфигураций типа БГУ 1.0, УПП 1.3 или старых самописных решений), решение проблемы заключается в настройке свойств самой формы документа. Выполним следующие шаги:

  1. Откроем конфигуратор и найдем нужный документ.
  2. Перейдем на закладку Формы и откроем форму документа (обычно это ФормаОбъекта).
  3. Вызовем палитру свойств формы (правой кнопкой мыши по форме — Свойства).
  4. Найдем раздел Использование и в нем свойство Автонумерация.
  5. Изменим значение с Авто или Использовать на Не использовать.

Важный нюанс: После этого изменения при открытии нового документа поле «Номер» будет оставаться пустым. Это нормально. Номер будет автоматически присвоен системой в момент нажатия кнопки «Записать» или «ОК».

Способ 2. Программное управление нумерацией в форме

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


Процедура ПриОткрытии()
    // Отключаем автоматическое получение номера при открытии формы
    ЭтаФорма.АвтонумерацияВФорме = АвтонумерацияВФорме.НеИспользовать;
КонецПроцедуры

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

Анализируем ситуацию с кэшированием номеров

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

Как правильно работать с нумерацией в нетиповых документах

Если вы создаете документ «с нуля», проанализируем лучшие практики настройки нумерации:

  1. Длина номера и тип: Всегда используйте тип Строка. Это позволит системе корректно обрабатывать префиксы организаций и узлов распределенных баз данных (РИБ).
  2. Событие ПриУстановкеНовогоНомера: Вместо того чтобы писать логику в форме, используйте модуль объекта. Рассмотрим пример кода в модуле документа:

Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    // Здесь можно добавить префикс организации или подразделения
    Префикс = "БП-"; 
    // СтандартнаяОбработка = Истина означает, что 1С сама добавит цифры к этому префиксу
КонецПроцедуры

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

Что делать, если номера уже «сбились»?

Если из-за ручных правок или неправильной настройки автонумерация начала выдавать странные результаты (например, предлагает номер 000000099 после 000000100), проанализируем механизм исправления. Нам поможет встроенная функция ОбновитьНумерациюОбъектов. Она заставляет платформу пересчитать максимальный номер, игнорируя кэш.

Для исправления запустим внешнюю обработку или воспользуемся консолью кода:


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

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

Резюме для разработчика

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

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

← На главную