Как исправить ошибку «Не предопределенные объекты не могут иметь предопределенные записи видов субконто» в РИБ 1С

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

При активном сопровождении и доработке нетиповых конфигураций на платформе 1С:Предприятие 8.3 (например, измененной конфигурации 1С:Бухгалтерия предприятия 3.0) разработчики регулярно сталкиваются со специфическими трудностями синхронизации данных. Одной из наиболее сложных и неочевидных проблем является сбой обмена в распределенных информационных базах (РИБ) при добавлении новых предопределенных счетов в план счетов.

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

Выясняем причину: системный механизм работы платформы 1С

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

  1. Уровень метаданных — описание элемента в конфигураторе.
  2. Уровень базы данных — фактическая запись в таблице базы данных, которая связывается с метаданными через скрытое системное свойство ИмяПредопределенныхДанных.

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

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

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

Рассмотрим проверенные на практике методы обхода и устранения этой проблемы.

Метод 1. Двухэтапный выпуск обновления конфигурации (Рекомендуемый способ)

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

Шаг 1: Создание пустых счетов в Центральной базе (ЦБ)

В конфигураторе центральной базы добавим новые предопределенные счета. При этом табличную часть ВидыСубконто у этих счетов оставим абсолютно пустой. Обновим конфигурацию базы данных ЦБ и выполним стандартный сеанс обмена с периферийными узлами.

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

Шаг 2: Добавление видов субконто в ЦБ

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

Метод 2. Ручное обновление подчиненного узла с временным отключением от РИБ

Этот метод гарантирует стопроцентный результат, так как мы принудительно обновим структуру метаданных в периферийной базе до того, как запустим процесс импорта данных из файла обмена.

Проанализируем пошагово, как это сделать:

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

Метод 3. Исправление привязки через «ИмяПредопределенныхДанных»

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

Для исправления этой ситуации мы можем программно восстановить связь объектов базы данных с метаданными конфигурации. Для этого запустим в проблемном узле обработку со следующим кодом:


// Восстановление предопределенного свойства для конкретного счета
СчетСсылка = ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.12"); // Пример проблемного счета
Если Не СчетСсылка.Пустая() Тогда
    СчетОбъект = СчетСсылка.ПолучитьОбъект();
    // Заполняем имя предопределенных данных, как оно задано в конфигураторе
    СчетОбъект.ИмяПредопределенныхДанных = "МатериалыВПути"; 
    СчетОбъект.ОбменДанными.Загрузка = Истина;
    Попытка
        СчетОбъект.Записать();
        Сообщить("Связь предопределенного счета успешно восстановлена!");
    Исключение
        Сообщить("Ошибка записи: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

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

Метод 4. Анализ и очистка регистрации изменений данных

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

Рассмотрим, как правильно очистить регистрацию:

  1. В Центральной базе откроем типовую обработку «Регистрация изменений для обмена данными» (входит в состав стандартных инструментов БСП и доступна в меню администратора).
  2. Найдем в списке объектов план счетов (например, Хозрасчетный).
  3. Посмотрим зарегистрированные изменения. Если там присутствуют конкретные новые счета, выделим их и нажмем кнопку Очистить регистрацию.
  4. После очистки регистрации данных выполним повторную выгрузку конфигурации и пакета обмена. Новые счета будут созданы в подчиненной базе исключительно за счет применения нового релиза метаданных конфигурации, что предотвратит возникновение конфликта десериализации.

Используя приведенные методики, мы сможем эффективно и безболезненно обновлять любые сложные планы счетов в распределенных информационных системах 1С.

← На главную