Дубль кода или номера: почему 1С не даёт записать объект
Содержание
Ошибка Значение поля "Код" не уникально! (или "Номер") значит одно: в справочнике или в журнале документов уже есть объект с таким же кодом или номером, а в конфигурации включён контроль уникальности. Исправить её можно тремя способами: поменять код у записываемого объекта, перенумеровать старый дубль или убрать причину, из-за которой дубли появляются, — чаще всего это одинаковые префиксы баз при обмене.
Какой способ выбрать, зависит от масштаба. Один элемент не записывается — хватит правки в форме за минуту. Ошибка сыплется сотнями при загрузке или синхронизации — нужен поиск дублей запросом и настройка префиксов. Если же текст пришёл от СУБД (unique index, duplicate key), это уже не прикладная проверка, а повреждённые индексы, и чинят их в Конфигураторе.
Откуда в базе берутся одинаковые коды и номера
Платформа 1С проверяет уникальность при записи объекта. Проверка зависит от двух свойств объекта в конфигурации:
- 🔑 Контроль уникальности — флажок на вкладке нумерации справочника или документа. Включён — дубль не запишется.
- 📅 Периодичность номера у документов: непрерывно, в пределах года, квартала, месяца или дня. При периодичности «в пределах года» номер
0000-000015может встречаться в 2025 и 2026 году, но дважды в одном году — нет. - 🌳 Серии кодов у справочников: во всём справочнике, в пределах подчинения (родителю) или в пределах владельца. От этого зависит, среди каких элементов ищется дубль.
Сама автонумерация дублей не создаёт: новый код платформа берёт как следующий после максимального в своей серии. Конфликт появляется, когда код или номер попал в базу «мимо» счётчика.
Типичные источники:
- 🔄 Обмен данными без префиксов. Две базы (например, Бухгалтерия и Управление торговлей) выдают коды с одинаковым префиксом. Номенклатура
00-00000125создана в обеих, при синхронизации вторая не записывается. - 📥 Загрузка из Excel или другой базы с готовыми кодами. Загрузчик переносит код как есть.
- ✍️ Ручная правка кода или номера. Пользователь вписал код «на будущее» или скопировал номер из бумажного документа.
- 📆 Перенос документа в другой период. Документ
15за декабрь перенесли датой в январь, а там уже есть свой15. - 🧩 Изменение конфигурации. Серию кодов поменяли с «в пределах подчинения» на «во всём справочнике», или включили контроль уникальности на заполненном справочнике. Старые дубли спокойно лежат до первой перезаписи любого из них.
- 🗄️ Объединение баз или свёртка через обработки переноса данных, которые пишут объекты в режиме загрузки, без проверок.
Пункт 6 важен для понимания: при записи в режиме обмена (ОбменДанными.Загрузка = Истина) часть проверок пропускается, и дубли попадают в базу молча. Ошибка всплывает позже — когда бухгалтер откроет элемент, поправит наименование и нажмёт «Записать».
Сначала диагностика: в каком объекте дубль
По тексту ошибки обычно видно поле, но не объект. Порядок такой:
- Посмотрите, на каком действии ошибка: запись конкретного элемента, проведение документа, загрузка, синхронизация.
- Если пишется элемент справочника — скопируйте его код из формы.
- Откройте список этого справочника, включите отображение иерархии списком (чтобы видеть элементы всех групп) и найдите код через поиск по списку (
Ctrl+F, поле «Код»). - Для документа — откройте журнал этого вида документов, поставьте отбор по периоду, совпадающему с периодичностью номера, и найдите номер.
При синхронизации данных текст ошибки сохраняется в журнале регистрации. Откройте Администрирование → Обслуживание → Журнал регистрации, установите отбор по уровню «Ошибка» и по времени обмена. В событии обычно указан объект и его представление — по нему и ищите пару.
Если поиск в списке находит только один элемент с этим кодом, проверьте помеченные на удаление. Помеченный объект физически в базе и участвует в проверке уникальности. Включите показ помеченных в списке.
Исправление в форме объекта: один дубль за минуту
Когда конфликт единичный, проще всего решить его прямо в интерфейсе.
Справочник: очистить код
- В форме элемента, который не записывается, сотрите значение поля «Код» полностью.
- Нажмите «Записать».
- При включённой автонумерации платформа сама присвоит пустому коду следующий свободный номер в серии.
Если поле кода недоступно для редактирования, правка закрыта формой конфигурации. Тогда меняйте не новый, а старый элемент — или используйте способ из следующего раздела.
Документ: очистить номер
- Откройте документ, очистите поле «Номер».
- Запишите или проведите документ — номер присвоится заново по нумератору текущего периода.
- Если номер документа важен (он совпадает с бумажным оригиналом от контрагента), используйте поле входящего номера, а не основной номер документа.
Перенумерация уже отправленных контрагенту документов (счетов-фактур, актов, УПД) меняет номер в печатной форме. Перед этим убедитесь, что документ не ушёл по ЭДО и не попал в сданную отчётность.
Когда дубль — это один и тот же объект
Часто два элемента с одинаковым кодом — это одна и та же номенклатура или контрагент, пришедший двумя путями. Переименовывать код тут бесполезно: через месяц в базе будут два «Молока 3,2%», и остатки разъедутся.
Правильный путь — объединить дубли. В типовых конфигурациях на БСП есть обработка «Поиск и удаление дублей» в разделе Администрирование → Обслуживание. Она находит похожие элементы, позволяет выбрать главный и заменяет ссылки на дубль во всех документах. После замены дубль помечается на удаление.
Массовый поиск неуникальных значений через консоль запросов
Когда дублей десятки, листать списки бессмысленно. Нужен запрос. Его выполняют в режиме 1С:Предприятие через внешнюю обработку
«Консоль запросов» (её открывают через Файл → Открыть под пользователем с правами администратора).
Дубли кодов в справочнике
Пример для справочника «Номенклатура». Имя справочника замените на своё, имя видно в тексте ошибки или в журнале регистрации.
ВЫБРАТЬ
Спр.Код КАК Код,
КОЛИЧЕСТВО(Спр.Ссылка) КАК Количество
ИЗ
Справочник.Номенклатура КАК Спр
СГРУППИРОВАТЬ ПО
Спр.Код
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Спр.Ссылка) > 1
УПОРЯДОЧИТЬ ПО
Количество УБЫВ
Если серия кодов «в пределах подчинения», дубль ищется внутри одной группы. Добавьте в выборку и группировку поле Спр.Родитель. Для серии «в пределах владельца» — поле Спр.Владелец.
Чтобы увидеть сами элементы, а не только коды, выполните второй запрос:
ВЫБРАТЬ
Спр.Ссылка,
Спр.Код,
Спр.Наименование,
Спр.ПометкаУдаления
ИЗ
Справочник.Номенклатура КАК Спр
ГДЕ
Спр.Код В
(ВЫБРАТЬ
Д.Код
ИЗ
Справочник.Номенклатура КАК Д
СГРУППИРОВАТЬ ПО
Д.Код
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Д.Ссылка) > 1)
УПОРЯДОЧИТЬ ПО
Спр.Код
Дубли номеров документов
Для документов группируйте ещё и по периоду. При периодичности «в пределах года»:
ВЫБРАТЬ
Док.Номер КАК Номер,
НАЧАЛОПЕРИОДА(Док.Дата, ГОД) КАК Год,
КОЛИЧЕСТВО(Док.Ссылка) КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
СГРУППИРОВАТЬ ПО
Док.Номер,
НАЧАЛОПЕРИОДА(Док.Дата, ГОД)
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Док.Ссылка) > 1
Периодичность смотрите в Конфигураторе, в свойствах документа на вкладке нумерации. Если стоит «в пределах квартала» или «месяца» — замените ГОД на КВАРТАЛ или МЕСЯЦ.
Что делать с результатом
| Ситуация | Что делать | Риск |
|---|---|---|
| Дубль — помеченный на удаление объект без ссылок | Удалить помеченные (Администрирование → Обслуживание → Удаление помеченных объектов) | Низкий, если ссылок нет |
| Два разных объекта с одним кодом | Очистить код у одного и перезаписать | Низкий; меняется код в печатных формах |
| Один и тот же объект, заведённый дважды | Объединить через «Поиск и удаление дублей» | Средний: перезаписываются документы |
| Документы с одинаковым номером | Очистить номер у документа, не ушедшего контрагенту | Средний: меняется номер в первичке |
Удаление помеченных объектов в клиент-серверной базе можно запускать при работающих пользователях, но в файловой базе обработка может потребовать завершения сеансов. Делайте это вне рабочего времени.
Когда ошибку выдаёт СУБД, а не 1С
Иногда текст ошибки другой и длинный: в нём есть Cannot insert duplicate key row, unique index, Попытка вставки неуникального значения в уникальный индекс. Это значит, что дубль нарушил индекс на уровне таблицы базы данных. Прикладная проверка тут ни при чём — у таблицы повреждён или рассогласован индекс, либо в ней физически лежат две строки с одинаковым ключом.
Чаще всего так бывает после аварийного отключения питания, сбоя диска, неудачной загрузки .dt или обрыва реструктуризации при обновлении.
Перед любыми действиями в Конфигураторе сделайте резервную копию базы
— выгрузку .dt или бэкап средствами СУБД.
Тестирование и исправление
- Попросите всех выйти из базы: режиму нужен монопольный доступ, открытые сеансы будут мешать запуску. Планируйте на нерабочее время.
- Откройте базу в Конфигураторе.
- Меню
Администрирование → Тестирование и исправление. - Отметьте «Реиндексация таблиц информационной базы» и «Проверка логической целостности информационной базы».
- Режим — «Тестирование и исправление».
- Нажмите «Выполнить» и дождитесь окончания. На базе в десятки гигабайт это занимает часы.
Реиндексация перестраивает индексы, и если дубли были «фантомными», ошибка уходит. Если в таблице реально две строки с одним ключом, проверка логической целостности покажет проблемные записи в протоколе.
Файловая база: chdbfl.exe
Для файловой базы есть отдельная утилита проверки физической целостности chdbfl.exe. Она лежит в каталоге bin установленной платформы, например C:\Program Files\1cv8\8.3.25.xxxx\bin\. Запускайте при закрытой базе, укажите файл 1Cv8.1CD и включите флажок исправления ошибок.
Клиент-серверная база
На MS SQL Server или PostgreSQL сначала выполните тестирование и исправление из Конфигуратора. Если не помогло, администратор СУБД проверяет таблицы своими средствами (DBCC CHECKDB в MS SQL).
Не удаляйте строки-дубли прямыми SQL-запросами в таблицах _Reference… или _Document…. На эти записи могут ссылаться движения регистров, и база получит битые ссылки, которые потом не найти. Прямое вмешательство в таблицы — только как крайняя мера, с копией и пониманием структуры.
Как не допустить повторных конфликтов уникальности
Исправленные дубли вернутся, если не убрать их источник.
Префиксы при обмене
У каждой базы в обмене должен быть свой префикс. В Бухгалтерии 3.0 он задаётся в Администрирование → Синхронизация данных, поле префикса этой информационной базы. Пример: Бухгалтерия — БП, Управление торговлей — УТ. Тогда коды выглядят как БП-00000125 и УТ-00000125 и не пересекаются.
Префикс применяется к новым объектам. Уже созданные с одинаковыми кодами нужно перенумеровать по результатам запроса из раздела выше.
Префикс организации в номерах документов
Если в одной базе несколько организаций, задайте каждой префикс в карточке организации. Он входит в номер документа и разводит нумерацию между юрлицами.
Загрузка данных
- 📥 При загрузке из таблицы не переносите колонку кода, если коды не нужны для сверки. Пусть автонумерация выдаст свои.
- 🔍 Если коды нужны, сначала проверьте диапазон: у загружаемых кодов не должно быть пересечений с существующими.
- 🧪 Тестовую загрузку делайте на копии базы.
Изменения в конфигурации
Не отключайте флажок «Контроль уникальности» в типовой конфигурации ради одной ошибки. Это снимает объект с поддержки, ломает обновления и пропускает в базу дубли, которые потом путают документы и отчёты. Перед включением контроля или сменой серии кодов на нетиповом справочнике прогоните запрос на дубли и исправьте их заранее.