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