Почему расходятся движения регистров между центральной и периферийной базой в 1С и как это исправить?

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

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

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

Причины неполного переноса движений в РИБ

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

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

Способ 1. Создание периферийной базы методом клонирования

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

Разберем по шагам, как выполнить эту процедуру:

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

Посмотрим на пример программного кода для привязки узла:


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

Если ЗначениеЗаполнено(УзелЦентр) Тогда
    // Устанавливаем главный узел для текущей базы
    ПланыОбмена.УстановитьГлавныйУзел(УзелЦентр);
    
    // Сбрасываем счетчики сообщений
    ОбъектУзла = УзелЦентр.ПолучитьОбъект();
    ОбъектУзла.НомерПринятого = 0;
    ОбъектУзла.НомерОтправленного = 0;
    ОбъектУзла.Записать();
    
    // Очищаем таблицы регистрации изменений
    ПланыОбмена.УдалитьРегистрациюИзменений(УзелЦентр);
КонецЕсли;

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

Способ 2. Программная перерегистрация движений без перепроведения документов

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

Рассмотрим пример обработки для восстановления движений конкретного документа:


ДокументСсылка = Документы.ПеремещениеТоваров.НайтиПоНомеру("0000000123", Дата("20230101"));
УзелОбмена = ПланыОбмена.Полный.НайтиПоКоду("ПБ");

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

// Считываем текущие полные движения из центральной базы
Набор.Прочитать();

// Перезаписываем набор (это обновит итоги при необходимости)
Набор.Записать();

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

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

Способ 3. Диагностика пакета обмена через XML и отладчик

Чтобы точно определить, на каком этапе теряются записи (при выгрузке из центра или при загрузке в периферию), выполним диагностику:

  1. Выгружаем пакет обмена в файл XML.
  2. Открываем файл в текстовом редакторе и находим секцию с именем регистра и регистратора: <RecordSet>.
  3. Проверяем состав строк. Если приходных строк нет уже в файле XML, значит, их исключает логика обработчиков плана обмена в модуле конфигурации.
  4. В конфигураторе устанавливаем точку останова в модуле плана обмена в процедуре ПриОтправкеДанныхПодчиненному и анализируем модификацию параметра ЭлементДанных.

Способ 4. Пересчет итогов регистров накопления

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

← На главную