При обновлении типовых и доработанных конфигураций на платформе 1С:Предприятие 8.3 разработчики и администраторы нередко сталкиваются с ситуацией, когда процесс реструктуризации базы данных прерывается системной ошибкой. Одной из частых причин является конфликт предопределенных элементов — платформа сообщает о наличии дубликатов предопределенных данных в справочниках или планах видов характеристик. Разберем по шагам, почему возникает эта ошибка, как точно локализовать проблемный объект и какими способами восстановить корректную работу информационной базы.
В платформе 8.3 признак предопределенности хранится непосредственно в таблицах базы данных (в реквизите ИмяПредопределенныхДанных). При реструктуризации платформа жестко контролирует уникальность этих имен. Проанализируем основные сценарии, приводящие к коллизиям:
Если в окне ошибки не указан конкретный справочник и элемент, определим источник проблемы несколькими способами. Рассмотрим подробнее каждый из них.
Способ 1: Анализ Журнала регистрации. Откроем журнал регистрации в режиме 1С:Предприятие или через конфигуратор и установим отбор по уровню «Ошибка» за интервал времени, когда выполнялось обновление. В подробном описании события платформа обычно фиксирует точный тип метаданных (например, Справочник.СтатьиДвиженияДенежныхСредств) и имя проблемного элемента.
Способ 2: Сравнение конфигураций. В конфигураторе выполним сравнение конфигурации базы данных и основной (обновляемой) конфигурации. Обратим внимание на ветки справочников, планов счетов и планов видов характеристик, в которых появились новые предопределенные строки.
Способ 3: Поиск дубликатов запросом. Если мы подозреваем конкретный справочник, выполним поиск задвоенных записей через консоль запросов:
ВЫБРАТЬ
ИмяПредопределенныхДанных,
КОЛИЧЕСТВО(Ссылка) КАК КоличествоДублей
ИЗ
Справочник.СтатьиДвиженияДенежныхСредств
ГДЕ
Предопределенный = ИСТИНА
СГРУППИРОВАТЬ ПО
ИмяПредопределенныхДанных
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Ссылка) > 1
Самый быстрый и действенный способ устранения логической несогласованности таблиц метаданных — запуск штатной процедуры тестирования и исправления. Разберем порядок действий:
.dt или средствами СУБД).Если в базе данных физически присутствуют два элемента с одинаковым признаком предопределенности, снимем признак с лишнего объекта программно. После очистки реквизита ИмяПредопределенныхДанных элемент станет обычным пользовательским объектом, что позволит завершить реструктуризацию.
Посмотрим на пример кода во внешней обработке:
// Получаем ссылку на ошибочный дубликат элемента
СсылкаНаДубль = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию("Оплата поставщику");
Если ЗначениеЗаполнено(СсылкаНаДубль) Тогда
Объект = СсылкаНаДубль.ПолучитьОбъект();
// Очищаем строковое имя предопределенного элемента
Объект.ИмяПредопределенныхДанных = "";
Объект.Записать();
Сообщить("Элемент успешно преобразован в обычный пользовательский объект.");
КонецЕсли;
После выполнения данного кода лишний элемент можно объединить с оригиналом при помощи типовой обработки Поиск и удаление дублей или пометить на удаление стандартными средствами.
В ситуациях, когда коллизия блокирует обновление на уровне конфигуратора, временно отключим автоматическое обновление предопределенных данных для проблемного объекта метаданных:
ОбновлениеПредопределенныхДанных и переключим его со значения Авто на НеОбновлятьАвтоматически.1С:Предприятие, устраним задвоенный элемент в интерфейсе.ОбновлениеПредопределенныхДанных обратно в Авто и повторно обновим конфигурацию базы данных.Если ошибки вызваны некорректным состоянием временных файлов, выполним полную очистку кэша:
%LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8.snccntx в рабочей директории кластера.