Почему в 1С 7.7 возникает ошибка неуникальности номера и как устранить пропуски в нумерации документов

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Причина ошибки «Номер не уникальный»: сквозной нумератор метаданных

Если в журнале конкретного вида документа номер отсутствует, но система блокирует его ввод, первой и главной причиной является использование общего нумератора. В дереве конфигурации для каждого документа можно настроить собственный счетчик либо назначить объект метаданных «Нумератор». Когда один и тот же нумератор назначен нескольким видам документов (например, «Расходная накладная» и «Акт выполненных работ»), они делят общее пространство номеров.

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

Выясним, как проверить и исправить эту настройку:

  1. Откроем базу в режиме Конфигуратор.
  2. Найдем в дереве метаданных проблемный документ и откроем окно его свойств.
  3. Перейдем на закладку, отвечающую за нумерацию, и проверим поле Нумератор. Если там указан общий нумератор, выясним, какие еще документы к нему привязаны.
  4. Если разделение нумерации допустимо логикой учета, очистим привязку к нумератору, оставив собственную нумерацию документа.

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

Другие причины «невидимой» неуникальности номера

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

  1. Документ помечен на удаление. В платформе 1С 7.7 пометка на удаление не освобождает номер. Документ физически остается в базе (в таблице 1SJOURN.DBF) и продолжает проверяться на уникальность. Чтобы освободить номер, необходимо запустить процедуру физического удаления помеченных объектов в монопольном режиме.
  2. Ограничение интервала видимости журнала. Документ с проблемным номером может быть случайно записан будущей датой или прошлым годом. Откроем общий журнал документов, снимем все отборы по авторам, фирмам и установим максимально широкий интервал (без ограничения дат), после чего выполним сортировку по графе «Номер».
  3. Скрытые пробелы и смешение раскладок. Если номер имеет текстовый формат, номер « 154» (с пробелом впереди) или номер с латинскими буквами визуально неотличим от стандартного, однако сбивает автонумератор платформы. При поиске максимума по строковому индексу лексикографическая сортировка может выдавать некорректный следующий номер.
  4. Автоматическое создание подчиненных документов. Проверим модуль документа: если при проведении или записи создается скрытый подчиненный документ другого типа с дублированием номера родителя, коллизия может возникать именно на подчиненном объекте.

Почему возникают дыры в стандартной нумерации 1С 7.7

Разберем механизм автонумерации платформы. Когда пользователь нажимает кнопку создания нового документа или в коде вызывается метод Док.Новый(), платформа определяет максимальный номер в базе на данный момент и резервирует следующий. Если в этот момент два пользователя одновременно открывают новый документ, первый получает номер 154, а второй — 155.

Если второй пользователь сохраняет документ (получая номер 155), а первый закрывает окно без сохранения, номер 154 оказывается навсегда пропущенным. Встроенный автонумератор не возвращается назад для заполнения пустых ячеек, отсчитывая новые значения строго от максимального записанного номера.

Как реализовать сплошную бездырочную нумерацию

Чтобы гарантировать отсутствие пропусков при отказе пользователей от сохранения документов, применяется алгоритм отложенной нумерации. Номер не должен присваиваться при интерактивном открытии формы.

Рассмотрим популярную схему с временным префиксом. При создании документа ему назначается заведомо временный префикс (например, «ВР» или «ЫЫ»), а реальный номер генерируется встроенной функцией УстановитьНовыйНомер() непосредственно в момент сохранения или проведения.

Посмотрим на пример реализации в модуле формы документа:


Процедура ПриОткрытии()
    Если Выбран() = 0 Тогда
        // При создании нового документа назначаем временный префикс
        Префикс = "ВР";
        УстановитьНовыйНомер(Префикс);
    КонецЕсли;
КонецПроцедуры

Далее перехватываем момент окончательной фиксации документа в процедуре ПриЗаписи():


Процедура ПриЗаписи()
    // Проверяем, содержит ли номер временный префикс
    Если Найти(СокрЛП(НомерДок), "ВР") > 0 Тогда
        // Устанавливаем рабочий префикс базы или организации
        РабочийПрефикс = СокрЛП(Константа.ПрефиксБазы);
        УстановитьНовыйНомер(РабочийПрефикс);
    КонецЕсли;
КонецПроцедуры

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

← На главную