Дубль кода в справочнике 1С: находим конфликтующий элемент и освобождаем код

· 9 мин

Содержание

Сообщение Значение поля "Код" не уникально значит одно: в этом справочнике (или в той же серии кодов) уже есть элемент с таким же кодом, а у справочника включён контроль уникальности. Чтобы исправить ошибку, очистите поле «Код» у записываемого элемента и запишите его заново — автонумерация выдаст свободный код. Если код нужен именно этот, найдите элемент-дубль и смените код у него.

Частое заблуждение — что база «сломалась» и нужно запускать тестирование и исправление. Нет: платформа сработала штатно и защитила справочник от повтора. Ломать базу ничего не нужно, нужно понять, откуда взялся занятый код, иначе значение поля код снова окажется не уникальным на следующем же элементе.

Откуда берётся конфликт уникальности кода

Платформа 1С 8.3 проверяет код при каждой записи элемента, если в свойствах справочника в Конфигураторе отмечен флажок «Контроль уникальности». Проверка идёт в пределах серии кодов — это ещё одно свойство справочника:

  • 📚 Во всём справочнике — код не может повториться нигде;
  • 🗂 В пределах подчинения — коды уникальны внутри одной группы-родителя;
  • 🏢 В пределах подчинения владельцу — уникальны в рамках владельца (например, договоры одного контрагента).

Отсюда типичные ситуации, когда возникает ошибка:

  • ✍️ Код ввели вручную. Пользователь набрал код, который уже занят, или скопировал элемент и не поменял код.
  • 📈 Автонумерация «перепрыгнула». Следующий код платформа берёт от максимального существующего в серии. Если кто-то вручную записал элемент с кодом 0000099999, дальше нумерация пойдёт от него — и при смене префикса или при возврате к старому диапазону коды начнут сталкиваться.
  • 🔄 Загрузка и обмен. Элементы пришли из другой базы, из Excel или внешней обработки с готовыми кодами. При загрузке в режиме обмена данными (ОбменДанными.Загрузка = Истина) проверки при записи не выполняются, поэтому дубли могут лечь в базу молча, а ошибка всплывёт позже — при ручной правке любого из них.
  • 🌐 Распределённая база без префиксов. Если узлы РИБ или синхронизируемые программы создают элементы без префикса базы, одинаковые коды в двух узлах неизбежны.
  • ⚙️ Контроль уникальности включили позже. В доработанной конфигурации флажок могли поставить, когда дубли уже были. Старые элементы живут, но любая их перезапись падает с ошибкой.

Строковые коды 1 и 0000000001 для платформы разные значения. Поэтому ручной ввод «короткого» кода не вызовет ошибку сразу, но создаст путаницу, которая потом мешает найти нужный элемент.

Как найти дублирующиеся элементы

Текст ошибки не говорит, с каким элементом случился конфликт. Найти его можно тремя способами — от самого простого к самому точному.

Через форму списка

  1. Откройте справочник, в котором возникла ошибка.
  2. Если в списке не видно колонки «Код», включите её: Ещё → Изменить форму и отметьте поле.
  3. Нажмите Ctrl+F и введите проблемный код, выбрав поиск по колонке «Код».
  4. Если справочник иерархический, переключите список в режим просмотра без групп (Ещё → Режим просмотра → Список), иначе элемент из другой группы останется скрытым.

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

Запросом в консоли

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

ВЫБРАТЬ
    Спр.Код КАК Код,
    КОЛИЧЕСТВО(Спр.Ссылка) КАК Количество
ИЗ
    Справочник.Номенклатура КАК Спр
СГРУППИРОВАТЬ ПО
    Спр.Код
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Спр.Ссылка) > 1

Замените Номенклатура на имя своего справочника. Для серии «в пределах подчинения» добавьте в выборку и группировку поле Родитель, для серии «в пределах владельца» — поле Владелец. Иначе запрос покажет «дубли», которые платформа дублями не считает.

Чтобы увидеть сами элементы, а не только коды, выполните второй запрос:

ВЫБРАТЬ
    Спр.Ссылка,
    Спр.Код,
    Спр.ПометкаУдаления
ИЗ
    Справочник.Номенклатура КАК Спр
ГДЕ
    Спр.Код = &Код

Параметру Код задайте значение из первого запроса.

Обработкой «Поиск и удаление дублей»

В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) есть штатная обработка «Поиск и удаление дублей». В Бухгалтерии она лежит в Администрирование → Обслуживание → Корректировка данных. Обработка ищет совпадения по выбранным полям — коду, наименованию, ИНН — и умеет заменять ссылки на дубль ссылками на оставшийся элемент.

Это полезно, когда дубль — не просто повтор кода, а настоящая копия: один и тот же контрагент или товар заведён дважды.

Исправляем ошибку в пользовательском режиме

Способ зависит от того, кто из двух элементов «лишний».

СитуацияЧто делатьРиск
Новый элемент, код не важенОчистить поле «Код», записать — автонумерация выдаст свободныйНет
Новый элемент, код важенНайти старый элемент с этим кодом, сменить код у негоКод может стоять в печатных формах и внешних системах
Два элемента — одна сущностьОбъединить через «Поиск и удаление дублей»Ссылки переносятся во всех документах
Старый ненужный элементПометить на удаление и удалить помеченныеУдаление невозможно, пока на элемент есть ссылки

Смена кода вручную

  1. Откройте элемент, который будет уступать код.
  2. Сотрите значение в поле «Код». Если поле недоступно для правки, у вашей роли нет на это прав — обратитесь к администратору.
  3. Нажмите Записать. При включённой автонумерации платформа присвоит следующий свободный код.
  4. Вернитесь к исходному элементу и запишите его.

Коды номенклатуры и контрагентов часто выгружаются на сайт, в торговое оборудование или в ЭДО. Прежде чем менять код у старого элемента, проверьте, не идёт ли сопоставление по нему во внешних системах.

Объединение настоящих дублей

Если два элемента описывают одну сущность, смена кода лишь спрячет проблему: документы так и будут разбиты по двум карточкам. В обработке «Поиск и удаление дублей» отметьте элемент, который остаётся оригиналом, и запустите замену. Ссылки во всех документах и регистрах перейдут на оригинал, а дубль будет помечен на удаление.

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

Что можно сделать в Конфигураторе

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

Проверить свойства справочника

Откройте справочник в дереве конфигурации, свойства — вкладка «Данные» (в окне редактирования объекта) или палитра свойств. Там видно:

  • длину и тип кода (строка или число);
  • допустимую длину — фиксированную или переменную;
  • серию кодов;
  • флажки «Автонумерация» и «Контроль уникальности».

Снять флажок «Контроль уникальности» технически можно, но это не лечение. В типовой конфигурации на поддержке такое изменение требует снятия с поддержки и усложнит обновления, а дубли останутся.

Массово перенумеровать дубли

Если найдено много повторов, их перенумеровывают внешней обработкой. Ключевой метод — УстановитьНовыйКод() у объекта справочника: он присваивает следующий код по правилам автонумерации. Фрагмент для серверной процедуры:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Спр.Ссылка КАК Ссылка,
|    Спр.Код КАК Код
|ИЗ
|    Справочник.Номенклатура КАК Спр
|ГДЕ
|    Спр.Код В
|        (ВЫБРАТЬ
|            Д.Код
|        ИЗ
|            Справочник.Номенклатура КАК Д
|        СГРУППИРОВАТЬ ПО
|            Д.Код
|        ИМЕЮЩИЕ
|            КОЛИЧЕСТВО(Д.Ссылка) > 1)
|УПОРЯДОЧИТЬ ПО
|    Спр.Код,
|    Спр.Ссылка";

Выборка = Запрос.Выполнить().Выбрать();
ПредыдущийКод = Неопределено;
Пока Выборка.Следующий() Цикл
    Объект = Выборка.Ссылка.ПолучитьОбъект();
    Если Объект.Код = ПредыдущийКод Тогда
        Объект.УстановитьНовыйКод();
        Объект.Записать();
    КонецЕсли;
    ПредыдущийКод = Выборка.Код;
КонецЦикла;

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

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

Документы, планы счетов и регистры

Ошибка с полем «Код» — это справочники, планы видов характеристик и планы счетов. У документов то же самое называется Значение поля "Номер" не уникально.

Номер документа

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

Конфликт номеров обычно появляется в трёх случаях:

  • 🗓 документ перенесли в другой год или квартал, где такой номер уже есть;
  • 🏢 у двух организаций в базе одинаковый префикс или он пустой;
  • 🔄 документы загрузили из другой базы с готовыми номерами.

В Бухгалтерии 3.0 префикс организации задаётся в её карточке (Справочники → Организации), поле «Префикс». Для документа исправление то же, что и для элемента справочника: очистить номер и записать, либо сменить номер у старого документа.

План счетов

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

Регистры сведений

У регистров нет поля «Код», и ошибка про код к ним не относится. Регистр сведений ругается на повтор комбинации измерений и периода, а не на код. Если сообщение появилось при записи набора записей регистра, ищите запись с теми же измерениями и тем же периодом.

Диагностика: выберите симптом

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

Конфликт кодов почти всегда следствие ручного вмешательства или загрузки. Несколько правил закрывают большую часть случаев:

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

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

Частые вопросы

Можно ли удалить элемент-дубль, просто пометив его на удаление?
Пометка код не освобождает. Код станет свободным только после окончательного удаления через Администрирование → Обслуживание → Удаление помеченных объектов, а удалить элемент, на который ссылаются документы, не получится.
Поможет ли «Тестирование и исправление» в Конфигураторе?
Нет, это не его задача. Повтор кодов — логическая ошибка данных, её убирают перенумерацией или объединением дублей.
Почему ошибка появляется у одного пользователя и не появляется у другого?
Скорее всего, они создают элементы в разных группах или для разных владельцев, а серия кодов задана «в пределах подчинения». Конфликт возникает только в той группе, где код уже занят.
Можно ли вернуть элементу старый код после перенумерации?
Да, если код свободен: откройте элемент, впишите значение вручную и запишите. Платформа примет его, раз повтора нет.
Влияет ли смена кода на проведённые документы?
Нет. Документы ссылаются на элемент по внутренней ссылке, а не по коду. Изменятся только печатные формы и отчёты, где код выводится.