Часто перед разработчиками встает специфическая задача: необходимо организовать перенос документов из одной базы 1С в другую (абсолютно идентичную по конфигурации), но при этом "на лету" модифицировать данные. Ярким примером такой задачи является пересчет всех цен и сумм в документах из одной валюты в другую. Проанализируем ситуацию и разберем по шагам, какой инструмент — Конвертация данных 2 (КД2), Конвертация данных 3 (КД3) или альтернативные методы — подойдет для этого лучше всего.
Исторически КД2 является самым популярным инструментом для обмена данными. Для обмена между идентичными конфигурациями в КД2 можно практически в один клик создать автоматическое сопоставление метаданных.
Рассмотрим подробнее преимущества и недостатки этого подхода для нашей задачи:
Цена, Сумма и СуммаНДС.Если вы выбираете КД2, посмотрим на пример того, как правильно обрабатывать пересчет. Недостаточно просто умножить сумму на курс в момент выгрузки. Рекомендуется использовать обработчик ПослеЗагрузки или ПриЗагрузке объекта в базе-приемнике. Перенесите документы "как есть", а затем вызовите экспортные методы документа для корректного пересчета налогов и итогов:
// Пример кода для обработчика "После загрузки" в КД2
Если Объект.Свойство("ВалютаДокумента") Тогда
Объект.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("810"); // Нужная валюта
Объект.КурсВзаиморасчетов = ПолучитьКурсВалютыНаДату(Объект.Дата);
// Вызов типового метода конфигурации для пересчета ТЧ
ОбработкаТабличныхЧастей.ПересчитатьСуммыДокумента(Объект);
КонецЕсли;
КД3 работает совершенно по иному принципу. Она использует универсальный формат EnterpriseData, а логика обмена вынесена из правил непосредственно в код самой конфигурации 1С (в общие модули).
Разберем, подойдет ли этот формат для модификации данных:
МенеджерОбменаЧерезУниверсальныйФормат и видеть, как формируются данные.Если конфигурации типовые (или почти типовые), выясним причину, почему стоит отказаться от написания правил с нуля. Вместо этого можно настроить стандартный обмен через формат EnterpriseData, а логику пересчета валют внедрить в базу-приемник с помощью механизма расширений.
Рассмотрим этот элегантный подход. Вы оставляете базы на поддержке, включаете типовой обмен, а в приемнике создаете расширение, которое перехватывает процесс записи документа при обмене:
&После("ПриЗагрузкеДанных")
Процедура ПересчетВалют_ПриЗагрузкеДанных(ОбъектДанных, ПравилоКонвертации, Отказ)
Если ТипЗнч(ОбъектДанных) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
// Получаем нужный курс из регистра
НовыйКурс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ОбъектДанных.Дата);
Для Каждого СтрокаТЧ Из ОбъектДанных.Товары Цикл
СтрокаТЧ.Цена = СтрокаТЧ.Цена * НовыйКурс.Курс;
СтрокаТЧ.Сумма = СтрокаТЧ.Цена * СтрокаТЧ.Количество;
// Логика расчета НДС
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, если обмен должен быть не разовым, а постоянным (online-обмен). Стандартные XML-выгрузки (как КД2, так и КД3) создают файлы на диске и работают относительно медленно. Современным стандартом для таких задач является использование HTTP-сервисов и JSON.
HTTPСервис, ожидающий POST-запросы.Структура или Соответствие).ЗаписьJSON и отправляются по сети.Такой подход обеспечивает практически мгновенную передачу данных и полный контроль над логикой трансформации с использованием всех преимуществ отладки кода.
Какую бы технологию вы ни выбрали, обратите пристальное внимание на математику. При программном пересчете цен из одной валюты в другую часто возникают проблемы округления.
Если вы просто перемножите итоговую сумму документа на курс, у вас неизбежно поедут формулы в строчных частях. Всегда соблюдайте строгое правило пересчета:
Цена с нужным округлением.Сумма (Цена умноженная на Количество).СуммаНДС от новой суммы строки.Также не забудьте настроить синхронизацию справочника Валюты и регистра сведений КурсыВалют. Если в базу-приемник не передать актуальные курсы на дату документа, при первом же перепроведении документа пользователем (или регламентным заданием) суммы могут быть искажены.
Подытожим критерии выбора для решения поставленной задачи: