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

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

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

Свойство формы «Автонумерация»

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

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

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

Другие факторы, влияющие на получение кода при открытии

Если свойство Автонумерация на форме включено, но код всё равно не отображается при создании нового элемента, выясним причину через проверку дополнительных настроек конфигурации:

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

Риски и ограничения генерации кода при открытии

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

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

Программное управление автонумерацией

Если вам требуется принудительно получить и отобразить код до момента записи элемента, можно воспользоваться стандартными программными средствами платформы.

Для явного присвоения кода объекту используется метод УстановитьНовыйКод(). Посмотрим на пример вызова:


// Принудительное назначение нового кода с учетом префикса
ЭтотОбъект.УстановитьНовыйКод("ПРФ_");

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


Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
    
    // Переопределяем префикс нумерации
    Префикс = "ОСН_";
    
КонецПроцедуры

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

← На главную