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