Как исключить перенос групп справочника при конвертации данных, если в приемнике нет иерархии?

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

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

Разбор типичной ошибки: Почему Отказ = Истина не всегда помогает?

Многие разработчики начинают решение задачи с обработчика Перед выгрузкой в Правиле Конвертации Объекта (ПКО). Казалось бы, логика проста: проверить, является ли объект группой, и если да — отменить выгрузку. Однако на практике программисты часто сталкиваются с двумя проблемами: синтаксическими ошибками и механизмом «выгрузки по ссылке».

Проанализируем пример неправильного кода:


Если Источник.ЭтоГруппа() Тогда
    Отказ = Истина;
КонецЕсли;

В платформе 1С:Предприятие 8 ЭтоГруппа — это не метод, а реквизит (свойство) объекта. Поэтому использование скобок () приведет к ошибке выполнения. Правильный вариант обращения выглядит так: Источник.ЭтоГруппа. Но даже после исправления синтаксиса группы могут продолжать появляться в приемнике. Давайте разберемся, почему это происходит и как это исправить.

Шаг 1: Правильная настройка ПКО (Правила Конвертации Объекта)

Первым делом нам действительно необходимо установить запрет на выгрузку групп в самом ПКО нужного справочника. Рассмотрим подробнее, где и что нужно написать.

Откройте ПКО вашего справочника и перейдите на закладку Обработчики событий. В событии Перед выгрузкой пропишите следующий код:


// Проверяем, является ли текущий объект группой
Если Источник.ЭтоГруппа Тогда
    Отказ = Истина;
КонецЕсли;

Этот код сообщает системе: «Если текущий объект, который мы собираемся выгрузить — группа, то прерви выполнение этого правила». Однако этого недостаточно, если на эту группу ссылаются другие объекты.

Шаг 2: Отключение свойства Родитель в ПКС

Выясним причину, по которой группы могут продолжать переноситься, даже если мы прописали Отказ = Истина. Основная проблема заключается в иерархии. У каждого элемента справочника в источнике есть свойство Родитель, которое ссылается на группу.

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

  1. Найдите в списке свойств вашего ПКО строку, где Источник — Родитель.
  2. Если в приемнике справочник одноуровневый, у него просто нет поля Родитель. В этом случае ПКС для родителя нужно либо полностью удалить, либо установить флаг Отключить.
  3. Если вы хотите оставить ПКС, но программно запретить передачу родителя, в обработчике Перед выгрузкой этого ПКС (не ПКО, а именно ПКС свойства!) напишите: Отказ = 1;.

Посмотрим на ситуацию шире: если мы не передаем родителя, то элемент в приемнике просто запишется в корень справочника, что нам и нужно для одноуровневой структуры.

Шаг 3: Проблема выгрузки по ссылкам из других объектов

Проанализируем ситуацию, когда ссылка на группу справочника может содержаться в других местах, например, в реквизитах документов или других справочников. Если документ ссылается на группу (что редко, но возможно), конвертация при выгрузке документа попытается создать эту группу в приемнике.

Чтобы исключить создание «фантомных» элементов (которые в источнике были группами), в ПКО справочника на закладке Настройки поиска рекомендуется установить флаг Не создавать новый объект, если он не найден. В этом случае, если система попытается выгрузить ссылку на группу, объект в приемнике просто не будет создан, и реквизит останется пустым.

Шаг 4: Использование глобального фильтра (опционально)

Рассмотрим вариант, когда у вас много справочников, и вы хотите внедрить универсальное решение. Вместо того чтобы редактировать каждое ПКО, можно использовать обработчик Перед выгрузкой объекта на уровне всей конвертации (в настройках самих правил).

Там можно прописать проверку метаданных:


// Глобальная проверка для всех справочников
Если Метаданные.Справочники.Содержит(Объект.Метаданные()) Тогда
    Если Объект.Метаданные().Иерархический И Объект.ЭтоГруппа Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Этот метод позволяет централизованно управлять логикой выгрузки, однако будьте осторожны: он может замедлить процесс обмена, если объектов очень много, так как проверка будет выполняться для каждого элемента.

Резюме и рекомендации

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

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

← На главную