Как устранить ошибку задвоения предопределенных данных при обновлении 1С 8.3?

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

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

Выясним причины возникновения дубликатов

В платформе 8.3 признак предопределенности хранится непосредственно в таблицах базы данных (в реквизите ИмяПредопределенныхДанных). При реструктуризации платформа жестко контролирует уникальность этих имен. Проанализируем основные сценарии, приводящие к коллизиям:

  1. Ошибки при синхронизации и обмене (РИБ): если в узле распределенной информационной базы или через универсальный обмен был перенесен элемент с совпадающим именем предопределенных данных или идентификатором UUID, в таблице СУБД образуется задвоение.
  2. Пересечение пользовательских данных с метаданными релиза: в новом обновлении разработчики конфигурации добавили новый предопределенный элемент, строковый идентификатор которого совпал с элементом, ранее созданным пользователями вручную.
  3. Сбои кэша и динамического обновления: некорректно завершенные фоновые процессы или повреждение служебного кэша метаданных приводят к рассинхронизации соответствий между таблицами СУБД и конфигурацией.

Локализуем проблемный объект метаданных

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

Способ 1: Анализ Журнала регистрации. Откроем журнал регистрации в режиме 1С:Предприятие или через конфигуратор и установим отбор по уровню «Ошибка» за интервал времени, когда выполнялось обновление. В подробном описании события платформа обычно фиксирует точный тип метаданных (например, Справочник.СтатьиДвиженияДенежныхСредств) и имя проблемного элемента.

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

Способ 3: Поиск дубликатов запросом. Если мы подозреваем конкретный справочник, выполним поиск задвоенных записей через консоль запросов:


ВЫБРАТЬ
    ИмяПредопределенныхДанных,
    КОЛИЧЕСТВО(Ссылка) КАК КоличествоДублей
ИЗ
    Справочник.СтатьиДвиженияДенежныхСредств
ГДЕ
    Предопределенный = ИСТИНА
СГРУППИРОВАТЬ ПО
    ИмяПредопределенныхДанных
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Ссылка) > 1

Способ 1. Выполнение тестирования и исправления (ТиИ)

Самый быстрый и действенный способ устранения логической несогласованности таблиц метаданных — запуск штатной процедуры тестирования и исправления. Разберем порядок действий:

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

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

Если в базе данных физически присутствуют два элемента с одинаковым признаком предопределенности, снимем признак с лишнего объекта программно. После очистки реквизита ИмяПредопределенныхДанных элемент станет обычным пользовательским объектом, что позволит завершить реструктуризацию.

Посмотрим на пример кода во внешней обработке:


// Получаем ссылку на ошибочный дубликат элемента
СсылкаНаДубль = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию("Оплата поставщику");

Если ЗначениеЗаполнено(СсылкаНаДубль) Тогда
    Объект = СсылкаНаДубль.ПолучитьОбъект();
    // Очищаем строковое имя предопределенного элемента
    Объект.ИмяПредопределенныхДанных = "";
    Объект.Записать();
    Сообщить("Элемент успешно преобразован в обычный пользовательский объект.");
КонецЕсли;

После выполнения данного кода лишний элемент можно объединить с оригиналом при помощи типовой обработки Поиск и удаление дублей или пометить на удаление стандартными средствами.

Способ 3. Изменение режима обновления предопределенных данных

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

  1. В дереве метаданных конфигуратора откроем свойства проблемного справочника.
  2. Найдем свойство ОбновлениеПредопределенныхДанных и переключим его со значения Авто на НеОбновлятьАвтоматически.
  3. Обновим конфигурацию базы данных (F7). База применит структуру без ошибки.
  4. Запустим режим 1С:Предприятие, устраним задвоенный элемент в интерфейсе.
  5. Вернем значение свойства ОбновлениеПредопределенныхДанных обратно в Авто и повторно обновим конфигурацию базы данных.

Способ 4. Очистка локального и серверного кэша

Если ошибки вызваны некорректным состоянием временных файлов, выполним полную очистку кэша:

  1. Закроем все запущенные сеансы 1С на клиентском компьютере.
  2. Удалим содержимое каталогов временных файлов пользователя: %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8.
  3. Для клиент-серверного варианта работы при остановленной службе сервера 1С очистим служебный каталог snccntx в рабочей директории кластера.
  4. Запустим конфигуратор и выполним обновление повторно.
← На главную