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

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

При обновлении конфигурации 1С:Розница (особенно при переходе на версии 2.2.13.х, 2.3.х и выше) многие технические специалисты сталкиваются с критической ошибкой: Предопределенный элемент не уникален. Чаще всего это происходит на этапе выполнения отложенных обработчиков обновления в режиме «1С:Предприятие», когда полоса прогресса доходит до 75–80%. Ошибка блокирует дальнейшую работу и не позволяет завершить обновление информационной базы.

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

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

Для начала выясним причину. В современных версиях платформы 1С:Предприятие 8.3.16 и выше были ужесточены правила контроля уникальности имен предопределенных элементов. Проблема обычно кроется в справочнике ДрайверыОборудования. Этот справочник наполняется автоматически при обновлении БПО (Библиотеки подключаемого оборудования).

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

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

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

  1. Создадим резервную копию базы данных (обязательно перед любыми манипуляциями).
  2. Перейдем в меню Администрирование — Тестирование и исправление...
  3. Установим флажки на следующих пунктах:
    • Реиндексация таблиц информационной базы.
    • Проверка логической целостности.
    • Проверка ссылочной целостности.
  4. В блоке «При наличии ссылок на несуществующие объекты» выберем «Очищать ссылки».
  5. В блоке «При частичной потере данных объектов» выберем «Удалять объект».
  6. Нажмем «Выполнить».

После завершения процесса попробуем снова запустить обновление в режиме «Предприятие». В ряде случаев штатное Тестирование и исправление помогает системе «схлопнуть» дублирующие записи или восстановить корректные связи с метаданными.

Способ 2. Поиск и интерактивное удаление дублей драйверов

Если тестирование не помогло, проанализируем содержимое справочника вручную. Часто в пользовательском режиме мы можем увидеть несколько одинаковых записей одного и того же драйвера (например, три драйвера Bizerba), при этом только один из них является истинно предопределенным (помечен специальной иконкой с «шариком»).

Рассмотрим порядок действий для удаления лишних элементов:

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

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

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

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

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных — Поиск и замена дублей.
  2. В поле «Искать в:» выберем Драйверы оборудования.
  3. В правилах поиска укажем отбор по наименованию или идентификатору.
  4. Нажмем «Найти дубли».
  5. Система покажет список найденных элементов. Выберем в качестве «Оригинала» тот элемент, который имеет значок предопределенного или был создан системой последним (актуальным для новой версии).
  6. Нажмем «Объединить».

Этот метод хорош тем, что он автоматически переносит все ссылки со старых «ошибочных» элементов на новый «правильный», что позволяет корректно завершить процедуру обновления ОбновлениеИнформационнойБазыБПО.

Способ 4. Программное исправление предопределенности

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

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


// Найдем все элементы с конкретным идентификатором
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Драйверы.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.ДрайверыОборудования КАК Драйверы
    |ГДЕ
    |   Драйверы.Наименование ПОДОБНО ""%Bizerba%""";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
    ОбъектДрайвера = Результат.Ссылка.ПолучитьОбъект();
    // Снимаем признак предопределенности, если он мешает, или просто помечаем на удаление
    ОбъектДрайвера.УстановитьПометкуУдаления(Истина, Ложь);
    Попытка
        ОбъектДрайвера.Записать();
        Сообщить("Элемент помечен на удаление: " + Результат.Ссылка);
    Исключение
        Сообщить("Ошибка при записи: " + ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

После выполнения этого кода необходимо запустить стандартное удаление помеченных объектов, выбрав режим «Удалять везде, где возможно».

Способ 5. Очистка кэша и принудительное обновление метаданных

Если в справочнике визуально дублей нет, но ошибка Драйвер.Записать сохраняется, проанализируем вероятность некорректного состояния кэша платформы. На платформе 8.3.16.1148 и выше кэш метаданных может хранить старые описания предопределенных элементов.

Выполним следующие действия:

  1. Полностью очистим папки %AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8 на сервере и локальном ПК.
  2. Запустим конфигуратор, временно переименуем имя предопределенного элемента у проблемного драйвера (например, добавим единицу к имени ДрайверBizerbaВесыСПечатьюЭтикеток).
  3. Выполним Обновить конфигурацию базы данных (F7).
  4. Вернем имя обратно и снова нажмем F7.

Эта манипуляция заставляет платформу пересчитать внутренние идентификаторы UUID в таблице предопределенных данных и устраняет логические конфликты в системных таблицах.

Итоги и рекомендации

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

Важный совет: Если вы столкнулись с ошибкой на драйвере весов Bizerba, Zebra или АТОЛ, всегда проверяйте, не установлены ли в системе драйверы из внешних дистрибутивов, которые могли «замусорить» справочник перед началом процесса обновления.

← На главную