Разработка и Конфигурация · 9 мин
УстановитьНовыйНомер в 1С: как работает метод и когда его применять
Разбираем метод УстановитьНовыйНомер() в 1С: синтаксис, принцип работы нумерации, примеры кода, типичные ошибки и способы проверки результата.
Метод УстановитьНовыйНомер() в 1С:Предприятии предназначен для принудительной установки нового номера документу или кода элементу справочника. Он вызывается на объекте до записи и назначает номер по правилам, заданным в нумераторе объекта метаданных: с учётом префикса, периодичности и уже существующих номеров в базе.
Разработчик сталкивается с этим методом, когда стандартный механизм автонумерации не срабатывает или требуется особая логика: ручная установка номера при загрузке данных, обход блокировки при попытке записать объект с дублирующимся номером, генерация номера по собственному алгоритму с последующей фиксацией в стандартном поле.
Важно понимать: метод не «придумывает» номер из воздуха. Он обращается к механизму нумерации платформы, находит максимальный существующий номер в заданных границах (период, владелец, префикс) и присваивает следующий по порядку. Если эти границы определены неверно, результат будет неожиданным — вплоть до дублей или нарушения последовательности.
Синтаксис и параметры метода
Метод доступен у объектов, поддерживающих нумерацию: документов, справочников, бизнес-процессов, задач. Общий вид вызова:
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДатаСеанса();
НовыйДок.УстановитьНовыйНомер("ОР-");
НовыйДок.Записать();Единственный необязательный параметр — строка префикса. Если параметр передан, платформа ищет максимальный номер среди объектов с этим префиксом и назначает следующий. Если параметр опущен, используется префикс по умолчанию: префикс информационной базы, префикс организации или пустая строка — в зависимости от настроек нумератора и функциональных опций.
У справочников метод называется УстановитьНовыйКод() и работает аналогично, но применительно к полю «Код» и с учётом настройки «Серии кодов»: в пределах всего справочника, подчинения владельцу или группы.
Как платформа вычисляет следующий номер
При вызове метода платформа выполняет запрос к таблице соответствующего объекта метаданных и ищет максимальный номер, удовлетворяющий условиям: тот же префикс, тот же период (если нумерация периодическая), тот же владелец (для подчинённых справочников). Найденное значение увеличивается на единицу в числовой части.
Номер в 1С — строка, поэтому сравнение идёт с учётом длины номера, заданной в конфигураторе. Платформа отделяет числовую часть от префикса и символьных вставок. Если в базе есть «ручные» номера нетипичного вида (буквы в середине, нестандартная длина), механизм может определить «максимум» не так, как ожидает разработчик.
Для периодических нумераторов отсчёт начинается заново с начала нового периода: например, при годовой периодичности первый документ нового года получит номер 1. Это штатное поведение, а не ошибка.
Проверьте передаваемый параметр и настройки префиксации ИБ
Смотрите свойство нумератора в конфигураторе
Код уникален в пределах владельца, если так настроено
Ищите нестандартные номера в базе запросом
Типовые сценарии использования
Загрузка данных из внешних систем
При обмене с другими учётными системами документы часто приходят с уже готовыми номерами. Если записать объект как есть, при следующем создании документа вручную автонумерация может выдать дубль. Решение — после загрузки вызывать УстановитьНовыйНомер() для объектов, которые должны встроиться в общую нумерацию, либо загружать номера в отдельный реквизит, оставив стандартное поле платформе.
Обход ошибки «Номер не уникальный»
Если при записи возникает ошибка уникальности номера, типовой приём — установить новый номер программно и повторить запись:
Попытка
ДокументОбъект.Записать();
Исключение
ДокументОбъект.УстановитьНовыйНомер();
ДокументОбъект.Записать();
КонецПопытки;Такой подход допустим в пакетных обработках, но в интерактивной работе он маскирует проблему: пользователь должен видеть, что номер конфликтует, а не получать молча перенумерованный документ.
Собственная логика префиксации
Когда стандартной префиксации недостаточно (например, префикс зависит от склада или подразделения), префикс передают параметром. При этом нужно гарантировать, что все документы серии создаются через один и тот же код, иначе нумерация разойдётся.
Ограничения и подводные камни
Метод работает только с объектом в памяти и не записывает его сам — без последующего вызова Записать() номер не зафиксируется. Между установкой номера и записью другой сеанс может занять тот же номер: платформа защищает от этого контролем уникальности при записи, но обработать исключение придётся разработчику.
Если свойство нумератора «Автонумерация» включено, платформа сама присваивает номер при первой записи объекта. Явный вызов метода в этом случае избыточен, а при обновлении нумерации через ОбновитьНумерациюОбъектов поведение может отличаться от ожиданий.
Для документов с признаком «Оперативное проведение» номер связан с датой: попытка установить номер на документ с устаревшей датой может привести к конфликту последовательности проведения.
Проверка результата после установки номера
Минимальная проверка — убедиться, что объект записался без исключения и номер соответствует ожидаемому префиксу и периоду. Для серии документов полезно выполнить запрос на дубли: сгруппировать по номеру и префиксу и найти значения с количеством больше одного.
Как проверить результат
Соответствует префиксу и следующий по порядку
Пустой, обрезанный или с чужим префиксом
Каждый номер встречается один раз в периоде
Группы с количеством больше 1
Номер выводится полностью
Номер усечён из-за длины поля
Получает номер, следующий за установленным
Получает дубль или отстающий номер
Типичные ошибки разработчиков
Альтернативы методу
Не всякая задача требует прямого вызова УстановитьНовыйНомер(). Часто достаточно штатных средств платформы или другого подхода.
Сравнение вариантов
Подходит для обычного интерактивного ввода; не даёт управлять префиксом из кода
Полный контроль из кода; требует обработки ошибок уникальности
Централизованная логика для всех способов создания объекта; сложнее отладка
Гибко для обменов; ломает типовые печатные формы и отчёты, ожидающие стандартный номер
Наиболее надёжный вариант для нестандартной логики — подписка на событие ПриУстановкеНовогоНомера (или ПриУстановкеНовогоКода). Она срабатывает при любом способе создания объекта: вручную, из обработки, при обмене. Это исключает ситуацию, когда часть документов проходит мимо вашей логики.
Как выбрать действие
FAQ
Почему УстановитьНовыйНомер() выдаёт номер 1, хотя документы в базе есть?
Чаще всего причина в префиксе или периоде: метод ищет максимум только среди номеров с тем же префиксом в текущем периоде нумератора. Проверьте, какой префикс передаётся параметром, и периодичность нумератора в конфигураторе. Также возможно, что существующие номера введены вручную в формате, который платформа не распознаёт как числовой.
Можно ли вызвать метод для уже записанного документа?
Технически можно: получить объект через ПолучитьОбъект(), вызвать метод и записать. Но менять номер проведённого документа опасно — он мог попасть в печатные формы, отчёты и внешние системы. Делайте это только осознанно и после резервного копирования.
Чем УстановитьНовыйНомер отличается от УстановитьНовыйКод?
Первый применяется к документам и меняет поле «Номер», второй — к справочникам и работает с полем «Код». Принцип поиска максимума одинаковый, но у справочников дополнительно учитываются серии кодов: в пределах всего справочника, подчинения или группы.
Почему после установки номера запись всё равно падает с ошибкой уникальности?
Между вызовом метода и записью другой сеанс успел занять этот номер. Платформа не резервирует номер при его установке. Оберните запись в попытку и при исключении повторите установку номера — обычно достаточно одного-двух повторов.
Как вернуть нумерацию в норму после сбоя?
Найдите запросом документы с нетипичными номерами (длиннее установленной длины, с буквами в числовой части), исправьте их вручную или обработкой на копии базы. После этого проверьте, что новый документ получает ожидаемый следующий номер. Массовую обработку сначала тестируйте на копии.
Что важно запомнить
УстановитьНовыйНомер() назначает следующий свободный номер с учётом префикса, периода и владельца, но не резервирует его до записи. Вызывайте метод до Записать(), обрабатывайте ошибки уникальности, а для постоянной логики используйте подписку ПриУстановкеНовогоНомера. Любые массовые изменения номеров — только после резервной копии.