В процессе работы с конфигурациями на платформе 1С:Предприятие 8.3 (например, 1С:ERP Управление предприятием или 1С:Комплексная автоматизация) иногда возникают ситуации, когда при попытке создать новый документ система автоматически присваивает ему аномально высокий номер. Например, вместо следующего по порядку номера ГЕЦБ-001650 платформа генерирует ГЕЦБ-010292. При этом последующие документы вообще отказываются записываться из-за конфликта уникальности номеров.
Рассмотрим подробно причины возникновения этой проблемы и эффективные способы её устранения.
Проанализируем механику работы менеджера автонумерации в платформе 1С:Предприятие 8.3. Сервер приложений оптимизирует работу с базой данных и кэширует последние выданные номера в оперативной памяти рабочих процессов (rphost). Сбой в формировании sequence-номеров чаще всего происходит по следующим причинам:
Нумератор, завышенный номер мог сформироваться в другом типе документов, использующем этот же нумератор (например, в перемещении товаров или акте выполненных работ).Если проблема вызвана зависшим кэшем рабочих процессов rphost, стандартные методы исправления в конфигураторе или вызов процедур перенумерации в сеансе пользователя не дадут результата. В этом случае наиболее оперативным решением является перезапуск службы сервера 1С или очистка сеансового кэша.
Разберем по шагам действия системного администратора:
Agent 1C:Enterprise server) через оснастку управления службами Windows или сервис systemctl в Linux.rphost через консоль кластера серверов 1С или временно удалим и заново зарегистрируем информационную базу в кластере.После перезапуска процесса rphost оперативна память очищается, и менеджер автонумерации при следующем обращении считывает корректный максимальный номер непосредственно из базы данных.
Платформа 1С предоставляет встроенный метод для сброса кэшированных номеров объектов метаданных — ОбновитьНумерациюОбъектов(). Рассмотрим особенности его применения.
Важно учитывать: если вызвать метод с указанием конкретного типа метаданных, очистится кэш только для этого вида документов. Если документ использует общий нумератор, кэш связанного нумератора может не обновиться. Поэтому для полного сброса рекомендуется вызывать метод без параметров в контексте исполнения на сервере:
// Вызов без параметров обновляет кэш нумераторов по всем объектам метаданных базы
ОбновитьНумерациюОбъектов();
Посмотрим на пример применения метода для конкретного типа документа:
// Обновление кэша нумерации только для документа РеализацияТоваровУслуг
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
Обратите внимание: метод ОбновитьНумерациюОбъектов() обновляет только данные в оперативной памяти сервера приложений. Он не изменяет физические записи в СУБД. Если в таблицах базы данных останется хотя бы один документ со сбойным номером (например, ГЕЦБ-010292), после вызова метода платформа снова прочитает этот номер как максимальный.
Если после очистки кэша платформа продолжает выдавать ошибочный номер, значит, документ с таким номером физически присутствует в СУБД. Выясним, как его найти:
Нумератор.В конфигурациях с высокой интенсивностью ввода документов или сложной структурой префиксов стандартного платформенного механизма может быть недостаточно. В таких ситуациях программисты применяют собственные алгоритмы формирования номеров:
ПриУстановкеНовогоНомера: В этом случае платформенный генератор номеров отключается, а номер рассчитывается явным запросом к базе данных с поиском максимального числового значения по конкретной организации и префиксу.