Как исправить ошибку «Номер не уникальный» при копировании документов в 1С:Управление торговлей 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе повседневной работы в конфигурации 1С:Управление торговлей 11 пользователи нередко сталкиваются с ситуацией, когда при создании документа методом копирования система выдает ошибку о нарушении уникальности номера. При этом в пользовательском режиме номера вручную никто не редактирует. Разберем причины возникновения этой проблемы и рассмотрим практические способы ее устранения.

Почему возникает ошибка неуникальности номера

Проанализируем ключевые факторы, приводящие к сбою механизма автонумерации платформы 1С:

  1. Рассинхронизация кэша нумерации кластера серверов. В клиент-серверном режиме платформа 1С кэширует свободные пулы номеров в оперативной памяти рабочих процессов rphost. При разворачивании резервной копии базы данных, переносе на другой сервер или нештатном падении процессов кэш может рассинхронизироваться с фактическими номерами в таблицах СУБД. Автонумератор пытается выдать номер, который физически уже занят.
  2. Сбой шаблона автоинкремента из-за загрузки данных. При обмене через синхронизацию данных (с бухгалтерией, сайтами, маркетплейсами или в узлах РИБ) в информационную базу могут попадать документы с нестандартными номерами. Например, номер может содержать латинские буквы вместо кириллицы в префиксе, пропущенные лидирующие нули или сдвинутые разряды. Платформа берет старшее лексикографическое значение и больше не может рассчитать следующий корректный шаг.
  3. Исчерпание разрядности нумератора. Если номер достиг максимальной величины (к примеру, 999999), автоинкремент упирается в предел разрядности и не может назначить новый свободный номер.
  4. Неочищенный номер в обработчике копирования. При копировании существующего документа за сброс значений реквизитов отвечает процедура ПриКопировании в модуле объекта. Если в типовом коде или доработанном модуле реквизит Номер не очищается принудительно, система может попытаться сохранить новый документ с номером исходного документа.
  5. Смена префиксов и периодичность. Если изменился префикс узла информационной базы или организации, маска генерации номеров может наложиться на уже существующие документы в рамках периода (например, года).

Способ 1. Использование метода ОбновитьНумерациюОбъектов

Рассмотрим самый быстрый и действенный способ устранения рассинхронизации кэша — программное обновление нумерации объектов. Платформа 1С предоставляет встроенную процедуру ОбновитьНумерациюОбъектов(), которая заставляет перечитать максимальные номера непосредственно из базы данных и обновить кэш кластера.

Если вызвать метод без параметров, он выполнит актуализацию номеров вообще для всех объектов конфигурации. В крупных базах это может создать ощутимую нагрузку на сервер. Поэтому разберем по шагам, как выполнить адресное обновление только для конкретного типа документа:

  1. Откроем обработку «Групповое изменение реквизитов» или специальную внешнюю обработку произвольного алгоритма.
  2. Выполним программный код с указанием конкретного метаданного:

// Адресное обновление нумерации для конкретного типа документа
ОбновитьНумерациюОбъектов(Метаданные.Документы.ЗаказКлиента);

Если необходимо сбросить кэш сразу для всей конфигурации, выполним вызов без параметров:


// Полное обновление нумерации для всех объектов конфигурации
ОбновитьНумерациюОбъектов();

После выполнения данного кода проверим создание документа копированием — платформа пересчитает максимальный номер и присвоит следующий свободный идентификатор.

Способ 2. Перезапуск рабочих процессов сервера 1С

Посмотрим на альтернативное решение для системных администраторов, если ошибка вызвана зависшим кэшем в процессах rphost. Сбросить кэш автонумератора можно через консоль администрирования кластера серверов 1С:

  1. Завершим проблемные рабочие процессы rphost в консоли администрирования кластера серверов или выполним перезапуск службы 1C:Enterprise Server Agent во внерабочее время.
  2. При перезапуске процессов кэш свободных диапазонов очищается, и при первом обращении к объекту платформа запросит актуальный максимальный номер из таблиц СУБД заново.

Способ 3. Поиск и исправление документа-нарушителя

Если сброс кэша не помог или ошибка возвращается снова, выясним причину сбоя нумератора среди уже введенных данных. Разберем по шагам процедуру локализации некорректного номера:

  1. Откроем журнал документов, в котором возникает ошибка при копировании.
  2. Установим отбор по текущей организации и периоду (текущему календарному году).
  3. Нажмем на заголовок колонки «Номер» и отсортируем список по убыванию.
  4. Внимательно проанализируем самые верхние записи в списке: ищем номера без лидирующих нулей, с пробелами, с предельной разрядностью («999999») или с латинскими буквами вместо русских в префиксе.
  5. Скорректируем номер документа-нарушителя вручную (включив редактирование номера) или через обработку Групповое изменение реквизитов, восстановив правильную разрядность и ведущие нули.
  6. После исправления номера обязательно вызовем ОбновитьНумерациюОбъектов() для закрепления результата.

Способ 4. Проверка обработчика ПриКопировании в конфигурации

Если система дорабатывалась, проанализируем поведение события копирования объекта. Откроем модуль документа в конфигураторе и проверим наличие очистки реквизита Номер:


Процедура ПриКопировании(ОбъектКопирования)
    // Очищаем номер, чтобы платформа автоматически сгенерировала новый при записи
    ЭтотОбъект.Номер = "";
КонецПроцедуры

Если реквизит Номер очищен, типовой механизм автонумерации платформы выделит следующий корректный порядковый номер в момент непосредственной записи нового объекта в базу данных.

← На главную