Имя: Пароль:
1C
1С v8
Правила обмена УТ 10.3 - БП 3.0
0 Rollam
 
20.08.15
13:08
Столкнулся с проблемой в правилах обмена УТ 10.3 - БП 3.0.
Проблема возникает при загрузке табличной части "Оплата" документа "Отчет о розничных продажах".
Версия УТ "10.3.28.1", БП "3.0.40.24". В последующих версиях различий с указанными для этого документа объектов не нашел.

Суть в том, что в источнике имеются две табличные части "ОплатаПлатежнымиКартами" и "ОплатаБанковскимиКредитами".
ТЧ "ОплатаБанковскимиКредитами" имеет реквизиты "ВидОплаты", "Сумма", "БанкКредитор" (Контрагент) и "ДоговорВзаиморасчетовБанкаКредитора" (Договор контрагента).
Следующая ТЧ "ОплатаПлатежнымиКартами" имеет реквизиты "ВидОплаты" и "Сумма". Плюс, имеются два реквизита документа: "Эквайрер" (Контрагент) и "ДоговорВзаиморасчетовЭквайрера" (Договор контрагента).
В приемнике имеется одна ТЧ "Оплата" с реквизитами: "ВидОплаты", "СуммаОплаты", "Контрагент" и "ДоговорКонтрагента".

Задача состоит в том, что данные этиз двух ТЧ необходимо перегружать в ТЧ Приемника "Оплата".

Сразу скажу, что я пытался скопировать правила из типового обмена. Ничего не получилось.

Я пытался решить задачу двумя способами:

Первый.
Создал два правила для каждой ТЧ источника, указав для обоих одну ТЧ приемника. В каждой в модуле "Перед обработкой" добавил "НеОчищать = ИСТИНА;".
Далее для правила "ОплатаБанковскимиКредитами - Оплата" указал соответствия реквизитов и правила ПКО.
Для правила "ОплатаПлатежнымиКартами - Оплата" указал соответствия и ПКО для реквизитов "ВидОплаты" и "Сумма". Для реквизитов приемника "Контрагент" и "ДоговорКонтрагента" соответствующих данных в ТЧ источника нет, ибо эти данные лежат в реквизитах самого источника. Создаю правила без источника, но с приемником. В обработке "Перед выгрузкой" пишу: "Значение = Источник.Эквайрер;", и "Значение = Источник.ДоговорВзаиморасчетовЭквайрера;". Подставляю соответствующие ПКО.

Второй способ:
Создаю правило без источника, но с приемником в виде ТЧ "Оплата".
В обработке "Перед обработкой" пишу:

/////////////////////////////////////////////
КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("ВидОплаты");
КоллекцияОбъектов.Колонки.Добавить("Контрагент");
КоллекцияОбъектов.Колонки.Добавить("ДоговорКонтрагента");
КоллекцияОбъектов.Колонки.Добавить("СуммаОплаты");

Для Каждого СтрокаПлатежа Из Источник.ОплатаПлатежнымиКартами Цикл
    СтрокаИтоговогоТаблицы = КоллекцияОбъектов.Добавить();
    СтрокаИтоговогоТаблицы.ВидОплаты = СтрокаПлатежа.ВидОплаты;
    СтрокаИтоговогоТаблицы.СуммаОплаты = СтрокаПлатежа.Сумма;
    СтрокаИтоговогоТаблицы.Контрагент = Источник.Эквайрер;
    СтрокаИтоговогоТаблицы.ДоговорКонтрагента = Источник.ДоговорВзаиморасчетовЭквайрера;
КонецЦикла;

Для Каждого СтрокаПлатежа Из Источник.ОплатаБанковскимиКредитами Цикл
    СтрокаИтоговогоТаблицы = КоллекцияОбъектов.Добавить();
    СтрокаИтоговогоТаблицы.ВидОплаты = СтрокаПлатежа.ВидОплаты;
    СтрокаИтоговогоТаблицы.СуммаОплаты = СтрокаПлатежа.Сумма;
    СтрокаИтоговогоТаблицы.Контрагент = СтрокаПлатежа.БанкКредитор;
    СтрокаИтоговогоТаблицы.ДоговорКонтрагента = СтрокаПлатежа.ДоговорВзаиморасчетовБанкаКредитора;
КонецЦикла;

ВходящиеДанные = Новый Структура("Оплата");
ВходящиеДанные.Оплата = Новый ТаблицаЗначений;
ВходящиеДанные.Оплата.Колонки.Добавить("ВидОплаты");
ВходящиеДанные.Оплата.Колонки.Добавить("СуммаОплаты");
ВходящиеДанные.Оплата.Колонки.Добавить("Контрагент");
ВходящиеДанные.Оплата.Колонки.Добавить("ДоговорКонтрагента");

Для каждого стр из КоллекцияОбъектов Цикл
    НовСтрока = ВходящиеДанные.Оплата.Добавить();
    НовСтрока.ВидОплаты = стр.ВидОплаты;
    НовСтрока.Контрагент = стр.Контрагент;
    НовСтрока.ДоговорКонтрагента = стр.ДоговорКонтрагента;
    НовСтрока.СуммаОплаты = стр.СуммаОплаты;
КонецЦикла;    
////////////////////////////////////////////

Затем внутри группы правила добавляю реквизиты ТЧ приемника, а на самой группе включаю флаг "Получить из входящих данных".




В обоих случаях происходит следующее:
Выгрузка проходит без проблем. В xml-файле выгрузки можно найти данные из ТЧ источника "ОплатаПлатежнымиКартами", но при загрузке (опять без каких-либо ошибок), в строках ТЧ приемника "Оплата" не заполняются поля "Контрагент" и "ДоговорКонтрагента" тех строк ТЧ, которые имеют отношение к оплатам по карте (оплаты банковскими кредитами заполняются без проблем), хотя сами элементы справочников перегрузились.

Я перепробовал уже все, что знал.
Мне нужна ваша мудрость) Заранее спасибо.
1 Rollam
 
20.08.15
13:31
Надо же. Прочитал свою же тему и пришла в голову мысль.
Верно говорят, что правильно заданный вопрос - уже практически готовый ответ.
Оказалось, в обработке самого объекта обмена (документа) в модуле "После загрузки" есть такой код:

Для каждого СтрокаТЧ Из Объект.Оплата Цикл
    
    Если ЗначениеЗаполнено(СтрокаТЧ.ВидОплаты) Тогда
        ЗаполнитьЗначенияСвойств(СтрокаТЧ, ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаТЧ.ВидОплаты,"Контрагент,ДоговорКонтрагента,СчетУчетаРасчетов"));
        СтрокаТЧ.СчетУчетаРасчетов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаТЧ.ВидОплаты, "СчетУчетаРасчетов").СчетУчетаРасчетов;
    Иначе
        СчетаУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаРасчетовСКонтрагентом(
                            Объект.Организация,
                            СтрокаТЧ.Контрагент,
                            СтрокаТЧ.ДоговорКонтрагента);
        СтрокаТЧ.СчетУчетаРасчетов = СчетаУчета.СчетРасчетов;
    КонецЕсли;
        
КонецЦикла;


В данном случае, при вызове "ЗаполнитьЗначенияСвойств", почему-то очищаются "Контрагент" и "ДоговорКонтрагента" в записях ТЧ, связванных с эквайрингом.
2 lxndr
 
20.08.15
13:34
(1) ты пропустил скобочку в уме. Ничего там не очищается, наоборот заполняется
3 Rollam
 
20.08.15
14:09
(2) По идее, должны заполняться, согласен. Результат вызова этого метода - именно очищение реквизитов строки ТЧ, связанной с эквайрингом. Для строк, связанных с кредитом, все проходит нормально.
Независимо от того, куда вы едете — это в гору и против ветра!