При работе с распределенными информационными базами (РИБ) разработчики и администраторы нередко сталкиваются с ситуацией, когда данные отчетов в центральной и периферийной базах начинают различаться. При детальном анализе выясняется, что в подчиненный узел документы переносятся не полностью: например, в документе перемещения товаров по регистру ТоварыНаСкладах присутствует только расходная часть, а приходная отсутствует, хотя в центральной базе документ проведен корректно.
Разберем основные причины такого поведения платформы 1С:Предприятие и рассмотрим пошаговые способы исправления расхождений.
Проанализируем ключевые факторы, приводящие к потере строк в наборах записей:
ПриОтправкеДанныхПодчиненному. В документах перемещения движения по складу-отправителю и складу-получателю могут разделяться. Если периферийный узел привязан только к одному складу, платформа отсекает движения по чужому складу.РегистрНакопленияНаборЗаписей. Если центральная база применила фильтр и выгрузила усеченный набор (только расход), периферийная база при загрузке полностью перезаписывает свои движения этим пакетом, удаляя приходные строки.СоздатьНачальныйОбраз() формирует базу с учетом всех встроенных в конфигурацию правил фильтрации. Если в правилах заложено отсечение движений чужих складов, в создаваемом файле они будут отсутствовать изначально.Если используется полный план обмена без необходимости урезания данных по складам, но штатное создание образа выдает искаженные остатки, наиболее надежным решением является альтернативное создание узла РИБ через копию информационной базы.
Разберем по шагам, как выполнить эту процедуру:
.dt или средствами СУБД).Посмотрим на пример программного кода для привязки узла:
// Получаем ссылку на предопределенный или созданный узел центральной базы
УзелЦентр = ПланыОбмена.Полный.НайтиПоКоду("ЦБ");
Если ЗначениеЗаполнено(УзелЦентр) Тогда
// Устанавливаем главный узел для текущей базы
ПланыОбмена.УстановитьГлавныйУзел(УзелЦентр);
// Сбрасываем счетчики сообщений
ОбъектУзла = УзелЦентр.ПолучитьОбъект();
ОбъектУзла.НомерПринятого = 0;
ОбъектУзла.НомерОтправленного = 0;
ОбъектУзла.Записать();
// Очищаем таблицы регистрации изменений
ПланыОбмена.УдалитьРегистрациюИзменений(УзелЦентр);
КонецЕсли;
После выполнения этого кода база сразу содержит абсолютно идентичные движения всех регистров и готова к штатному обмену данными.
Если расхождение обнаружено в рабочей базе по отдельным документам в закрытом периоде, перепроводить документы нельзя из-за запрета редактирования и риска изменения партий. В этом случае выполним принудительную перезапись и регистрацию набора записей регистратора.
Рассмотрим пример обработки для восстановления движений конкретного документа:
ДокументСсылка = Документы.ПеремещениеТоваров.НайтиПоНомеру("0000000123", Дата("20230101"));
УзелОбмена = ПланыОбмена.Полный.НайтиПоКоду("ПБ");
// Получаем набор записей регистра накопления по регистратору
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
// Считываем текущие полные движения из центральной базы
Набор.Прочитать();
// Перезаписываем набор (это обновит итоги при необходимости)
Набор.Записать();
// Регистрируем набор записей для отправки в периферийный узел
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Набор);
После выполнения данного кода формируем выгрузку обмена из центральной базы и загружаем ее в периферийную. Платформа передаст полный набор записей регистратора без изменения даты документа.
Чтобы точно определить, на каком этапе теряются записи (при выгрузке из центра или при загрузке в периферию), выполним диагностику:
<RecordSet>.ПриОтправкеДанныхПодчиненному и анализируем модификацию параметра ЭлементДанных.В редких случаях физические записи движений присутствуют в базе, но нарушена целостность внутренней таблицы итогов. Для устранения проблемы в периферийной базе перейдем в режим Тестирование и исправление информационной базы через конфигуратор и выберем пункт Пересчет итогов либо выполним программный вызов РегистрыНакопления.ТоварыНаСкладах.ПересчитатьИтоги().