Почему возникает ошибка «Неуникальный номер документа» в 1С и как восстановить нумерацию?

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

При активной многопользовательской работе в 1С (в частности, в файловых информационных базах конфигурации «Управление торговлей 10.3») периодически возникает сбой автонумерации: программа пропускает очередной порядковый номер. При попытке пользователя вручную вернуть документу пропущенный номер система выдает сообщение об ошибке: «Неуникальный номер документа», хотя при визуальном просмотре журнала документов с таким номером не видно.

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

Основные причины блокировки номера

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

  1. Наличие помеченных на удаление или скрытых документов. Документ с данным номером может реально существовать в таблице базы данных, но быть помеченным на удаление либо отсекаться установленными в журнале фильтрами (отбор по организации, подразделению, датам или ограничения RLS).
  2. Использование общего нумератора. Если для нескольких видов документов (например, СчетНаОплатуПокупателю и ЗаказПокупателя) в конфигурации назначен единый объект метаданных «Нумератор», номер может быть занят документом другого типа.
  3. Периодичность нумерации. Если для документа задана периодичность «В пределах года» или «Непериодический», документ с аналогичным номером может находиться в другом временном интервале или в прошлом расчетном году.
  4. Сбой кэша номеров в файловом режиме. При одновременном создании новых документов несколькими пользователями платформа резервирует номера в сеансах. Если пользователь открыл новый документ, получил номер и закрыл форму без сохранения, этот номер может остаться заблокированным в кэше автонумератора до момента сброса.
  5. Разница в невидимых символах и префиксах. Визуально одинаковые номера могут отличаться латинскими и кириллическими буквами в префиксах (например, русская «С» и английская «C»), пробелами в конце строки или нарушением разрядности (потеря лидирующих нулей при ручном вводе).

Шаг 1. Поиск скрытого или удаленного документа через запрос

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


ВЫБРАТЬ
    Док.Ссылка КАК Документ,
    Док.ПометкаУдаления КАК ПометкаУдаления,
    Док.Дата КАК Дата,
    Док.Организация КАК Организация
ИЗ
    Документ.СчетНаОплатуПокупателю КАК Док
ГДЕ
    Док.Номер ПОДОБНО "%000000100%"

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

Шаг 2. Программный сброс кэша нумерации

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

Создадим внешнюю обработку или выполним в режиме «1С:Предприятие» следующий код:


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

// Либо сброс нумерации по всей информационной базе
ОбновитьНумерациюОбъектов();

Метод анализирует существующие непустые номера в таблицах базы данных, очищает закэшированные в сеансах счетчики и пересчитывает максимальный доступный номер в соответствии с заданной периодичностью.

Шаг 3. Восстановление длины и формата номеров

Ручное редактирование номеров пользователями часто приводит к потере лидирующих нулей (например, вместо номера УТ000000105 записывается 105). Для платформы 105 является строковым значением максимальной длины, из-за чего следующий автоматически созданный номер формируется некорректно.

Разберем алгоритм восстановления строкового формата номера с сохранением лидирующих нулей:


Функция ПривестиНомерКФормату(Номер, ДлинаНомера)
    
    СкорректированныйНомер = СокрЛП(Номер);
    Пока СтрДлина(СкорректированныйНомер) < ДлинаНомера Цикл
        СкорректированныйНомер = "0" + СкорректированныйНомер;
    КонецЦикла;
    
    Возврат СкорректированныйНомер;
    
КонецФункции

После выравнивания длины всех номеров за текущий период необходимо повторно вызвать ОбновитьНумерациюОбъектов().

Шаг 4. Организация соответствия номеров документов

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

  1. Использование реквизита связи. Вместо совпадения номеров связывать документы через реквизиты Сделка, ДоговорКонтрагента или ДокументОснование. При необходимости номер счета или договора выводится в печатную форму накладной программно.
  2. Программное заполнение в обработчиках событий. Если бизнес-процесс строго требует идентичности номеров, синхронизацию реализуют программно в событии ПередЗаписью или УстановитьНовыйНомер зависимого документа, исключая ручной ввод номеров пользователями:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ЭтоНовый() И ЗначениеЗаполнено(Сделка) Тогда
        // Назначаем номер на основе связанного документа
        ЭтотОбъект.Номер = Сделка.Номер;
    КонецЕсли;
    
КонецПроцедуры

Использование связующих реквизитов и своевременный вызов ОбновитьНумерациюОбъектов() позволяют полностью устранить ошибки неуникальности номеров и исключить сбои автонумератора при совместной работе пользователей.

← На главную