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