Как исправить ошибку «Имя предопределенного элемента не уникально» при обновлении 1С?

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

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

Справочник.ВидыОтправляемыхДокументов: Имя предопределенного элемента не уникально: БухОтчетностьМП

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

Выясним причину ошибки

Проанализируем, почему возникает конфликт имен предопределенных данных при обновлении конфигурации:

  1. Архитектура предопределенных элементов в платформе 8.3. Начиная с версии платформы 8.3, предопределенные элементы хранятся непосредственно в таблицах базы данных как обычные записи со значением в системном поле ИмяПредопределенныхДанных.
  2. Усиление контроля уникальности платформой. Начиная с релиза платформы 8.3.6.2332, разработчики платформы встроили строгую проверку уникальности значения свойства ИмяПредопределенныхДанных на этапе реструктуризации таблиц. В более ранних версиях (например, в линейках 8.3.5 и ранних 8.3.6) платформа допускала пропуск дублей и продолжала применение изменений.
  3. Пропуск запуска в режиме «1С:Предприятие». При пакетном обновлении конфигурации через Конфигуратор без промежуточного входа в пользовательский режим не отрабатывают служебные процедуры Библиотеки Стандартных Подсистем (БСП). Если в промежуточном релизе разработчики изменили внутренний идентификатор (GUID) предопределенного элемента, Конфигуратор пытается создать новую запись с тем же строковым именем, не связав ее с существующей. В результате таблица базы содержит дубль, и процесс обновления прерывается.

Способ 1. Использование промежуточной версии платформы

Рассмотрим самый быстрый способ обхода ошибки, если вам необходимо накатить цепочку старых релизов. Поскольку жесткий контроль уникальности был активирован в более поздних билдах платформы, для прохождения проблемного релиза можно использовать более старую версию платформы (например, 8.3.6.1977 или 8.3.5).

  1. Установите платформу версии 8.3.6 или более раннюю.
  2. Запустите информационную базу в Конфигураторе под этой версией платформы.
  3. Примените требуемое обновление конфигурации. На старой платформе процесс реструктуризации завершится успешно.
  4. После преодоления проблемного релиза вернитесь к актуальной версии платформы для дальнейшей работы.

Способ 2. Отключение автоматического обновления предопределенных данных через параметры запуска

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

  1. Закройте Конфигуратор информационной базы.
  2. Запустите Конфигуратор из командной строки со специальным ключом:
    
    "C:\Program Files\1cv8\8.3.X.XXXX\bin\1cv8.exe" CONFIG /F "D:\Bases\MyBase" /SetPredefinedDataUpdate -DoNotUpdateAutomatically
    
  3. Выполните обновление конфигурации в обычном режиме через меню Конфигурация — Поддержка — Обновить конфигурацию. Платформа не будет выполнять принудительное создание и синхронизацию предопределенных данных, и реструктуризация пройдет без ошибок.
  4. После завершения процедуры обязательно верните стандартный режим обновления предопределенных данных, запустив команду:
    
    "C:\Program Files\1cv8\8.3.X.XXXX\bin\1cv8.exe" CONFIG /F "D:\Bases\MyBase" /SetPredefinedDataUpdate -Auto
    

Способ 3. Программное отключение обновления предопределенных данных

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


// Отключаем автоматическое обновление предопределенных данных
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически);

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


// Включаем автоматическое обновление предопределенных данных
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.Авто);

Способ 4. Очистка дублирующихся предопределенных данных в пользовательском режиме

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

  1. Запустите базу в режиме «1С:Предприятие».
  2. Откройте внешнюю обработку и выполните поиск элементов справочника, у которых заполнено системное свойство ИмяПредопределенныхДанных.
  3. Для найденного дубля включите режим загрузки данных и очистите имя предопределенного элемента:
    
    Выборка = Справочники.ВидыОтправляемыхДокументов.Выбрать();
    Пока Выборка.Следующий() Цикл
        Если Выборка.ИмяПредопределенныхДанных = "БухОтчетностьМП" Тогда
            Объект = Выборка.ПолучитьОбъект();
            // Включаем режим загрузки, чтобы обойти системные проверки
            Объект.ОбменДанными.Загрузка = Истина;
            Объект.ИмяПредопределенныхДанных = "";
            Объект.Записать();
            Прервать; // Очищаем только дублирующий элемент
        КонецЕсли;
    КонецЦикла;
    
  4. После превращения дубля в обычный пользовательский элемент повторите реструктуризацию в Конфигураторе.

Способ 5. Изменение траектории обновления и промежуточный запуск

Проанализируем правильную методику перехода между релизами:

  1. Промежуточный запуск сеанса предприятия. Не накатывайте длинные цепочки .cfu подряд исключительно в Конфигураторе. Выполняйте запуск режима «1С:Предприятие» хотя бы на узловых (финальных в рамках промежуточной ветки) релизах. Это позволит механизмам БСП корректно выполнить служебные обработчики обновления и сопоставить ссылки предопределенных данных.
  2. Обход проблемного релиза. В некоторых случаях ошибка кроется в конкретной сборке конфигурации (например, 3.0.22.223). Попробуйте изменить траекторию перехода, выбрав альтернативную цепочку релизов из доступных в матрице обновлений: например, обновиться на 3.0.22.219, а затем сразу на 3.0.22.230.
  3. Использование полного файла поставки (.cf). Если целью является получение актуальной пустой базы конфигурации, гораздо надежнее использовать полный установочный дистрибутив нужного релиза (файл 1cv8.cf или шаблон .dt), минуя последовательное обновление старых промежуточных сборок.
← На главную