При переносе данных между базами 1С с помощью конфигурации Конвертация данных (редакция 2.1) часто возникают ситуации, когда структура реквизитов в источнике и приемнике различается. Например, в документе-источнике реквизит может иметь составной тип данных или отсутствовать вовсе, а в приемнике требуется перенаправить данные в другой реквизит (например, Касса_ККМ) или подставить конкретное предопределенное значение.
Рассмотрим подробно способы решения этой задачи, выясним особенности работы обработчиков событий и проанализируем примеры кода для разных сценариев.
Если в источнике нет подходящего реквизита или его тип полностью отличается от приемника, наиболее удобным способом является создание Правила конвертации свойств (ПКС) без указания источника.
Разберем по шагам алгоритм настройки:
Касса_ККМ).Кассы), указываем соответствующее ПКО для этого справочника.Если мы знаем код или наименование элемента в базе-приемнике, передаем ключевое значение в служебную переменную Значение:
// Обработчик "Перед выгрузкой" в ПКС для реквизита Касса_ККМ
// Передаем код элемента, по которому ПКО приемника найдет объект
Значение = "А00000092";
Если требуется выполнить поиск элемента через алгоритм или выражение в приемнике, можно воспользоваться переменной Выражение:
// Обработчик "Перед выгрузкой" в ПКС
Выражение = "Справочники.Кассы.НайтиПоКоду(""А00000092"")";
Если нужно передать произвольное значение из источника в приемник для последующей обработки при загрузке, мы можем задействовать механизм параметров объекта.
Рассмотрим последовательность действий:
КодКассы.
// Задаем значение, которое будет передано в параметры
Значение = "А00000092";
На стороне базы-приемника переданный параметр будет доступен в обработчике После загрузки в составе соответствия ПараметрыОбъекта. Проанализируем пример заполнения реквизита:
// Обработчик "После загрузки" в ПКО документа
Если ПараметрыОбъекта <> Неопределено Тогда
КодКассы = ПараметрыОбъекта.Получить("КодКассы");
Если ЗначениеЗаполнено(КодКассы) Тогда
Объект.Касса_ККМ = Справочники.Кассы.НайтиПоКоду(КодКассы);
КонецЕсли;
КонецЕсли;
Если значение фиксировано или вычисляется непосредственно в базе-приемнике без передачи информации из источника, заполнение можно выполнить напрямую в событии После загрузки объекта.
// Обработчик "После загрузки" в ПКО документа
Объект.Касса_ККМ = Справочники.Кассы.НайтиПоКоду("А00000092");
Если исходный реквизит имеет составной тип (например, может содержать ссылки на справочники Контрагенты, ФизическиеЛица или Субконто), а выбор правила конвертации зависит от фактического типа выгружаемого значения, логику выбора ПКО следует прописать в обработчике Перед выгрузкой реквизита.
Посмотрим на пример динамического выбора правила конвертации:
// Обработчик "Перед выгрузкой" в ПКС для составного реквизита
Если ТипЗнч(Источник.Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
ИмяПКО = "Контрагенты";
ИначеЕсли ТипЗнч(Источник.Контрагент) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
ИмяПКО = "ФизическиеЛица";
КонецЕсли;
При настройке обмена важно учитывать следующую специфику платформы 1С и Конвертации данных:
После загрузки не требуется явно вызывать метод Объект.Записать(). Запись объекта выполняется подсистемой обмена автоматически после завершения всех обработчиков загрузки. Явный вызов метода приведет к повторной записи в транзакции и существенному замедлению переноса.НайтиПоКоду() в базе-приемнике следует учитывать подчиненность. Если справочник Кассы подчинен организации, передавайте владельца при поиске, используя уже загруженные реквизиты: Справочники.Кассы.НайтиПоКоду("А00000092", , Объект.Организация).