При обновлении конфигурации 1С:Розница (особенно при переходе на версии 2.2.13.х, 2.3.х и выше) многие технические специалисты сталкиваются с критической ошибкой: Предопределенный элемент не уникален. Чаще всего это происходит на этапе выполнения отложенных обработчиков обновления в режиме «1С:Предприятие», когда полоса прогресса доходит до 75–80%. Ошибка блокирует дальнейшую работу и не позволяет завершить обновление информационной базы.
В этой статье мы подробно проанализируем ситуацию на примере драйвера весов Bizerba, разберем причины возникновения конфликта и рассмотрим несколько эффективных способов решения проблемы — от стандартного тестирования до прямого вмешательства в данные.
Для начала выясним причину. В современных версиях платформы 1С:Предприятие 8.3.16 и выше были ужесточены правила контроля уникальности имен предопределенных элементов. Проблема обычно кроется в справочнике ДрайверыОборудования. Этот справочник наполняется автоматически при обновлении БПО (Библиотеки подключаемого оборудования).
Ситуация развивается следующим образом: в старой версии конфигурации драйвер мог быть добавлен вручную или загружен как обычный элемент справочника. При обновлении система пытается создать новый предопределенный элемент с тем же внутренним именем (идентификатором), который прописан в программном коде обновления. Если в базе уже существует элемент с таким же именем или характеристиками, которые система считает уникальными, возникает конфликт, и транзакция записи объекта откатывается.
Рассмотрим самый простой и зачастую эффективный метод. Прежде чем приступать к программному удалению данных, нам необходимо проверить целостность ссылок и логическую связь предопределенных элементов с метаданными. Для этого выполним следующие шаги в режиме Конфигуратор:
После завершения процесса попробуем снова запустить обновление в режиме «Предприятие». В ряде случаев штатное Тестирование и исправление помогает системе «схлопнуть» дублирующие записи или восстановить корректные связи с метаданными.
Если тестирование не помогло, проанализируем содержимое справочника вручную. Часто в пользовательском режиме мы можем увидеть несколько одинаковых записей одного и того же драйвера (например, три драйвера Bizerba), при этом только один из них является истинно предопределенным (помечен специальной иконкой с «шариком»).
Рассмотрим порядок действий для удаления лишних элементов:
Драйверы оборудования (его можно найти через «Все функции» или в разделе «Администрирование — Подключаемое оборудование — Драйверы оборудования»).AddIn.BizerbaNative).Чтобы обойти это ограничение, выполним настройку прав: в Конфигураторе для роли текущего пользователя необходимо временно установить право Интерактивное удаление для справочника ДрайверыОборудования. После этого в режиме «Предприятие» мы сможем пометить объект на удаление и воспользоваться стандартной обработкой «Удаление помеченных объектов».
Выясним причину, по которой ручное удаление может быть затруднено: на лишние элементы могут быть ссылки в настройках оборудования. В этом случае лучше использовать механизм замены ссылок. Проанализируем этот путь:
Драйверы оборудования.Этот метод хорош тем, что он автоматически переносит все ссылки со старых «ошибочных» элементов на новый «правильный», что позволяет корректно завершить процедуру обновления ОбновлениеИнформационнойБазыБПО.
В некоторых сложных ситуациях элемент в базе есть, но он «потерял» связь с именем предопределенного из метаданных. Рассмотрим пример кода, который можно выполнить через внешнюю обработку или консоль кода, чтобы принудительно установить связь или пометить дубль на удаление без лишних проверок.
Проанализируем пример кода для программной установки пометки удаления на дублирующий элемент:
// Найдем все элементы с конкретным идентификатором
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Драйверы.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДрайверыОборудования КАК Драйверы
|ГДЕ
| Драйверы.Наименование ПОДОБНО ""%Bizerba%""";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
ОбъектДрайвера = Результат.Ссылка.ПолучитьОбъект();
// Снимаем признак предопределенности, если он мешает, или просто помечаем на удаление
ОбъектДрайвера.УстановитьПометкуУдаления(Истина, Ложь);
Попытка
ОбъектДрайвера.Записать();
Сообщить("Элемент помечен на удаление: " + Результат.Ссылка);
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
После выполнения этого кода необходимо запустить стандартное удаление помеченных объектов, выбрав режим «Удалять везде, где возможно».
Если в справочнике визуально дублей нет, но ошибка Драйвер.Записать сохраняется, проанализируем вероятность некорректного состояния кэша платформы. На платформе 8.3.16.1148 и выше кэш метаданных может хранить старые описания предопределенных элементов.
Выполним следующие действия:
%AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8 на сервере и локальном ПК.ДрайверBizerbaВесыСПечатьюЭтикеток).Эта манипуляция заставляет платформу пересчитать внутренние идентификаторы UUID в таблице предопределенных данных и устраняет логические конфликты в системных таблицах.
Мы рассмотрели комплексный подход к решению проблемы уникальности данных при обновлении 1С:Розница. Подведем итоги: чаще всего проблема решается либо через Тестирование и исправление, либо через поиск и удаление дублей в справочнике Драйверы оборудования с предварительной настройкой прав на интерактивное удаление.
Важный совет: Если вы столкнулись с ошибкой на драйвере весов Bizerba, Zebra или АТОЛ, всегда проверяйте, не установлены ли в системе драйверы из внешних дистрибутивов, которые могли «замусорить» справочник перед началом процесса обновления.