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