Почему в РИБ не переносятся все данные и как это исправить

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

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

Причина 1. Настройки состава плана обмена и программные фильтры

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

  1. Состав плана обмена в дереве метаданных. Откроем конфигуратор, найдем используемый план обмена и перейдем на вкладку «Состав». Проверим, включены ли в состав необходимые справочники, документы и регистры, а также какое значение установлено в свойстве «Авторегистрация» (Авторегистрация = Разрешить или Запретить).
  2. Программные фильтры и подписки на события. В типовых конфигурациях на базе БСП (Библиотеки стандартных подсистем) логика регистрации может переопределяться программно. В обработчиках событий, таких как ПриОтправкеДанныхПодчиненному, алгоритмы могут исключать служебные регистры, технологические данные или определенные типы документов.

Причина 2. Повреждение информационной базы и нарушение ссылочной целостности

Наличие битых ссылок (когда в регистре сведений или регистре накопления есть запись, ссылающаяся на несуществующий объект-регистратор) часто приводит к сбоям сериализации данных при выгрузке. Если база повреждена, штатный механизм создания образа может пропускать проблемные записи либо закрываться без предупреждения.

Выполним восстановление базы по шагам:

  1. Проверка утилитой chdbfl.exe. Для файловых баз перед любыми операциями запустим автономную утилиту проверки физической целостности файла базы данных (расположена в каталоге bin установленной платформы 1С). Обязательно установим флаг «Исправлять обнаруженные ошибки».
  2. Тестирование и исправление в конфигураторе. Откроем базу в режиме конфигуратора и перейдем в меню «Администрирование» — «Тестирование и исправление». Отметим следующие пункты:
    • Реиндексация таблиц информационной базы;
    • Проверка логической целостности информационной базы;
    • Проверка ссылочной целостности информационной базы (с вариантом «Очищать ссылки» или «Создавать объекты» в зависимости от требований к сохранению данных).

Причина 3. Ограничение адресного пространства процесса (32-разрядный клиент)

При создании начального образа для базы объемом в несколько гигабайт формируется огромный массив данных в оперативной памяти. 32-разрядный процесс 1С ограничен объемом памяти около 2–3 ГБ. При его исчерпании программа аварийно завершает работу без вывода диагностических сообщений.

Чтобы избежать этой проблемы, выполним создание начального образа с использованием 64-разрядного клиента платформы 1С:Предприятие либо запустим процедуру на стороне 64-битного сервера 1С:Предприятия.

Альтернативный способ: создание подчиненного узла РИБ через клон базы

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

Разберем пошаговый алгоритм:

  1. Создание физической копии. Сделаем полную копию файла 1Cv8.1CD (для файлового варианта) или резервную копию средствами СУБД с последующим развертыванием в новую базу.
  2. Установка связи с главным узлом. Запустим созданную копию в режиме «1С:Предприятие» и программно назначим главный узел с помощью метода ПланыОбмена.УстановитьГлавныйУзел().

// В подчиненной базе определяем ссылку на узел, который должен стать главным
СсылкаНаГлавныйУзел = ПланыОбмена.Полный.НайтиПоКоду("ГЛ");

Если ЗначениеЗаполнено(СсылкаНаГлавныйУзел) Тогда
    ПланыОбмена.УстановитьГлавныйУзел(СсылкаНаГлавныйУзел);
КонецЕсли;
  1. Очистка очереди изменений в подчиненном узле. Так как копия содержит всю историю изменений, необходимо удалить регистрацию, чтобы база не отправляла все свои данные обратно в главный узел:

ЭтотУзел = ПланыОбмена.Полный.ЭтотУзел();
ПланыОбмена.УдалитьРегистрациюИзменений(ЭтотУзел);
  1. Синхронизация номеров сообщений. В обеих базах (главной и подчиненной) для соответствующих узлов обмена установим номера принятых и отправленных сообщений в исходное состояние (например, сбросим в 0), чтобы обмен начался корректно.

Принудительная дорегистрация данных в существующем узле

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


УзелПодчиненный = ПланыОбмена.Полный.НайтиПоКоду("УЗ1");

// Регистрируем все документы определенного вида
МетаданныеДокумента = Метаданные.Документы.РеализацияТоваровУслуг;
ПланыОбмена.ЗарегистрироватьИзменения(УзелПодчиненный, МетаданныеДокумента);

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

← На главную