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