При объединении баз данных или переносе документов с помощью типовой универсальной обработки «Выгрузка и загрузка данных XML» специалисты часто сталкиваются с неприятной ситуацией: в базе-приемнике задваивается план счетов. При этом оба экземпляра одного и того же счета отображаются в режиме 1С:Предприятие со значком предопределенного элемента, а в дереве метаданных в конфигураторе счет присутствует в единственном числе. Проанализируем, почему возникает эта ошибка, к каким последствиям она приводит и как корректно устранить дубли счетов.
Чтобы понять механику сбоя, рассмотрим внутреннее устройство платформы 1С:Предприятие 8.3. В современных версиях платформы предопределенные элементы (включая справочники и планы счетов) хранятся непосредственно в таблицах базы данных как обычные строки со специальным системным свойством ИмяПредопределенныхДанных.
Если базы-источник и база-приемник создавались независимо (например, путем создания пустой информационной базы из шаблона или загрузки файла конфигурации .cf), один и тот же системный счет в разных базах получает разные уникальные идентификаторы (UUID / ГУИД).
Выгрузка и загрузка через универсальную обработку XML работает по следующим правилам:
ОбменДанными.Загрузка = Истина. В этом технологическом режиме платформа отключает большинство прикладных проверок и валидаций, включая проверку уникальности системного реквизита ИмяПредопределенныхДанных.Появление дублей предопределенных данных критически нарушает работу системы:
ПланыСчетов.Хозрасчетный.Товары или ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками начинают возвращать случайную или некорректную ссылку, что приводит к разрыву проводок и некорректным оборотно-сальдовым ведомостям.Разберем по шагам правильный алгоритм устранения дублирующихся счетов. Поскольку интерактивно удалить предопределенный элемент платформа не позволяет, нам потребуется снять признак предопределенности с ошибочно загруженного дубля, перенести с него ссылки на исходный счет и выполнить удаление.
Шаг 1. Снятие признака предопределенности с дубля
Для того чтобы система разрешила манипуляции со счетом-дублем, необходимо очистить реквизит ИмяПредопределенныхДанных. Выполним это с помощью короткого фрагмента кода во внешней обработке:
// Получим объект дублирующего счета по известной ссылке
ОбъектСчета = СсылкаНаДубльСчета.ПолучитьОбъект();
// Включаем режим загрузки для возможности перезаписи системных свойств
ОбъектСчета.ОбменДанными.Загрузка = Истина;
// Очищаем системное имя предопределенного элемента
ОбъектСчета.ИмяПредопределенныхДанных = "";
// Записываем объект
ОбъектСчета.Записать();
После выполнения данного кода счет-дубль превращается в обычный пользовательский элемент плана счетов, теряя системный значок предопределенного элемента в интерфейсе.
Шаг 2. Замена ссылок в движениях и документах
Теперь необходимо перенаправить все проводки, регистры и субконто с бывшего дубля на оригинальный системный счет приемника. Для этого воспользуемся типовой обработкой БСП «Поиск и замена дублей» (или универсальной обработкой «Поиск и замена значений»):
Шаг 3. Удаление дубля
После успешной замены ссылок помечаем дубль на удаление и производим окончательное удаление через стандартную функцию «Удаление помеченных объектов» с контролем ссылочной целостности.
Чтобы не сталкиваться с подобной проблемой при последующих объединениях баз, рассмотрим превентивные меры:
ВыгрузкаЗагрузкаДанныхXML необходимо снять флаги с плана счетов и системных справочников, а также отключить опцию «Выгружать объекты по ссылкам» для предопределенных метаданных, которые уже гарантированно присутствуют в базе-приемнике.ИмяПредопределенныхДанных, а не по внутреннему UUID.