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