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