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