Как правильно сделать из периферийной базы 1С центральную и избежать задвоения предопределенных данных?

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

При потере или ликвидации центральной базы в распределенной информационной базе (РИБ) возникает необходимость отвязать подчиненный (периферийный) узел и сделать его полностью автономным или новым главным узлом. Однако при простом отключении базы с помощью ключа /ResetMasterNode или метода ПланыОбмена.УстановитьГлавныйУзел(Неопределено) разработчики часто сталкиваются с ошибками: либо в режиме «1С:Предприятие» возникает исключение «Предопределенный элемент отсутствует в данных», либо при включении автоматического обновления предопределенных элементов происходит их массовое задвоение (дублируются справочники, планы счетов, виды субконто и планы видов характеристик).

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

Выясним причину: как работают предопределенные данные в 1С 8.3

Проанализируем особенности хранения предопределенных элементов в платформе 8.3:

  1. Хранение в таблицах данных: В отличие от платформы 8.2, в 8.3 предопределенные элементы хранятся непосредственно в таблицах базы данных и связываются с метаданными через специальное свойство ИмяПредопределенныхДанных.
  2. Поведение в РИБ: В периферийных узлах создание предопределенных данных автоматически отключено. Все предопределенные элементы передаются из центрального узла в виде обычных данных при синхронизации.
  3. Потеря связи при отвязке: Когда база отключается от главного узла, она перестает быть подчиненной. Если режим обновления предопределенных данных переключается на автоматический, платформа при реструктуризации проверяет соответствие метаданных и данных в таблицах. Если связь по имени или идентификатору отсутствует, платформа считает, что элемента нет, и создает новый объект, делая старый элемент непредопределенным. В результате в базе образуются дубли.

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

Рассмотрим правильную последовательность действий, которая предотвращает появление дублей и сбоев при последующих обновлениях конфигурации.

Шаг 1. Программное отключение главного узла

Отключение периферийного узла можно выполнить через внешнюю обработку в режиме «1С:Предприятие» с помощью встроенного языка. Посмотрим на пример кода:


// Отключаем главный узел РИБ
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);

Также отвязку можно выполнить пакетным запуском конфигуратора с ключом /ResetMasterNode, однако программный метод в коде предпочтительнее, так как позволяет сразу выполнить сопутствующие сервисные действия.

Шаг 2. Настройка режима обновления предопределенных данных

Чтобы платформа знала, как обрабатывать предопределенные элементы после отключения от РИБ, зададим режим обновления предопределенных данных для всей информационной базы. Выполним следующий код:


// Устанавливаем режим автообновления для автономной базы
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(
    РежимОбновленияПредопределенныхДанныхИнформационнойБазы.Авто
);

В пакетном режиме конфигуратора для этой цели используется параметр командной строки:


"C:\Program Files\1cv8\8.3.X.X\bin\1cv8.exe" DESIGNER /F "ПутьКБазе" /N "Администратор" /P "Пароль" /SetPredefinedDataUpdate -Auto

Значение -Auto означает, что для главного или автономного узла платформа автоматически применяет режим UpdateAutomatically, а для подчиненного — DoNotUpdateAutomatically.

Шаг 3. Восстановление связей предопределенных элементов до реструктуризации

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


// Пример привязки существующего элемента справочника к метаданным
Выборка = Справочники.Банки.Выбрать();
Пока Выборка.Следующий() Цикл
    Если Выборка.Код = "000000001" Тогда // условие поиска нужного элемента
        Объект = Выборка.ПолучитьОбъект();
        Объект.ОбменДанными.Загрузка = Истина;
        Объект.ИмяПредопределенныхДанных = "БанкПоУмолчанию";
        Объект.Записать();
    КонецЕсли;
КонецЦикла;

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

Шаг 4. Устранение дублей, если они уже созданы

Если обновление конфигурации уже прошло и задвоение предопределенных элементов произошло, разберем порядок исправления:

  1. Снятие признака предопределенности со старого дубля: Открываем объект в режиме загрузки и очищаем имя предопределенного элемента.
    
    Объект = СсылкаНаСтарыйЭлемент.ПолучитьОбъект();
    Объект.ОбменДанными.Загрузка = Истина;
    Объект.ИмяПредопределенныхДанных = "";
    Объект.Записать();
    
  2. Замена ссылок: С помощью типовой обработки «Поиск и удаление дублей» переносим все ссылки и движения со старого элемента на новый предопределенный элемент.
  3. Удаление непредопределенных дублей: Помечаем на удаление и окончательно удаляем старые элементы.
  4. План счетов и регистры: Если задвоение коснулось плана счетов или субконто, после замены ссылок обязательно выполняем полное тестирование и исправление базы данных с пересчетом итогов регистра бухгалтерии.

Шаг 5. Проверка подсистем БСП и завершение обновления

В типовых конфигурациях (таких как «Бухгалтерия предприятия 3.0») после отвязки узла проверим настройки Библиотеки стандартных подсистем:

  1. Проверяем префикс узла в константах и при необходимости очищаем или корректируем его.
  2. Запускаем базу в монопольном режиме для выполнения обработчиков обновления БСП (параметр командной строки /C ЗапуститьОбновлениеИнформационнойБазы).
  3. Выполняем операцию «Тестирование и исправление информационной базы» в Конфигураторе с проверкой логической и ссылочной целостности.
← На главную