Разберем ситуацию, с которой часто сталкиваются разработчики при создании нетиповых документов в 1С: при открытии формы нового объекта ему сразу же автоматически присваивается номер. В типовых решениях (например, в документе «Реализация товаров и услуг») поле «Номер» при создании остается пустым и заполняется только в момент сохранения. Выясним, почему возникает такое поведение, какие риски оно в себе таит и как правильно настроить нумерацию.
Проанализируем основные факторы, из-за которых платформой 1С или кодом конфигурации генерируется номер объекта еще до его записи в базу данных:
Автонумерация. Если оно установлено в значение Истина (или включена автоматическая генерация), платформа запрашивает новый номер из системы нумерации непосредственно в момент инициализации формы нового документа.ПередОткрытием или ПриОткрытием (для обычных форм), либо ПриСозданииНаСервере (для управляемых форм) может присутствовать явный вызов метода:
УстановитьНовыйНомер();
Или с передачей префикса:
УстановитьНовыйНомер(ПрефиксНомера);
Нумератор или обрабатываться подпиской на событие, где в обработчиках заполнения на основании или создания объекта генерируется очередной номер.Режим автонумерации объектов может влиять на то, как платформа распределяет и резервирует номера.Рассмотрим, почему генерация номера при открытии формы считается нежелательной практикой в разработке 1С:
1. Пропуски в нумерации. Если пользователь нажимает кнопку «Создать», получает номер (например, 000005), а затем передумывает и закрывает форму без сохранения, данный номер теряется. В результате в хронологии документов образуются «дыры», что крайне нежелательно для бухгалтерского и налогового учета.
2. Конфликты и блокировки. При одновременной работе нескольких пользователей два оператора могут одновременно открыть форму создания документа. Если система пытается сразу сгенерировать номер, возникают транзакционные блокировки таблиц нумерации, что ведет к замедлению работы или ошибкам таймаута.
3. Некорректность префиксов и периодичности. Если номер сформирован при открытии с текущей датой, а пользователь затем меняет дату документа на прошлый период или выбирает другую организацию, полученный номер станет неверным и потребует повторного пересчета.
Разберем по шагам, как исправить форму документа, чтобы номер присваивался стандартным образом — только при сохранении документа в базу данных.
Шаг 1. Отключение автонумерации в свойствах формы
Перейдем в конфигуратор, откроем форму нового документа и обратим внимание на ее свойства:
Автонумерация).Не использовать или снимем соответствующий флаг.Шаг 2. Проверка программного кода
Проанализируем модуль формы и модуль объекта на наличие явных вызовов генерации номера. Выполним глобальный поиск по конфигурации или контекстный поиск по модулю формы для вызова УстановитьНовыйНомер. Если данный метод вызывается при открытии формы без необходимости, удалим или закомментируем эту строку.
Шаг 3. Настройка нумерации при записи в модуле объекта
Рекомендуемый подход — доверить автонумерацию самой платформе 1С в момент записи или перехватывать событие ПриУстановкеНовогоНомера в модуле объекта:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Формируем нужный префикс организации или подразделения
Префикс = "ОБ-" + СокрЛП(Организация.Префикс);
КонецПроцедуры
При таком подходе поле номера на форме при создании документа остается пустым (или содержит визуальную заглушку вроде «Не назначен»), а уникальный номер с учетом всех префиксов и актуальной даты присваивается строго в транзакции записи при вызове метода Записать().