Нумерация документов и справочников в 1С 8.3
Содержание
Номер документа в 1С 8.3 назначает платформа: при создании нового документа она берёт максимальный номер в текущем интервале и прибавляет единицу. Поведение задаётся в Конфигураторе — в свойствах документа есть четыре поля: Тип номера, Длина номера, Периодичность номера и флажок Автонумерация. У справочников то же самое делает Код и свойство Серии кодов.
Если нумерация «поехала» — сбились префиксы после настройки обмена, появились пропуски, два документа получили один номер, — причина почти всегда в этих свойствах или в обработчике ПриУстановкеНовогоНомера. Ниже — как устроен механизм целиком: от хранения номера в базе до программной подмены.
Где платформа хранит номер и какого он типа
Номер — это не обычный реквизит, который вы добавляете на закладке «Данные». Это служебный реквизит документа, он есть всегда, и его свойства редактируются в палитре свойств самого документа, группа Нумерация.
Ключевые свойства:
- 🔤 Тип номера —
СтрокаилиЧисло. По умолчанию строка. Строковый номер хранит буквы, дефисы и префиксы (АБ-000123), числовой — только цифры. Для документов почти всегда строка: без неё не будет префиксов. - 📏 Длина номера — сколько символов (или разрядов) отводится. Для строкового типа платформа дополняет номер слева нулями до этой длины, поэтому
123показывается как000000123. - 📅 Периодичность номера — интервал, внутри которого номер уникален и непрерывен (разбираем ниже).
- ✅ Контроль уникальности — если включён, платформа не даст записать два документа с одинаковым номером в одном интервале.
- Автонумерация — платформа подбирает номер сама. Если снять флажок, поле номера придётся заполнять вручную или кодом.
У справочников вместо «Номера» — Код. Отдельное свойство Серии кодов определяет область уникальности: Во всем справочнике, В пределах подчинения (для иерархических) или В пределах подчинения владельцу (для подчинённых справочников). Это и есть «интервал» для справочников.
Строковый номер сортируется как текст. Поэтому 10 окажется раньше 2, если не дополнять нулями. Длина номера и выравнивание нулями существуют именно для корректной сортировки.
На практике у справочников нумерация работает так же, как у документов, но с двумя отличиями. Во-первых, код можно вводить вручную — многие ведут номенклатуру или контрагентов по собственным артикулам, и для этого Автонумерацию у кода часто отключают. Во-вторых, область уникальности задаётся не временем, а структурой через Серии кодов: для плоского справочника логичен вариант Во всем справочнике, для подчинённого (например, договоры контрагента) — В пределах подчинения владельцу, чтобы у каждого контрагента нумерация договоров шла с единицы.
Автонумерация и интервалы: периодичность номера
Когда вы создаёте новый документ, платформа ищет максимальный номер в пределах интервала и прибавляет 1. Интервал задаёт свойство Периодичность номера:
| Периодичность | Когда номер обнуляется | Типичный пример |
|---|---|---|
| Непериодическая | Никогда, сквозная нумерация | Договоры, внутренние приказы |
| В пределах года | 1 января | Большинство учётных документов |
| В пределах квартала | Начало квартала | Реже, по регламенту организации |
| В пределах месяца | 1-го числа | Кассовые документы в части баз |
| В пределах дня | Каждый день с 1 | ПКО/РКО при большом потоке |
Самый частый выбор для документов — В пределах года. 1 января счётчик стартует заново с единицы, и вы получаете чистую годовую нумерацию без накопления длинных номеров.
Нумераторы: общий счётчик на несколько документов
Если нескольким видам документов нужна сквозная общая нумерация (например, все платёжные документы в одной последовательности), в Конфигураторе создаётся объект Нумератор. Его назначают в свойстве Нумератор каждого из этих документов. Тогда счётчик у них общий: следующий номер считается по всем документам, привязанным к нумератору, а не по каждому виду отдельно.
Периодичность и тип номера в этом случае берутся из нумератора, а не из документа.
Префиксы: зачем они и как работают в РИБ
Префикс — это неизменяемая приставка перед номером: ЦБ-000045, где ЦБ- отличает документы одной организации или одного узла обмена от других. Без префиксов две базы, обменивающиеся данными, легко создадут документы с одинаковыми номерами.
Префиксы нужны в двух сценариях:
- 🏢 Несколько организаций в одной базе. У каждой организации свой префикс, чтобы нумерация не пересекалась. В типовых конфигурациях (БП 3.0, УТ 11, ERP) префикс организации задаётся в карточке организации — реквизит
Префикс. - 🔁 Распределённая база (РИБ). Каждый узел получает свой префикс информационной базы, чтобы документы, созданные в разных узлах, не конфликтовали при обмене.
В типовых конфигурациях за это отвечает подсистема БСП «Префиксация объектов». Она складывает итоговый префикс из двух частей:
- префикс информационной базы (узла) — хранится в константе и задаётся при настройке обмена;
- префикс организации — из карточки организации.
Результат: номер ЦБ-АА-000045 = префикс ИБ + префикс организации + порядковый номер. Менять префикс у базы, которая уже участвует в обмене, нельзя — это приведёт к расхождению нумерации между узлами. Префикс закладывается один раз, на старте обмена.
Префикс РИБ настраивается не в свойствах документа, а в настройках синхронизации/обмена. В Конфигураторе вы задаёте только тип и длину номера, но не сам текст префикса — его подставляет код конфигурации через обработчик установки номера.
Пропуски в нумерации: почему появляются и опасны ли
Пропуски — самая частая «страшилка». Документ №5 есть, №6 нет, №7 снова есть. Разберём механизм.
Основные причины пропусков:
- 🗑 Удаление документа. Если документ №6 удалён (не помечен, а удалён физически), его номер не возвращается в оборот. Остаётся дырка.
- ↩️ Откат транзакции. В клиент-серверном варианте номер выдаётся из внутреннего счётчика до фиксации записи. Если запись не прошла (ошибка, отмена пользователем), номер уже «израсходован» — появляется пропуск. Это штатное поведение платформы, а не сбой.
- ✍️ Ручная правка номера. Кто-то вписал номер вручную, нарушив последовательность.
- 📅 Смена периода. На границе года/месяца счётчик обнуляется — это не пропуск, а старт нового интервала.
Поведение счётчика различается по варианту базы. В файловой базе следующий номер вычисляется от фактического максимума в интервале прямо в момент записи, поэтому откатов-пропусков там меньше. В клиент-серверной базе платформа держит внутренний счётчик и выдаёт номер раньше фиксации записи — это ускоряет параллельную работу многих пользователей, но и даёт те самые пропуски при незавершённых записях. Менять это поведение штатными средствами нельзя, и бороться с ним обычно не нужно.
Важный момент про механику: платформа подбирает следующий номер как максимальный в интервале + 1. Поэтому если удалить последний документ в периоде, его номер при создании следующего документа освободится и будет использован повторно. А вот дырку в середине автонумерация не закрывает — она не ищет пропущенные номера, только максимум.
Опасны ли пропуски? Для внутренних документов — нет, законодательство не требует сквозной непрерывной нумерации. Но для некоторых форм непрерывность критична по регламенту самой организации или по требованиям к бланкам. Если нужна гарантированно непрерывная последовательность, автонумерации недостаточно — номер придётся контролировать кодом или организационно (не удалять документы, а помечать).
Программное управление номером
Иногда стандартной автонумерации мало: нужен свой префикс по условию, особый формат или полностью ручной номер. Для этого есть обработчик события и методы объекта.
Обработчик ПриУстановкеНовогоНомера
Срабатывает в модуле документа в момент, когда платформа собирается присвоить номер новому документу. Сигнатура:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Подставляем свой префикс, автонумерацию оставляем платформе
Префикс = "СФ-";
КонецПроцедуры
Здесь вы меняете только параметр Префикс — платформа сама подберёт порядковую часть. Если нужно взять номер под полный контроль, отключите стандартную обработку и присвойте номер сами:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
СтандартнаяОбработка = Ложь;
Номер = СформироватьСвойНомер(); // ваша функция
КонецПроцедуры
При СтандартнаяОбработка = Ложь вся ответственность за уникальность номера — на вашем коде.
Метод УстановитьНовыйНомер
Когда документ создаётся программно, номер по умолчанию пустой, пока документ не записан. Чтобы получить его заранее (например, показать пользователю до записи), вызовите метод:
Документ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
Документ.Дата = ТекущаяДата();
Документ.УстановитьНовыйНомер("РТ-");
Метод УстановитьНовыйНомер([Префикс]) подбирает очередной автоматический номер с учётом интервала и префикса. Префикс необязателен — если его не передать, применится обычная логика автонумерации и обработчик ПриУстановкеНовогоНомера.
Проверить, был ли номер назначен автоматически, можно методом НомерАвтоматически() — он возвращает Истина, если номер подобрала платформа, и Ложь, если его ввели вручную. Это полезно в обработчике ПередЗаписью: например, не давать пользователю вручную переписывать автоматический номер, если по регламенту номера должны идти только от платформы.
Ещё один практичный приём — временный документ для предпросмотра. Если нужно показать будущий номер в форме до записи, создают документ методом СоздатьДокумент, вызывают УстановитьНовыйНомер и читают полученное значение, но сам документ не записывают. Учтите: такой «подсмотренный» номер не резервируется, и к моменту реальной записи его может занять другой пользователь.
Если при программном создании документов номера не нужны (например, вы грузите исторические данные и присваиваете свои номера), заполняйте поле Номер вручную и не вызывайте УстановитьНовыйНомер.
Как настроить нумерацию под задачу: порядок действий
- Откройте документ в Конфигураторе, перейдите в палитру свойств, группа Нумерация.
- Выберите
Тип номера. Нужны префиксы или буквы — толькоСтрока. - Задайте
Длину номерас запасом: при длине 9 вы упрётесь в потолок на номере 999999999, с учётом префикса — раньше. - Установите
Периодичность номерапо регламенту: для большинства учётных документов —В пределах года. - Включите
Контроль уникальности, если дубли номеров недопустимы. - Нужна общая нумерация для нескольких видов документов — создайте Нумератор и назначьте его всем этим документам.
- Нужен префикс по организации/узлу — реализуйте его в обработчике
ПриУстановкеНовогоНомераили подключите подсистему префиксации БСП.
После правки длины или типа номера в рабочей базе выполните обновление конфигурации базы данных — платформа перестроит хранение номера. Операция меняет структуру данных, поэтому делайте её в монопольном режиме и с актуальной резервной копией.
Типичные ошибки и как их исправить
Отдельно про исчерпание разрядности: если Длина номера мала, а префикс длинный, порядковой части остаётся мало места и платформа упрётся в потолок. Лечится увеличением длины номера с последующим обновлением конфигурации базы данных.