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