В процессе повседневной работы в конфигурации 1С:Управление торговлей 11 пользователи нередко сталкиваются с ситуацией, когда при создании документа методом копирования система выдает ошибку о нарушении уникальности номера. При этом в пользовательском режиме номера вручную никто не редактирует. Разберем причины возникновения этой проблемы и рассмотрим практические способы ее устранения.
Проанализируем ключевые факторы, приводящие к сбою механизма автонумерации платформы 1С:
rphost. При разворачивании резервной копии базы данных, переносе на другой сервер или нештатном падении процессов кэш может рассинхронизироваться с фактическими номерами в таблицах СУБД. Автонумератор пытается выдать номер, который физически уже занят.ПриКопировании в модуле объекта. Если в типовом коде или доработанном модуле реквизит Номер не очищается принудительно, система может попытаться сохранить новый документ с номером исходного документа.Рассмотрим самый быстрый и действенный способ устранения рассинхронизации кэша — программное обновление нумерации объектов. Платформа 1С предоставляет встроенную процедуру ОбновитьНумерациюОбъектов(), которая заставляет перечитать максимальные номера непосредственно из базы данных и обновить кэш кластера.
Если вызвать метод без параметров, он выполнит актуализацию номеров вообще для всех объектов конфигурации. В крупных базах это может создать ощутимую нагрузку на сервер. Поэтому разберем по шагам, как выполнить адресное обновление только для конкретного типа документа:
// Адресное обновление нумерации для конкретного типа документа
ОбновитьНумерациюОбъектов(Метаданные.Документы.ЗаказКлиента);
Если необходимо сбросить кэш сразу для всей конфигурации, выполним вызов без параметров:
// Полное обновление нумерации для всех объектов конфигурации
ОбновитьНумерациюОбъектов();
После выполнения данного кода проверим создание документа копированием — платформа пересчитает максимальный номер и присвоит следующий свободный идентификатор.
Посмотрим на альтернативное решение для системных администраторов, если ошибка вызвана зависшим кэшем в процессах rphost. Сбросить кэш автонумератора можно через консоль администрирования кластера серверов 1С:
rphost в консоли администрирования кластера серверов или выполним перезапуск службы 1C:Enterprise Server Agent во внерабочее время.Если сброс кэша не помог или ошибка возвращается снова, выясним причину сбоя нумератора среди уже введенных данных. Разберем по шагам процедуру локализации некорректного номера:
ОбновитьНумерациюОбъектов() для закрепления результата.Если система дорабатывалась, проанализируем поведение события копирования объекта. Откроем модуль документа в конфигураторе и проверим наличие очистки реквизита Номер:
Процедура ПриКопировании(ОбъектКопирования)
// Очищаем номер, чтобы платформа автоматически сгенерировала новый при записи
ЭтотОбъект.Номер = "";
КонецПроцедуры
Если реквизит Номер очищен, типовой механизм автонумерации платформы выделит следующий корректный порядковый номер в момент непосредственной записи нового объекта в базу данных.