Почему при объединении баз через XML задваиваются счета плана счетов и как это исправить?

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

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

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

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

Если базы-источник и база-приемник создавались независимо (например, путем создания пустой информационной базы из шаблона или загрузки файла конфигурации .cf), один и тот же системный счет в разных базах получает разные уникальные идентификаторы (UUID / ГУИД).

Выгрузка и загрузка через универсальную обработку XML работает по следующим правилам:

  1. Выгрузка записывает данные строго по UUID объектов источника.
  2. Загрузка выполняется с установленным флагом ОбменДанными.Загрузка = Истина. В этом технологическом режиме платформа отключает большинство прикладных проверок и валидаций, включая проверку уникальности системного реквизита ИмяПредопределенныхДанных.
  3. В результате в таблице плана счетов базы-приемника создается новая запись с UUID из базы-источника, но с тем же признаком предопределенности, что и у существующего счета.

Последствия дублирования предопределенных счетов

Появление дублей предопределенных данных критически нарушает работу системы:

  1. Ошибки уникальности данных: При попытке изменить, пометить на удаление или перевыбрать дублирующийся счет платформа выдает исключение вида «Предопределенный элемент не уникален».
  2. Сбои в программном коде: Обращения через встроенный язык вида ПланыСчетов.Хозрасчетный.Товары или ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками начинают возвращать случайную или некорректную ссылку, что приводит к разрыву проводок и некорректным оборотно-сальдовым ведомостям.
  3. Проблемы при обновлении: Последующее обновление конфигурации базы данных может завершиться аварийно из-за невозможности однозначного сопоставления объектов метаданных и записей в таблицах информационной базы.

Способ исправления: программная замена и удаление дублей

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

Шаг 1. Снятие признака предопределенности с дубля

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


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

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

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

// Записываем объект
ОбъектСчета.Записать();

После выполнения данного кода счет-дубль превращается в обычный пользовательский элемент плана счетов, теряя системный значок предопределенного элемента в интерфейсе.

Шаг 2. Замена ссылок в движениях и документах

Теперь необходимо перенаправить все проводки, регистры и субконто с бывшего дубля на оригинальный системный счет приемника. Для этого воспользуемся типовой обработкой БСП «Поиск и замена дублей» (или универсальной обработкой «Поиск и замена значений»):

  1. Выбираем в качестве заменяемого объекта наш очищенный пользовательский счет-дубль.
  2. В качестве правильного (целевого) объекта указываем оригинальный предопределенный счет базы.
  3. Выполняем замену ссылок во всех таблицах базы данных.

Шаг 3. Удаление дубля

После успешной замены ссылок помечаем дубль на удаление и производим окончательное удаление через стандартную функцию «Удаление помеченных объектов» с контролем ссылочной целостности.

Как предотвратить задвоение счетов при переносе данных

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

  1. Исключение плана счетов из состава выгрузки XML: В настройках универсальной обработки ВыгрузкаЗагрузкаДанныхXML необходимо снять флаги с плана счетов и системных справочников, а также отключить опцию «Выгружать объекты по ссылкам» для предопределенных метаданных, которые уже гарантированно присутствуют в базе-приемнике.
  2. Использование правил конвертации данных: Для объединения учетных баз рекомендуется использовать «1С:Конвертацию данных» (обмен через правила XML или формат EnterpriseData). В правилах синхронизация счетов настраивается по полям поиска — коду счета, наименованию или значению ИмяПредопределенныхДанных, а не по внутреннему UUID.
  3. Подготовка базы-приемника из копии: Если перенос выполняется в чистую базу, базу-приемник следует создавать не из пустого шаблона конфигурации, а из резервной копии рабочей базы-источника, предварительно очистив в ней документы и пользовательские справочники. В этом случае UUID всех предопределенных объектов совпадут изначально.
← На главную