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