Нумератор документов в 1С 8.3: устройство, настройки, разрывы и блокировки
Содержание
Нумератор в 1С — это общий объект конфигурации, который задаёт единую нумерацию для нескольких видов документов сразу. Он лежит в ветке Общие → Нумераторы документов дерева конфигурации, а подключается к документу через свойство Нумератор на закладке «Нумерация». Документы с одним нумератором получают номера из общего ряда: если счёт получил № 15, следующая накладная с тем же нумератором будет № 16.
Если нумератор не указан, у каждого вида документа своя независимая нумерация. Это вариант по умолчанию, и в типовых конфигурациях большинство документов работают именно так. Общий нумератор выбирают, когда бизнесу нужен сквозной ряд номеров для разных форм — например, для всех кассовых или всех складских документов.
Как устроен нумератор 1С и чем он отличается от нумерации документа
Нумератор не хранит никаких данных сам по себе. Это набор правил: какого типа номер, какой длины, в каком периоде он уникален. Каждый документ, к которому привязан нумератор, берёт эти правила у него, а собственные настройки нумерации документа становятся недоступны для изменения.
Свойства нумератора совпадают с настройками на закладке «Нумерация» у документа:
- 🔢 Тип номера —
СтрокаилиЧисло. - 📏 Длина номера — сколько символов отводится под номер вместе с префиксом.
- 📐 Допустимая длина —
Фиксированная(номер дополняется нулями слева) илиПеременная. - 📅 Периодичность — в каком интервале номер уникален: без периода, в пределах года, квартала, месяца или дня.
- ✅ Контроль уникальности — запрещать ли запись двух документов с одинаковым номером в одном периоде.
У справочников нумераторов нет. Их аналог — свойства кода справочника (тип, длина, серии кодов, контроль уникальности). Нумератор работает только с документами.
Если два вида документов должны идти одним рядом номеров, проще и надёжнее подключить общий нумератор, чем писать свой код подбора номера. Платформа сама разрулит одновременную запись из разных сеансов.
Алгоритм: как 1С вычисляет следующий номер
При автоматической нумерации платформа не хранит отдельный «счётчик». Она ищет максимальный номер среди уже записанных документов, подходящих под условия, и прибавляет единицу. Условия такие:
- Тот же вид документа или тот же нумератор (если он подключён).
- Тот же период — когда задана периодичность, например текущий год по дате документа.
- Тот же префикс — для строкового номера префикс отделяет один ряд от другого.
Отсюда практическое следствие. Если удалить последний документ в ряду, его номер освободится и достанется следующему новому документу. Если удалить документ из середины ряда, номер останется дырой: максимум не изменился, и программа продолжит счёт с него.
Для строкового номера платформа отделяет префикс и инкрементирует числовой хвост. Пример для длины 11 и префикса МСК-:
| Префикс | Последний номер | Следующий номер |
|---|---|---|
| нет | 00000000041 | 00000000042 |
МСК- | МСК-0000041 | МСК-0000042 |
СПБ- | СПБ-0000007 | СПБ-0000008 |
Ряды МСК- и СПБ- считаются независимо, хотя документ один и тот же. На этом построена вся префиксация в типовых конфигурациях.
Когда номер присваивается
В управляемых формах 1С 8.3 новый документ получает номер при первой записи, а не при открытии формы. Пока документ не записан, поле номера пустое. Так меньше дыр: пользователь открыл форму, передумал и закрыл — номер никто не занял.
Программно номер можно получить заранее методом объекта УстановитьНовыйНомер(). Перед вызовом у документа уже должна стоять дата, иначе при периодической нумерации номер возьмётся не из того периода.
Автоматическая и ручная нумерация документов
За режим отвечает флажок Автонумерация в свойствах документа (закладка «Нумерация»). Варианты работы:
| Режим | Как получает номер | Когда выбирают | Риски |
|---|---|---|---|
| Автонумерация включена | Платформа при записи, если поле номера пустое | Почти всегда | Разрывы после удаления документов |
| Автонумерация включена, номер введён вручную | Записывается то, что ввёл пользователь | Ввод входящих документов, исправления | Дубли, если контроль уникальности выключен |
| Автонумерация выключена | Только вручную или кодом | Входящие документы с номером контрагента | Пустые и повторные номера |
Ручное исправление номера не ломает автонумерацию. Но если вручную поставить номер больше текущего максимума, следующий автоматический номер продолжит уже с него. Типичная история: бухгалтер ввёл 0000-001000 вместо 0000-000100, и весь ряд «перепрыгнул» на тысячу.
Если вы перебили номер по ошибке, исправьте его до того, как кто-то запишет следующий документ. Потом придётся перенумеровывать уже несколько документов.
Во многих типовых документах есть отдельные реквизиты для номера и даты входящего документа от поставщика. Свой номер документа в базе при этом остаётся автоматическим. Номер контрагента в стандартное поле «Номер» вводить не нужно.
Настройка нумератора: тип, длина, периодичность и префиксы
Создание и подключение нумератора делается в конфигураторе. Перед изменением конфигурации сделайте резервную копию базы и согласуйте правку с регламентом. На типовой конфигурации на поддержке это ещё и снятие объекта с поддержки или правка через расширение, где это допустимо.
Создание нумератора в конфигураторе
- Откройте
Конфигурация → Открыть конфигурацию. - В дереве раскройте
Общие → Нумераторы документов, нажмите «Добавить». - Задайте имя, тип номера, длину, допустимую длину, периодичность и контроль уникальности.
- Откройте документ, перейдите на закладку «Нумерация» и выберите созданный нумератор в поле
Нумератор. - Повторите шаг 4 для всех видов документов, которые должны идти общим рядом.
- Обновите конфигурацию базы данных (
F7).
После шага 4 настройки нумерации документа станут серыми: теперь они берутся из нумератора. Длину лучше закладывать с запасом. Строка длиной 11 вмещает префикс из 4–5 символов и 6–7 цифр — этого хватает на миллион документов в периоде.
Периодичность номера
Периодичность определяет, когда счёт начинается заново:
- 📆 В пределах года — с 1 января каждый ряд снова с единицы. Стандарт для первичных документов.
- 🗓️ В пределах квартала или месяца — для кассовых и складских документов в крупных компаниях с большим потоком.
- 📌 В пределах дня — редко, для очень массовых операций.
- ♾️ Непериодическая — сквозной номер на всё время существования базы.
Если пользователь меняет дату документа и она уходит в другой период, номер из старого периода может совпасть с уже существующим номером в новом. При включённом контроле уникальности запись не пройдёт. Типовые конфигурации в таком случае обычно очищают номер, чтобы при записи он получился заново.
Префиксы номеров в коде
Префикс задают в обработчике события модуля объекта документа:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Префикс добавляется в начало номера и задаёт отдельный ряд
Префикс = "МСК-";
КонецПроцедуры
Если установить СтандартнаяОбработка = Ложь, платформа не будет генерировать номер — его нужно присвоить самостоятельно. Так делают редко: свой генератор номеров почти всегда хуже встроенного по блокировкам.
В типовых конфигурациях на БСП префикс собирается автоматически из префикса организации и префикса информационной базы, затем идёт дефис и порядковая часть. Префикс организации задаётся в карточке организации, префикс базы — в настройках синхронизации данных.
Блокировки и производительность нумерации в 1С
Чтобы два пользователя не получили один номер, платформа блокирует ряд нумерации на время получения номера. Ряд — это сочетание вида документа или нумератора, периода и префикса. Блокировка держится до конца транзакции, в которой записывается документ.
Пока транзакция короткая, это незаметно. Проблемы начинаются в трёх ситуациях:
- 🐢 Долгое проведение. Документ получает номер, а потом секунды уходят на движения по регистрам. Все, кто в этот момент записывает документ из того же ряда, ждут.
- 📦 Пакетная загрузка в одной транзакции. Обработка создаёт тысячу документов внутри
НачатьТранзакцию()— ряд занят до её завершения. - 🔗 Общий нумератор на много видов документов. Чем больше документов делят один ряд, тем выше шанс ожидания.
Симптомы — подвисание на записи нового документа и ошибки превышения времени ожидания блокировки при массовой работе. Что помогает:
- Разнести ряды префиксами — например, по организациям или складам. Каждый ряд блокируется отдельно.
- В обработках массовой загрузки писать каждый документ в своей транзакции, а не всё пачкой.
- Получать номер (
УстановитьНовыйНомер()) как можно ближе к концу транзакции, после тяжёлых расчётов. - Не подключать общий нумератор без реальной потребности в сквозном ряде.
В файловой базе картина другая: там блокировки грубее, и упираться в нумерацию начинают уже при 5–10 активных пользователях. Если ожидания на записи стали ежедневными, это сигнал к переходу на клиент-серверный вариант.
Разрывы в нумерации документов: откуда берутся
Сама по себе платформа номера не пропускает. Разрыв всегда объясняется действием с данными:
| Причина | Что произошло | Что делать |
|---|---|---|
| Удаление документа из середины ряда | Номер исчез, максимум остался | Создать документ вручную с пропущенным номером или смириться |
| Ручной ввод номера больше максимума | Ряд перепрыгнул вперёд | Исправить завышенный номер, пока ряд не ушёл дальше |
| Смена даты на другой период | Номер получен в одном периоде, документ ушёл в другой | Очистить номер и перезаписать документ |
| Смена префикса организации или базы | Начался новый ряд с новым префиксом | Старые документы оставить как есть |
| Загрузка из другой базы | Пришли документы с чужими номерами | Проверить префиксы узлов обмена |
Документы, помеченные на удаление, номер по-прежнему занимают. Дыра появляется только после окончательного удаления помеченных объектов. Если ряд важен, восстановите номер сразу: снимите пометку или создайте новый документ с этим номером вручную.
Массово перенумеровывать документы задним числом рискованно. Номера уже ушли контрагентам в счетах и накладных, а разные номера одного документа у вас и у покупателя — источник проблем при сверках. Чаще правильнее оставить разрыв и при необходимости объяснить его причину.
Нумерация в распределённой информационной базе и при обмене
В распределённой базе (РИБ) документы создаются параллельно в разных узлах, а платформа считает максимум только по своей базе. Без разделения рядов центральный офис и филиал выдадут одинаковые номера, и после обмена появятся дубли.
Решение — префикс информационной базы:
- Каждому узлу назначается свой уникальный префикс. В типовых конфигурациях он задаётся в разделе
Администрирование → Синхронизация данных. - Префикс попадает в номер каждого нового документа, созданного в узле.
- Ряды узлов не пересекаются: центр пишет свои номера, филиал — свои.
Префикс назначают до начала работы в узле. Если поменять его позже, новые документы пойдут новым рядом, а старые сохранят прежний префикс в номере — смешанная картина в журнале останется навсегда.
Не назначайте двум узлам одинаковый префикс, в том числе при создании копии узла из резервной копии. Дубли номеров обнаружатся только после обмена, когда документов будет уже много.
При обмене между разными конфигурациями (например, торговой и бухгалтерской) номер обычно переносится как есть. Если в базе-приёмнике тот же вид документа ведётся и вручную, рядом с загруженными документами окажутся местные с совпадающими номерами. Помогает тот же приём: свой префикс у каждой программы, которая создаёт документы.