Нумерация документов в 1С 8.3: от настройки до кода
Содержание
Нумератор в 1С живёт в дереве конфигурации в ветке Общие → Нумераторы. Это отдельный объект, который задаёт правила номера (длину, тип, периодичность) и позволяет нескольким документам вести сквозную нумерацию из одного счётчика. Если же документу хватает собственного счётчика, нумератор заводить не нужно — настройки номера есть прямо в свойствах документа.
Ниже разберём оба пути: простую автонумерацию в свойствах документа и общий объект «Нумератор», а также префиксы, периодичность, программную установку номера через событие ПриУстановкеНовогоНомера и нумерацию в распределённых базах.
Изменение длины или типа номера у документа с данными меняет структуру таблиц в базе. Перед правкой в рабочей базе сделайте резервную копию и обновляйте конфигурацию в нерабочее время — при обновлении структуры нужен монопольный доступ, активные сеансы будут завершены.
Зачем нужен отдельный объект, а не просто номер документа
У каждого документа номер есть всегда — платформа умеет нумеровать его сама. Собственных настроек документа хватает, когда у вида документа свой независимый счётчик: «Счёт на оплату» нумеруется отдельно от «Реализации», и пересекаться им незачем.
Отдельный объект «Нумератор» нужен в одном случае — когда несколько видов документов должны делить общий сквозной номер. Классический пример: исходящие документы одной организации (счета, акты, накладные) идут единой последовательностью 1, 2, 3… независимо от того, какой это вид.
- 📄 Один вид документа, свой счётчик — настраиваем номер в самом документе.
- 🔗 Несколько видов, общая последовательность — заводим объект «Нумератор» и назначаем его всем этим документам.
Важная оговорка про справочники и регистры. Нумератор как объект применяется только к документам. У справочников есть свой код с похожими настройками (длина, тип, контроль уникальности, серии кодов), но общего объекта-нумератора для них нет. У регистров номеров нет вовсе — нумеровать там нечего.
Настройка номера прямо в свойствах документа
Если общий счётчик не нужен, всё настраивается без кода. Откройте документ в конфигураторе и перейдите на закладку, где собраны свойства нумерации (в палитре свойств документа это группа параметров номера).
Основные параметры:
| Параметр | Что задаёт | Типичное значение |
|---|---|---|
| Автонумерация | Платформа сама присваивает номер при записи | Включена |
| Тип номера | Строка или Число | Строка |
| Длина номера | Сколько символов в номере | 9–11 |
| Периодичность | Когда счётчик начинается заново | В пределах года |
| Проверка уникальности | Платформа не даст два одинаковых номера | Включена |
Пара практических замечаний.
Тип Строка гибче: в нём сохраняются ведущие нули (000000012) и можно добавить буквенный префикс. Тип Число — только цифры, без префикса и без ведущих нулей. Для хозяйственных документов почти всегда берут Строка.
Длину задавайте с запасом. Если номеров за период станет больше, чем помещается в заданную длину (вместе с префиксом), платформа не сможет выдать новый номер и выдаст ошибку. Для документа с потоком в тысячи штук в год 9 символов мало, если ещё и префикс занимает 3–4 знака.
Создаём общий нумератор и привязываем к документам
Когда нужна сквозная нумерация, порядок такой:
- В дереве конфигурации правой кнопкой по ветке
Общие → Нумераторы→ Добавить. - Задайте имя латиницей и кириллический синоним, например имя
НумераторИсходящих. - В свойствах нумератора заполните тип, длину, периодичность и проверку уникальности — ровно те же параметры, что и у документа.
- Откройте первый документ, найдите в его свойствах нумерации параметр со ссылкой на нумератор и выберите созданный объект.
- Повторите для остальных документов, которым нужна общая последовательность.
- Обновите конфигурацию базы данных (
F7, затем принять изменения структуры).
После этого собственные параметры номера у документа становятся неактивны — он подчиняется настройкам нумератора. Все документы, привязанные к одному нумератору, берут номера из общего счётчика: записали счёт под номером 5 — следующая накладная получит 6.
Нумератор удобно заводить сразу «на вырост»: даже если сейчас на нём один документ, позже к той же последовательности можно подключить новые виды без перенумерации.
Префикс и периодичность: формат номера под задачу
Формат номера складывается из трёх вещей: префикса, числовой части и момента, когда счётчик обнуляется.
Периодичность определяет, с какого момента нумерация начинается заново:
| Периодичность | Когда счётчик сбрасывается |
|---|---|
| Непериодический | Никогда — сквозной номер за всё время |
| В пределах года | С 1 января каждого года |
| В пределах квартала | В начале каждого квартала |
| В пределах месяца | В начале каждого месяца |
| В пределах дня | Каждый день с единицы |
Для большинства документов берут «В пределах года»: удобно, что номера за год не разрастаются до огромных значений, и видно, к какому периоду относится документ.
Префикс — это буквы или цифры перед числовой частью (ОРГ-000000045). Через настройки его не задать: префикс устанавливается кодом в событии документа (см. следующий раздел). Типичные задачи для префикса:
- 🏢 различать организации в одной базе (префикс по коду организации);
- 🧩 различать узлы распределённой базы, чтобы номера не пересекались;
- 🔤 помечать вид операции буквой.
Про суффикс (символы после числа) платформа отдельного механизма не даёт. Если он нужен, обычно выносят его в отдельный реквизит или формируют «красивый» номер в печатной форме, не трогая служебный номер документа.
Программная установка номера и префикса
Префикс и нестандартный номер задаются в модуле документа. Главный инструмент — событие ПриУстановкеНовогоНомера. Платформа вызывает его, когда готовится присвоить новый номер.
Сигнатура обработчика:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// СтандартнаяОбработка = Истина — платформа сама добавит числовую часть
// Префикс — строка, которую нужно поставить перед номером
КонецПроцедуры
Самый частый случай — префикс по организации. В типовых конфигурациях у справочника организаций есть код, его и берут:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Если ЗначениеЗаполнено(Организация) Тогда
Префикс = СокрЛП(Организация.Код) + "-";
КонецЕсли;
КонецПроцедуры
Здесь платформа по-прежнему сама подбирает свободную числовую часть (СтандартнаяОбработка остаётся Истина), а мы лишь дописываем префикс. Итог: ОРГ-000000045.
Если нужно сформировать весь номер самостоятельно, установите СтандартнаяОбработка = Ложь и присвойте номер документу вручную в этом же обработчике или перед записью. Делайте так только при реальной необходимости: ручная нумерация снимает с платформы контроль уникальности, и его придётся обеспечивать своим кодом.
Иногда свободный номер нужно узнать заранее — например, показать его пользователю до записи. Для этого у менеджера документа есть метод, возвращающий следующий свободный номер:
НовыйНомер = Документы.РеализацияТоваровУслуг.ПолучитьНомер();
Номер возвращается с учётом периодичности и префикса. Учтите: это не бронь — между получением номера и фактической записью документа его может занять другой сеанс.
Если номер формируете полностью сами, то в обработчике отключаете стандартную обработку и присваиваете значение напрямую. В простом случае это выглядит так:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
СтандартнаяОбработка = Ложь;
Номер = Документы.РеализацияТоваровУслуг.ПолучитьНомер() + "/РУЧ";
КонецПроцедуры
Здесь мы взяли свободный номер у платформы и дописали к нему метку. Полностью рукописную генерацию (счётчик в отдельном регистре сведений, своя логика) оставляйте на крайний случай: вы берёте на себя и уникальность, и блокировки при параллельной записи.
Префикс входит в общую длину номера. Если задать длинный префикс при короткой длине номера, под числовую часть не останется места — записать документ не получится. Согласуйте длину и префикс заранее.
Нумерация в распределённых базах и при обмене
В распределённой информационной базе (РИБ) и при обменах между несколькими базами главный риск — пересечение номеров. Две базы независимо выдают документ №100, после синхронизации возникает конфликт либо дубль.
Решение — разные префиксы у каждого узла. Тогда номера физически не могут совпасть:
- узел «Центр» →
Ц-000000100; - узел «Филиал» →
Ф-000000100.
В типовых конфигурациях на базе БСП для этого есть префикс информационной базы: его задают в настройках, и механизм сам подставляет буквы узла в событие установки номера. В самописной конфигурации тот же результат получаете своим кодом в ПриУстановкеНовогоНомера, подставляя в префикс идентификатор узла.
В самописной конфигурации префикс узла удобно вычислять прямо из кода текущего узла плана обмена:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Префикс = СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "-";
КонецПроцедуры
Что держать в голове при обмене:
- 🔢 тип номера должен быть
Строка— иначе префикс поставить некуда; - 📏 длины номера должно хватать на префикс узла плюс числовую часть;
- 🔁 проверку уникальности в каждой базе оставляйте включённой — внутри узла дубли недопустимы;
- 🧭 префиксы узлов задайте один раз и больше не меняйте — иначе в истории документов окажется разнобой.
Нумерация справочников: код вместо номера
Раз уж зашла речь о нумерации, стоит сказать про справочники — к ним общий объект «Нумератор» не применить, но автонумерация у них своя. Роль номера играет код, и настраивается он в свойствах справочника.
Параметры кода почти те же, что у документа: Автонумерация, Тип кода (Строка или Число), Длина кода, Контроль уникальности. Добавляется один специфический параметр — серии кодов, который определяет, в каких границах код должен быть уникальным:
| Серия кодов | Где код уникален |
|---|---|
| Во всём справочнике | Единая сквозная нумерация по всему справочнику |
| В пределах подчинения | Своя нумерация внутри каждой группы (для иерархии групп и элементов) |
| В пределах подчинения владельцу | Своя нумерация у каждого владельца (для подчинённых справочников) |
Для префикса кода у справочника есть собственное событие — ПриУстановкеНовогоКода:
Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
Префикс = "СП-";
КонецПроцедуры
Логика та же, что у документа: СтандартнаяОбработка оставляете Истина, чтобы платформа подобрала числовую часть, а в Префикс кладёте нужные символы.
Если у справочника отключить автонумерацию, код придётся вводить вручную при создании каждого элемента. Для номенклатуры и контрагентов автонумерацию обычно оставляют включённой.
Разрывы, дубли и другие частые проблемы
Несколько ситуаций, с которыми сталкиваются чаще всего.
В нумерации появились «дыры». Пропуски между номерами — это штатное поведение, а не ошибка. Номер присваивается при записи документа; если документ создали, получили номер, а потом не записали или удалили — номер в последовательности уже «израсходован». При активной работе нескольких пользователей дыры неизбежны. Гнаться за идеально сплошной нумерацией служебного номера не стоит.
Нельзя записать документ — номер превысил длину. Числовая часть вместе с префиксом перестала помещаться в заданную длину. Увеличьте длину номера у документа или нумератора (это изменение структуры — через резервную копию и обновление в нерабочее время).
Появились дубли номеров. Как правило, это следствие отключённой проверки уникальности либо ручной установки номера кодом без собственной проверки. Включите проверку уникальности; если номер ставите сами — проверяйте занятость перед записью.
Счётчик не обнулился в новом периоде. Проверьте периодичность: при «Непериодический» номера идут сквозняком и не сбрасываются. Нужен сброс по годам — ставьте «В пределах года».
Отлаживать логику префикса удобно в режиме «1С:Предприятие» с точкой останова в ПриУстановкеНовогоНомера: создайте новый документ, подберите разные организации и посмотрите, какой префикс формируется. Отдельного «тестового» режима для нумерации платформа не предоставляет — проверка идёт обычной отладкой модуля.
Можно ли привязать нумератор к справочнику?
ПриУстановкеНовогоКода.Как убрать ведущие нули из номера?
Строка нули хранятся всегда. Если нужен «чистый» номер без нулей, формируйте его для показа в печатной форме отдельно, не меняя сам номер документа.Почему после удаления документа номер не вернулся в последовательность?
Можно ли менять тип номера со `Строка` на `Число` в рабочей базе?
Число потеряются, и обновляйте в нерабочее время.Как сделать единую нумерацию для счёта и акта?
Общие → Нумераторы и назначьте его обоим документам в их свойствах нумерации. Они начнут брать номера из общего счётчика.