К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как проверить уникальность номера документа

Как проверить уникальность номера документа в 1С: запросом, методом НайтиПоНомеру, настройками нумерации и контролем дублей. Разбор типовых ошибок.

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

Проверить уникальность номера можно несколькими способами: встроенными средствами конфигуратора, программным запросом, методом НайтиПоНомеру или универсальным отчётом. Выбор зависит от задачи — разовая проверка перед исправлением, контроль при записи документа в коде или аудит всей базы на предмет дублей.

Важно понимать, что сама платформа 1С по умолчанию не запрещает создание документов с одинаковыми номерами: контроль уникальности либо настраивается в свойствах объекта метаданных, либо реализуется прикладным кодом. Поэтому проверка — это обязательный этап как при разработке, так и при сопровождении учётной системы.

Как устроена нумерация документов в 1С и почему возникают дубли

Номер документа в 1С — строковый или числовой реквизит, который платформа присваивает автоматически при записи, если включён автонумерация. Уникальность номера в пределах вида документа и периода нумерации не контролируется жёстко на уровне СУБД: это не ключ записи. Реальный уникальный идентификатор документа — внутренняя ссылка (GUID), а номер — лишь «человекочитаемый» атрибут.

Дубли появляются в типовых ситуациях: ручное редактирование номера пользователем, загрузка документов через обмен (конвертацию данных, EnterpriseData, прямые запросы), восстановление из архивной копии с последующим вводом документов параллельно в двух базах, обработки группового создания документов без проверки. Отдельный источник проблем — перенумерация, запущенная одновременно с работой пользователей.

Проверка дублей запросом по всей базе

Универсальный способ найти все повторяющиеся номера — запрос с группировкой. Он подходит и для консоли запросов в режиме предприятия, и для программной проверки. Запрос выбирает номера, по которым существует больше одного документа.

ВЫБРАТЬ

РеализацияТоваровУслуг.Номер КАК Номер,

КОЛИЧЕСТВО(РеализацияТоваровУслуг.Ссылка) КАК КоличествоДокументов

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО

РеализацияТоваровУслуг.Номер

ИМЕЮЩИЕ

КОЛИЧЕСТВО(РеализацияТоваровУслуг.Ссылка) > 1

Ограничивайте выборку периодом: полное сканирование большой таблицы документов без отбора по дате может выполняться долго и нагружать сервер. Если нумерация ведётся в пределах года, имеет смысл группировать дополнительно по году даты документа — одинаковые номера в разных периодах нумерации являются нормой, а не дублем.

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

Порядок поиска дублей
  1. 1
    Откройте консоль запросов или создайте проверочный отчёт
  2. 2
    Сформируйте запрос с группировкой по номеру и условием КОЛИЧЕСТВО(Ссылка) > 1
  3. 3
    Ограничьте выборку проверяемым периодом через параметры дат
  4. 4
    Выполните запрос и проанализируйте список номеров-дублей
  5. 5
    Получите ссылки на конкретные документы и решите, какой из них оставить

Точечная проверка методом НайтиПоНомеру

Когда нужно проверить конкретный номер перед записью или при загрузке данных, используйте метод менеджера документа НайтиПоНомеру. Он принимает номер и дату — дата определяет интервал уникальности, в пределах которого ведётся поиск (обычно год).

ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(НомерДокумента, ДатаДокумента);

Если Не ДокументСсылка.Пустая() Тогда

Сообщить("Документ с номером " + НомерДокумента + " уже существует");

КонецЕсли;

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

Метод работает быстро, так как по реквизиту «Номер» построен индекс. Для массовой проверки тысяч номеров выгоднее один запрос с группировкой, чем цикл с НайтиПоНомеру — каждый вызов метода это отдельное обращение к базе.

Настройка контроля уникальности в конфигураторе

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

Контроль уникальности срабатывает только при автоматическом присвоении номера. Если пользователь или обработка явно задаёт номер, который уже занят, платформа запишет документ без ошибок. Поэтому для обменов и загрузок проверку нужно реализовывать в коде — например, в подписке на событие «ПередЗаписью» или «ПриЗаписи».

Также проверьте, не отключён ли контроль уникальности исторически: в некоторых конфигурациях его снимали ради совместимости с обменами. Восстановление флага — простое решение, но оно не исправит уже существующие дубли, их придётся перенумеровывать отдельно.

Проверка и исправление штатными обработками

В типовых конфигурациях (Бухгалтерия предприятия, Управление торговлей, ERP) есть встроенные механизмы работы с нумерацией. Функция перенумерации часто доступна через сервисные обработки или групповое изменение реквизитов: можно выбрать документы за период и присвоить им номера заново в хронологическом порядке.

Общий порядок безопасного исправления дублей: сделайте резервную копию базы, найдите дубли запросом, определите для каждой пары, какой документ «лишний» по номеру (обычно созданный позже), измените его номер на свободный или запустите перенумерацию за период, затем повторите проверочный запрос и убедитесь, что дублей не осталось.

Помните о последствиях перенумерации для уже напечатанных или отправленных контрагентам документов. Если счёт-фактура или акт с номером 15 уже передан покупателю, менять его номер в базе нельзя — исправлять нужно второй документ с тем же номером.

Контрольные точки

Как проверить результат

Повторный запрос на дубли за период
Норма

Результат пустой — каждому номеру соответствует один документ

Тревожный признак

Остались номера с количеством больше одного

Создание нового документа
Норма

Присваивается следующий свободный номер без конфликтов

Тревожный признак

Номер совпадает с существующим или нумерация сбилась

Печатные формы исправленных документов
Норма

Номер в форме совпадает с номером в базе и с переданным контрагенту документом

Тревожный признак

Расхождение номера в базе и в бумажной версии

Типичные ошибки и ограничения

Частая ошибка — поиск дублей без учёта периодичности нумерации. Если нумерация ведётся в пределах года, одинаковые номера в январе разных лет — норма, и «исправление» таких псевдодублей сломает учёт. Всегда добавляйте в анализ границы периода нумерации.

Вторая ошибка — работа с номером как с числом. В большинстве конфигураций номер строковый, содержит префикс базы или организации и лидирующие нули («00БП-000123»). Сравнение чисел и строк даст ложные результаты: префиксы нужно учитывать отдельно, а при обменах — сопоставлять форматы номеров в базах-источнике и приёмнике.

Третья группа проблем — параллельная работа. Проверка «найти дубль, потом записать» без транзакции не защищает от гонки: два сеанса могут одновременно убедиться, что номер свободен, и оба записать документ с ним. Для надёжного контроля в коде используйте управляемые блокировки или проверку внутри транзакции записи.

Типичные ошибки
01
Искать дубли по всей таблице без учёта периода нумерации — ложные срабатывания на документах разных лет
02
Сравнивать номер как число, игнорируя префиксы и лидирующие нули — существующий документ не находится
03
Пересчитывать номера без резервной копии — при ошибке восстановить исходную нумерацию невозможно
04
Менять номер документа, уже переданного контрагенту — расхождение печатных форм и данных базы
05
Проверять уникальность вне транзакции при параллельной работе — дубли возникают снова

Часто задаваемые вопросы

Запрещает ли 1С создавать документы с одинаковыми номерами?

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

Чем НайтиПоНомеру отличается от запроса?

НайтиПоНомеру — быстрый метод для проверки одного номера в пределах периода нумерации, он использует индекс и возвращает ссылку. Запрос гибче: позволяет искать дубли пакетно, сравнивать номера как строки, учитывать префиксы и строить отчёты по всем повторениям сразу.

Почему после обмена появились документы с одинаковыми номерами?

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

Можно ли перенумеровать документы за закрытый период?

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

Как проверить уникальность номера перед записью в своём коде?

В обработчике ПередЗаписью или ПриЗаписи выполните НайтиПоНомеру с номером и датой объекта. Если найденная ссылка непустая и не равна ссылке записываемого объекта, номер занят — выдайте сообщение и откажите в записи либо присвойте следующий свободный номер.

Итог

Что важно запомнить

Дубли номеров ищутся запросом с группировкой и условием КОЛИЧЕСТВО(Ссылка) > 1 с отбором по периоду нумерации. Точечная проверка в коде выполняется методом НайтиПоНомеру. Перед исправлением делайте копию базы, учитывайте префиксы и периодичность нумерации и не меняйте номера документов, уже переданных контрагентам.