Почему при создании начального образа РИБ пропадают изменения в коде и движения регистров?

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

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

Основные причины проблемы

Проанализируем ключевые факторы, приводящие к некорректному формированию начального образа:

  1. Последствия динамического обновления конфигурации. Если в центральной базе применялось обновление конфигурации базы данных «на лету», в системных таблицах метаданных (Config, ConfigSave, Params) могут возникнуть расхождения версий. Метод СоздатьНачальныйОбраз считывает метаданные напрямую из системных таблиц, и при нарушении целостности в образ выгружается состояние до динамических правок.
  2. Особенности работы платформы в режиме совместимости. При работе конфигураций на обычных формах (например, «Управление торговлей 10.3») под управлением платформы 1С:Предприятие 8.3 с включенным режимом совместимости 8.2.13 алгоритмы выборки записей регистров при генерации начального образа могут работать некорректно при наличии неактивных записей (Активность = Ложь) или поврежденных ссылок.
  3. Скрытые повреждения информационной базы. Ошибки при выполнении штатного тестирования и исправления свидетельствуют о нарушении физической или логической целостности таблиц базы данных, что напрямую влияет на выборку наборов записей при выгрузке.

Способ 1. Восстановление целостности конфигурации и базы данных

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

  1. В центральной базе откроем Конфигуратор и выполним выгрузку конфигурации в файл через меню «Конфигурация — Сохранить конфигурацию в файл» (получаем файл .cf).
  2. Выполним полную перезапись таблиц конфигурации: воспользуемся пунктом меню «Конфигурация — Загрузить конфигурацию из файла», выбрав сохраненный ранее .cf, и применим изменения клавишей F7. Это очищает служебные таблицы от следов динамических обновлений.
  3. Для файловых баз обязательно выполним проверку утилитой chdbfl.exe. Для клиент-серверного варианта проверим базу средствами СУБД (например, выполнением DBCC CHECKDB в MS SQL Server).
  4. Запустим в Конфигураторе «Администрирование — Тестирование и исправление» с установленными флагами «Реструктуризация таблиц информационной базы» и «Пересчет итогов».

Способ 2. Создание узла РИБ из копии базы данных

Если штатный метод создания образа продолжает вызывать сбои или база имеет большой объем, наиболее надежным и проверенным решением является альтернативное создание узла РИБ из полной копии информационной базы. Разберем по шагам весь процесс настройки узлов.

  1. Создаем полную копию центральной информационной базы (через выгрузку .dt или резервную копию средствами СУБД) и разворачиваем ее как отдельную базу для подчиненного узла.
  2. Открываем созданную подчиненную базу и отключаем в ней признак подчиненности главному узлу с помощью встроенного языка:

// Отключаем главный узел в базе-копии
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
  1. В плане обмена созданной базы определяем, какой узел соответствует текущей базе (делаем его предопределенным или переименовываем код/наименование), а также находим ссылку на центральный узел.
  2. Назначаем центральный узел главным для подчиненной базы:

// Находим центральный узел в плане обмена
УзелЦентральнойБазы = ПланыОбмена.Полный.НайтиПоКоду("ЦБ");

// Устанавливаем его в качестве главного
ПланыОбмена.УстановитьГлавныйУзел(УзелЦентральнойБазы);
  1. Чтобы исключить дублирование передачи данных, обнуляем номера принятых и отправленных сообщений и очищаем регистрацию изменений:

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

// Сбрасываем счетчики сообщений обмена в подчиненной базе
ОбъектУзла = УзелЦентральнойБазы.ПолучитьОбъект();
ОбъектУзла.НомерОтправленного = 0;
ОбъектУзла.НомерПринятого = 0;
ОбъектУзла.Записать();
  1. В центральной информационной базе для узла этого подчиненного филиала также открываем форму узла плана обмена и сбрасываем номера отправленного и принятого сообщений в 0, а также очищаем таблицу регистрации изменений:

// Выполняется в центральной базе для подчиненного узла
УзелПодчиненный = ПланыОбмена.Полный.НайтиПоКоду("ФИЛ1");
ПланыОбмена.УдалитьРегистрациюИзменений(УзелПодчиненный);

ОбъектУзла = УзелПодчиненный.ПолучитьОбъект();
ОбъектУзла.НомерОтправленного = 0;
ОбъектУзла.НомерПринятого = 0;
ОбъектУзла.Записать();

Такой подход полностью гарантирует идентичность метаданных, сохранение всех модулей менеджеров объектов и 100% совпадение движений по всем регистрам без потерь при инициализации обмена.

← На главную