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