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

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

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

Выясним причины, почему пропускается регистрация записей

Рассмотрим, из-за чего программно записанные данные могут не попадать в таблицу изменений плана обмена:

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

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

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


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

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

// Записываем набор
НаборЗаписей.Записать();

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

Важный момент: метод ПланыОбмена.ЗарегистрироватьИзменения() принимает исключительно объект РегистрСведенийНаборЗаписей. Зарегистрировать отдельную запись через менеджер записи платформа 1С не позволяет.

Способ 2. Проверка флага ОбменДанными.Загрузка и подписок

Если в конфигурации логика регистрации завязана на стандартные подписки на события и правила БСП, проанализируем код загрузки на наличие установки флага загрузки:


// Если в вашем коде присутствует такая строка:
НаборЗаписей.ОбменДанными.Загрузка = Истина; 

// То подписки на события не вызовутся! 
// Для отрабатывания штатных подписок сбросим флаг в Ложь:
НаборЗаписей.ОбменДанными.Загрузка = Ложь;
НаборЗаписей.Записать();

Если этот флаг был необходим для отключения сложных проверок при записи, лучше выполнить программную регистрацию явно (как описано в Способе 1), оставив флаг Загрузка = Истина.

Способ 3. Изменение режима авторегистрации в метаданных

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

  1. Откроем конфигуратор и найдем используемый План обмена.
  2. Перейдем на вкладку Состав.
  3. В списке объектов найдем наш независимый регистр сведений.
  4. В свойстве Авторегистрация сменим значение с Запретить на Разрешить.

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

Важные ограничения и рекомендации

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

← На главную