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