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