При настройке обмена данными между информационными базами с использованием правил конвертации (Конвертация данных 2.1) нередко возникает ситуация, когда при выгрузке независимого непериодического регистра сведений в базе-приемнике остается только одна запись или данные полностью перезаписываются при каждом сеансе синхронизации. Проанализируем причину такого поведения платформы 1С и разберем способы его устранения.
В платформе 1С:Предприятие независимые регистры сведений записываются в информационную базу пакетами с помощью объекта РегистрСведенийНаборЗаписей. При выполнении метода Записать() платформа автоматически выполняет операцию очистки: из таблицы базы данных предварительно удаляются все существующие записи, подпадающие под текущий Отбор этого набора.
Если в выгружаемом XML-файле блок отбора оказывается пустым (тег <Отбор />), платформа воспринимает это как отбор ко всему регистру без ограничений. В результате происходит следующее:
Пример проблемной выгрузки XML, где тег отбора не содержит измерений:
<НаборЗаписейРегистра Нпп="5" Тип="РегистрСведенийНаборЗаписей.ДанныеПродукции" ИмяПравила="ДанныеПродукции">
<Отбор />
<СтрокиНабораЗаписей>
<Объект>
<Свойство Имя="СерияНоменклатуры" Тип="Строка">
<Значение>7866.3441.02.07.03</Значение>
</Свойство>
<Свойство Имя="Подразделение" Тип="Строка">
<Значение>подразделение 1</Значение>
</Свойство>
<Свойство Имя="Статус" Тип="Строка">
<Значение>Выпущено</Значение>
</Свойство>
</Объект>
</СтрокиНабораЗаписей>
</НаборЗаписейРегистра>
Причиной формирования пустого отбора в конфигурации «Конвертация данных 2.1» (КД2) обычно является отсутствие галочек в колонке «Поиск» у ключевых измерений регистра или ручное переопределение типов в обработчиках без корректировки структуры отбора.
Самое простое и штатное решение в КД2 — указать платформе, какие именно измерения служат уникальным ключом для формирования отбора.
СерияНоменклатуры и Подразделение).После этой настройки при выгрузке выгружаемый XML-файл начнет содержать заполненные поля внутри тега <Отбор>, и платформа при загрузке будет перезаписывать только строго определенные записи по ключевым измерениям, не затрагивая остальные данные регистра.
Если в источнике измерение имеет ссылочный тип (например, СправочникСсылка.СерииНоменклатуры), а в приемнике переносится как Строка, простое назначение значения в обработчике ПередВыгрузкой может сбить автоматическое формирование отбора:
// Обработчик "ПередВыгрузкой" для ПКС
Значение = СокрЛП(Источник.СерияНоменклатуры);
В этом случае проанализируем необходимость принудительной установки отбора для выгружаемого набора. В обработчиках правил выгрузки для регистра можно вручную обратиться к структуре отбора и заполнить её выгружаемыми строковыми значениями, чтобы тег <Отбор> в выгруженном файле не оставался пустым.
Если характер данных не предполагает объединение строк в крупные наборы записей, заменим метод записи наборов на построчную запись через менеджер записи.
РегистрСведенийМенеджерЗаписи для каждой строки, что полностью исключает очистку регистра по пустому отбору.Важное примечание: Построчная запись через менеджер записи выполняется медленнее, чем групповая запись наборов данных. Для больших объемов информации рекомендуется использовать Способ 1 с корректной настройкой полей поиска в ПКС.