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

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

При переносе данных между информационными базами с помощью обработки ВыгрузкаЗагрузкаДанныхXML или при некорректном обновлении конфигураций разработчики и администраторы нередко сталкиваются с критической ошибкой — появлением дублей предопределенных элементов (в планах счетов, справочниках, планах видов характеристик). В результате документы перестают проводиться, в отчетах двоятся счета и субконто, а попытка объединить дубли штатной обработкой «Поиск и удаление дублей» завершается ошибкой «В данной транзакции уже происходили ошибки».

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

Почему происходит задвоение предопределенных элементов

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

  1. Режим отключения проверок при загрузке. Обработка ВыгрузкаЗагрузкаДанныхXML выполняет запись объектов с установленным флагом ОбменДанными.Загрузка = Истина. В этом режиме стандартный контроль уникальности предопределенных данных платформой отключается, что позволяет записать в таблицу базы данных вторую запись с точно таким же значением стандартного реквизита ИмяПредопределенныхДанных.
  2. Автоматическая генерация предопределенных данных в чистой базе. Если в новой базе свойство объектов «Обновление предопределенных данных» установлено в значение «Авто», платформа при первом запуске автоматически создает предопределенные элементы со своими внутренними уникальными идентификаторами (GUID). При последующей загрузке данных из исходной базы XML-обработка загружает элементы с исходными GUID, создавая физические дубли записей с одинаковыми именами.
  3. Блокировка транзакций платформой. Когда система обнаруживает нарушение уникальности предопределенного элемента, любая последующая попытка штатного изменения или слияния ссылок прерывается на уровне платформенных проверок, приводя к сбою всей транзакции.

Пошаговый алгоритм исправления задвоения без изменения конфигурации

Рассмотрим безопасный программный способ устранения дублей непосредственно в режиме «1С:Предприятие».

Шаг 1. Поиск дублирующихся предопределенных данных

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


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

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

Шаг 2. Снятие признака предопределенности у ошибочных дублей

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


// Получаем объект дублирующего элемента
ОбъектДубль = ДубльСсылка.ПолучитьОбъект();

// Включаем режим загрузки для отключения платформенного контроля
ОбъектДубль.ОбменДанными.Загрузка = Истина;

// Очищаем имя предопределенного элемента
ОбъектДубль.ИмяПредопределенныхДанных = "";

// Записываем элемент как обычный (непредопределенный)
ОбъектДубль.Записать();

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

Шаг 3. Замена ссылок в базе данных

Теперь перенаправим все движения документов, проводки и связанные объекты с отвязанного дубля на правильный предопределенный элемент. Для этого воспользуемся платформенной процедурой НайтиИЗаменитьСсылки:


ТаблицаЗамен = Новый ТаблицаЗначений;
ТаблицаЗамен.Колонки.Добавить("ОшибочнаяСсылка");
ТаблицаЗамен.Колонки.Добавить("ПравильнаяСсылка");

СтрокаЗамены = ТаблицаЗамен.Добавить();
СтрокаЗамены.ОшибочнаяСсылка = ДубльСсылка;
СтрокаЗамены.ПравильнаяСсылка = ПравильнаяСсылкаПредопределенного;

НайтиИЗаменитьСсылки(ТаблицаЗамен);

Шаг 4. Удаление лишних элементов

После успешной замены ссылок отвязанный элемент помечается на удаление и удаляется из базы стандартным механизмом контроля ссылочной целостности (через меню «Функции для технического специалиста» — «Удаление помеченных объектов»).

Особенности исправления справочника «Идентификаторы объектов метаданных» (БСП)

Если задвоение произошло в справочнике ИдентификаторыОбъектовМетаданных или ИдентификаторыОбъектовРасширений, ручная замена ссылок может привести к ошибкам циклических связей подсистемы БСП. В этом случае правильным решением является программный вызов процедуры обновления данных в привилегированном режиме:


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

Профилактика: как избежать задвоения при переносе через XML

Чтобы избежать появления дублей при первоначальном переносе данных в новую чистую базу:

  1. Перед загрузкой данных в базе-приемнике установите для объектов свойство «Обновление предопределенных данных» в значение НеОбновлятьАвтоматически.
  2. Выполните перенос данных с помощью обработки XML. Все предопределенные элементы загрузятся с исходными идентификаторами GUID.
  3. Верните свойство в значение Авто или вызовите метод менеджера ОбновитьПредопределенныеДанные() для привязки структуры метаданных к загруженным элементам.
← На главную