Почему перезатирается независимый регистр сведений при обмене данными в 1С и как это исправить

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

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

Причина проблемы: механика работы наборов записей и пустой отбор

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

Если в выгружаемом XML-файле блок отбора оказывается пустым (тег <Отбор />), платформа воспринимает это как отбор ко всему регистру без ограничений. В результате происходит следующее:

  1. При загрузке первого набора записей с пустым отбором платформа полностью очищает таблицу регистра сведений в базе-приемнике и записывает полученную строку.
  2. При загрузке следующего набора записей операция повторяется: база снова очищает весь регистр и записывает очередную строку.
  3. В итоге в базе данных остается только запись из самого последнего загруженного набора.

Пример проблемной выгрузки XML, где тег отбора не содержит измерений:


<НаборЗаписейРегистра Нпп="5" Тип="РегистрСведенийНаборЗаписей.ДанныеПродукции" ИмяПравила="ДанныеПродукции">
  <Отбор /> 
  <СтрокиНабораЗаписей>
    <Объект>
      <Свойство Имя="СерияНоменклатуры" Тип="Строка">
        <Значение>7866.3441.02.07.03</Значение> 
      </Свойство>
      <Свойство Имя="Подразделение" Тип="Строка">
        <Значение>подразделение 1</Значение> 
      </Свойство>
      <Свойство Имя="Статус" Тип="Строка">
        <Значение>Выпущено</Значение> 
      </Свойство>
    </Объект>
  </СтрокиНабораЗаписей>
</НаборЗаписейРегистра>

Причиной формирования пустого отбора в конфигурации «Конвертация данных 2.1» (КД2) обычно является отсутствие галочек в колонке «Поиск» у ключевых измерений регистра или ручное переопределение типов в обработчиках без корректировки структуры отбора.

Способ 1. Настройка свойств поиска в ПКС (Правилах конвертации свойств)

Самое простое и штатное решение в КД2 — указать платформе, какие именно измерения служат уникальным ключом для формирования отбора.

  1. Откроем конфигурацию Конвертация данных 2.1 и перейдем в Правило конвертации объектов (ПКО) для нужного регистра сведений.
  2. Найдем Правила конвертации свойств (ПКС) для ключевых измерений регистра (например, СерияНоменклатуры и Подразделение).
  3. Установим флаг «Поиск» напротив этих измерений.
  4. Сохраним и заново выгрузим правила обмена.

После этой настройки при выгрузке выгружаемый XML-файл начнет содержать заполненные поля внутри тега <Отбор>, и платформа при загрузке будет перезаписывать только строго определенные записи по ключевым измерениям, не затрагивая остальные данные регистра.

Способ 2. Обработка произвольного преобразования типов

Если в источнике измерение имеет ссылочный тип (например, СправочникСсылка.СерииНоменклатуры), а в приемнике переносится как Строка, простое назначение значения в обработчике ПередВыгрузкой может сбить автоматическое формирование отбора:


// Обработчик "ПередВыгрузкой" для ПКС
Значение = СокрЛП(Источник.СерияНоменклатуры);

В этом случае проанализируем необходимость принудительной установки отбора для выгружаемого набора. В обработчиках правил выгрузки для регистра можно вручную обратиться к структуре отбора и заполнить её выгружаемыми строковыми значениями, чтобы тег <Отбор> в выгруженном файле не оставался пустым.

Способ 3. Перенос регистра построчно с использованием менеджера записи

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

  1. В настройках ПКО регистра сведений в КД2 найдем параметр «Записывать регистры сведений наборами записей» и снимем этот флаг.
  2. При отключенном флаге загрузка регистра происходит построчно: платформа формирует объект РегистрСведенийМенеджерЗаписи для каждой строки, что полностью исключает очистку регистра по пустому отбору.

Важное примечание: Построчная запись через менеджер записи выполняется медленнее, чем групповая запись наборов данных. Для больших объемов информации рекомендуется использовать Способ 1 с корректной настройкой полей поиска в ПКС.

← На главную