Как образуются дубли кодов в справочниках 1С и как их исправить?

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

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

Главная причина: отключение контроля уникальности через ОбменДанными

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

Однако при обмене данными или импорте из внешних систем сторонние обработки часто используют специальное свойство объекта:

Объект.ОбменДанными.Загрузка = Истина;

Флаг ОбменДанными.Загрузка указывает платформе, что объект переносится из другой информационной базы или внешнего источника и его данные уже считаются валидными. Установка этого флага приводит к следующим последствиям:

  1. Отключаются платформенные проверки логической целостности, в том числе контроль уникальности кодов и номеров.
  2. Пропускается большинство бизнес-проверок в модуле объекта и подписках на события, если в коде обработчиков (например, ПередЗаписью) заложена типовая проверка режима загрузки.

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

Дополнительные факторы возникновения дублей

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

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

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

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


СправочникОбъект = Справочники.Партнеры.СоздатьЭлемент();
СправочникОбъект.Наименование = "Новый партнер (Импорт)";
СправочникОбъект.Код = "0000-000123"; // Код, уже существующий в базе

// Отключаем встроенные проверки платформы
СправочникОбъект.ОбменДанными.Загрузка = Истина;

// Запись пройдет успешно, несмотря на совпадение кода
СправочникОбъект.Записать();

Способы решения проблемы и удаления дублей

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

1. Использование типовой обработки «Поиск и удаление дублей»

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

  1. Откроем раздел Администрирование — Обслуживание — Корректировка данных — Поиск и удаление дублей.
  2. В поле выбора области поиска укажем справочник Партнеры.
  3. Установим правило сравнения (по совпадению наименования, ИНН или кода).
  4. Нажмем Найти дубли, выберем правильный элемент-оригинал и заменяемые дубликаты. Обработка автоматически перенесет все ссылки из документов и регистров на оригинальный элемент и пометит дубль на удаление.

2. Программная перенумерация и замена ссылок

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


ПартнерОбъект = ДублирующийПартнерСсылка.ПолучитьОбъект();

// Генерируем новый уникальный код по правилам автонумерации
ПартнерОбъект.УстановитьНовыйКод();

// Записываем объект в обычном режиме (без ОбменДанными.Загрузка = Истина)
ПартнерОбъект.Записать();

Для перенаправления ссылок с дубля на правильный элемент воспользуемся методами НайтиПоСсылкам() и ЗаменитьСсылки().

3. Тестирование и исправление информационной базы

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

  1. Создадим резервную копию информационной базы.
  2. Запустим конфигуратор и откроем меню Администрирование — Тестирование и исправление...
  3. Установим флаги Проверка логической целостности и Пересчет служебных данных.
  4. Нажмем Выполнить.

4. Сброс кэша нумератора

Для сброса закешированных значений счетчиков автонумерации на сервере 1С можно выполнить перезапуск службы ragent или программно вызвать метод обновления повторно используемых значений:

ОбновитьПовторноИспользуемыеЗначения();

Таким образом, использование свойства ОбменДанными.Загрузка = Истина в сторонних разработках требует от программиста самостоятельного контроля уникальности данных перед записью объектов.

← На главную