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

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

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

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

Разберем причину: почему номер скрыт по умолчанию

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

Существует два основных подхода к генерации номера:

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

Если в настройках вашего документа или в самой форме не прописана логика получения номера при создании, поле останется пустым до момента записи.

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

Рассмотрим наиболее надежный способ вывода номера — принудительный вызов генерации номера в модуле формы документа. Для этого используется стандартное событие ПриОткрытии. Как мы видим из обсуждения, именно этот метод помог решить проблему автору вопроса.

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


Процедура ПриОткрытии()
    
    // Проверяем, что документ является новым, а не открывается для редактирования
    Если ЭтоНовый() Тогда
        
        // Вызываем стандартную процедуру из общего модуля для установки номера
        // Этот метод учитывает префиксы организации и другие настройки нумерации
        ОбщегоНазначения.УстановитьНомерДокумента(ЭтотОбъект);
        
    КонецЕсли;

КонецПроцедуры

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

Рассмотрим подробнее, что делает этот метод:

Способ 2: Настройка свойства "Автонумерация" в конфигураторе

Если мы не хотим писать код, мы можем проверить настройки самого объекта в Конфигураторе. Посмотрим на свойство Автонумерация, которое находится на вкладке "Основные" свойств документа.

Там доступны следующие значения:

Однако стоит помнить, что в "Обычных формах" (как в нашем примере) на форме документа также есть свойство самого элемента управления "Поле ввода", связанного с номером. Убедитесь, что свойство ТолькоПросмотр не мешает отображению данных, хотя в данном случае проблема была именно в отсутствии самого значения в реквизите Номер.

Нюансы и риски: пропуски в нумерации

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

Рассмотрим ситуацию:

  1. Бухгалтер нажал кнопку "Создать", система вызвала УстановитьНовыйНомер() и показала номер 000001.
  2. В это же время второй бухгалтер нажал "Создать", и если первый еще не записал документ, система может (в зависимости от настроек блокировок) выдать второму тот же номер или следующий — 000002.
  3. Первый бухгалтер решил, что документ ему не нужен, и просто закрыл форму без сохранения.
  4. В итоге в базе будет документ №000002, а №000001 исчезнет навсегда.

Если для вашей организации критично отсутствие пропусков (например, в счетах-фактурах), рекомендуем оставить стандартное поведение системы — присвоение номера при записи.

Взаимосвязь номера с датой и префиксом

Выясним еще одну причину, почему номер может меняться или не отображаться. Номер часто зависит от реквизитов Дата и Организация.

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

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


Процедура ОрганизацияПриИзменении(Элемент)
    // При смене организации префикс должен обновиться
    Если ЭтоНовый() Тогда
        ЭтотОбъект.УстановитьНовыйНомер();
    КонецЕсли;
КонецПроцедуры

Особенности для управляемых форм

Хотя в примере автора используются обычные формы (ЭлементыФормы), важно отметить, что в управляемом приложении (интерфейс "Такси") политика 1С еще более строгая. Там номер практически никогда не выводится до записи. Это связано с оптимизацией клиент-серверного взаимодействия. Если вам крайне необходимо видеть номер в управляемой форме, логика будет схожей, но реализовать ее придется в серверном контексте, например, в процедуре ПриСозданииНаСервере.

Итоги

Мы рассмотрели проблему отсутствия номера в новом документе и нашли решение. Подведем итог нашим действиям:

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

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

← На главную