В процессе работы с прикладными решениями на платформе 1С:Предприятие разработчики и администраторы иногда сталкиваются со странной ситуацией: в справочнике появляются элементы с абсолютно одинаковыми кодами. При попытке вручную отредактировать код у любого из этих элементов или записать его программно платформа выдает ошибку "Код не уникален". Разберем подробно, как такая ситуация возможна на техническом уровне и какими методами можно устранить дубликаты.
Проанализируем стандартный механизм записи объектов платформы. При интерактивном создании элемента в режиме 1С:Предприятие или при стандартном программном вызове метода Записать() платформа автоматически проверяет уникальность кода (если для справочника включен соответствующий признак уникальности).
Однако при обмене данными или импорте из внешних систем сторонние обработки часто используют специальное свойство объекта:
Объект.ОбменДанными.Загрузка = Истина;
Флаг ОбменДанными.Загрузка указывает платформе, что объект переносится из другой информационной базы или внешнего источника и его данные уже считаются валидными. Установка этого флага приводит к следующим последствиям:
ПередЗаписью) заложена типовая проверка режима загрузки.Если внешняя обработка загружает данные и присваивает объекту код, который уже существует в базе, при включенном свойстве Загрузка = Истина запись пройдет успешно, а в базе появится дубликат кода.
Помимо прямого отключения проверок при импорте, рассмотрим другие распространенные причины, из-за которых в базе могут появляться повторяющиеся коды:
Посмотрим на пример кода, с помощью которого внешние обработки загружают элементы без контроля уникальности:
СправочникОбъект = Справочники.Партнеры.СоздатьЭлемент();
СправочникОбъект.Наименование = "Новый партнер (Импорт)";
СправочникОбъект.Код = "0000-000123"; // Код, уже существующий в базе
// Отключаем встроенные проверки платформы
СправочникОбъект.ОбменДанными.Загрузка = Истина;
// Запись пройдет успешно, несмотря на совпадение кода
СправочникОбъект.Записать();
Выяснив причину появления дубликатов, рассмотрим практические шаги по исправлению данных в информационной базе.
В большинстве конфигураций, использующих библиотеку стандартных подсистем (БСП), доступна типовая обработка удаления дублей. Выполним следующие действия:
Партнеры.Если необходимо программно исправить код одного из элементов-дублей, нужно переустановить ему код с помощью метода УстановитьНовыйКод() без использования флага загрузки обмена:
ПартнерОбъект = ДублирующийПартнерСсылка.ПолучитьОбъект();
// Генерируем новый уникальный код по правилам автонумерации
ПартнерОбъект.УстановитьНовыйКод();
// Записываем объект в обычном режиме (без ОбменДанными.Загрузка = Истина)
ПартнерОбъект.Записать();
Для перенаправления ссылок с дубля на правильный элемент воспользуемся методами НайтиПоСсылкам() и ЗаменитьСсылки().
Если дубликаты появились в результате сбоя нумератора или системных индексов, выполним процедуру обслуживания базы:
Для сброса закешированных значений счетчиков автонумерации на сервере 1С можно выполнить перезапуск службы ragent или программно вызвать метод обновления повторно используемых значений:
ОбновитьПовторноИспользуемыеЗначения();
Таким образом, использование свойства ОбменДанными.Загрузка = Истина в сторонних разработках требует от программиста самостоятельного контроля уникальности данных перед записью объектов.