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