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