несколько документов из одной конфигурации в один документ другой конфигурации

1. sergiobargio1 118 31.08.15 10:26 Сейчас в теме
Добрый день.
В одной конфигурации есть документы вида "Оплата", у которого есть только реквизиты шапки "Дата", "Номер", "Контрагент", "Валюта", "Сумма". Эти документы формируются по каждому факту оплаты по несколько штук в день.
В другой конфигурации есть документы вида "ОплатыТоваров", у которых в шапке только стандартные реквизиты "Дата" и "Номер", а вот в табличной части "Платежи" есть те же самые реквизиты "Контрагент", "Валюта", "Сумма". Такие документы создаются по одной штуке за целый день.
Пытаюсь создать правила обмена данными (ПКД) следующим образом:
создал правила конвертации объектов (ПКО), в котором объект-источник оставил пустой, а объект-приемник указал "ДокументСсылка.ОплатыТоваров", имя правила назвал "ОплатыТоваров", на закладке настройки установил флажок только на пункте "Автоматически генерировать номер или код, если он не задан";
в правилах конвертации свойств (ПКС) для реквизитов приёмника "Контрагент", "Валюта", "Сумма" в табличной части "Платежи" установил флажки "Получить из входящих данных" правило конвертации "ОплатыТоваров";
В правилах выгрузки данных (ПВД) создал Объект выборки "ДокументСсылка.Оплата", способ выборки "Произвольный алгоритм", правило конвертации "ОплатыТоваров"на закладке "Основная" в разделе "Перед обработкой" создал следующий алгоритм:
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
|	Оплата.Дата КАК Дата,
|	Оплата.Контрагент КАК Контрагент,
|	Оплата.Валюта КАК Валюта,
|	СУММА(Оплата.Сумма) КАК Сумма
|	ИЗ
|	Документ.Оплата КАК Оплата
|	
|	СГРУППИРОВАТЬ ПО
|	Оплата.Дата,
|	Оплата.Контрагент,
|	Оплата.Валюта
|	
|	УПОРЯДОЧИТЬ ПО
|		Дата,
|		Контрагент,
|		Валюта
|	ИТОГИ
|		СУММА(Сумма)
|	ПО
|		Дата,
|		Контрагент,
|		Валюта";

Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

ТаблицаДанные = Новый ТаблицаЗначений;
ТаблицаДанные.Колонки.Добавить("Номер", Новый ОписаниеТипов("Строка"));
ТаблицаДанные.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ТаблицаДанные.Колонки.Добавить("ПометкаУдаления", Новый ОписаниеТипов("Булево"));
ТаблицаДанные.Колонки.Добавить("Проведен", Новый ОписаниеТипов("Булево"));
ТаблицаДанные.Колонки.Добавить("Платежи", Новый ОписаниеТипов("ТаблицаЗначений"));

Платежи = Новый ТаблицаЗначений();
Платежи.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
Платежи.Колонки.Добавить("Валюта", Новый ОписаниеТипов("СправочникСсылка.Валюты"));
Платежи.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

Пока Выборка.Следующий() Цикл
	СтрокаПлатежи = Платежи.Добавить();
	СтрокаПлатежи.Контрагент = Выборка.Контрагент;
	СтрокаПлатежи.Валюта = Выборка.Валюта;
	СтрокаПлатежи.Сумма = Выборка.Сумма;
КонецЦикла;

НоваяСтрокаДанные = ТаблицаДанные.Добавить();

НоваяСтрокаДанные.Дата = Выборка.Дата;
НоваяСтрокаДанные.ПометкаУдаления = Ложь;
НоваяСтрокаДанные.Проведен = Ложь;
НоваяСтрокаДанные.Платежи = Платежи;

ВыборкаДанных = ТаблицаДанные;
Показать

К сожалению, при попытке выгрузить по этому правило из конфигурации Источника выдаёт следующие ошибки:
Ошибка получения значения свойства объекта (по имени свойства источника)
ПКО = ОплатыТоваров (Документ: Оплата)
ПКС = 5 (Валюта -->)
Объект = СтрокаТаблицыЗначений (Строка таблицы значений)
СвойствоПриемника = ()
ОписаниеОшибки = Поле объекта не обнаружено (Валюта)
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8282)
КодСообщения = 13

Ошибка при выгрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1693)}: Ошибка получения значения свойства объекта (по имени свойства источника)
ПКО = ОплатыТоваров (Документ: Оплата)
ПКС = 5 (Валюта -->)
Объект = СтрокаТаблицыЗначений (Строка таблицы значений)
СвойствоПриемника = ()
ОписаниеОшибки = Поле объекта не обнаружено (Валюта)
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8282)
КодСообщения = 13
Показать

пожалуйста, подскажите на что следует обратить внимание для решения проблемы?
Спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. sonne 31.08.15 12:05 Сейчас в теме
(1) sergiobargio1, как мне кажется, ВыборкаДанных будет работать, только если в ПКО источник непустой и его реквизиты совпадают с колонками ВыборкаДанных.
Я бы сделала вот так:
1. в ПКО поиск по Дате
2. в ПВД делать обход выборки по датам, формировать ТЧ и структуру для ВходящихДанных, и выгружать с помощью ВыгрузитьПоПравилу.
3. в ПКС убрать галочки "Получить из входящих данных", в обработчиках "Перед выгрузкой" написать:
- в реквизитах, например, Значение = ВходящиеДанные.Дата;
- в ТЧ КоллекцияОбъектов = ВходящиеДанные.ТаблицаПлатежей;
- в реквизитах ТЧ, например, Значение = ОбъектКоллекции.Валюта;
sergiobargio1; +1 Ответить
3. sergiobargio1 118 31.08.15 14:47 Сейчас в теме
(2) sonne, спасибо. подскажите где в пко "поиск по дате"? это действительно необходимо если в базе-источнике будет по несколько документов в каждую дату, а в базе-приемнике будет только по одному документу за каждый день?
4. sonne 31.08.15 14:51 Сейчас в теме
(3) sergiobargio1, в ПКС "Дата" ставите галочку "Поиск объекта при загрузке по свойству". Необходимо ли это, зависит от ваших целей. Если Вы 1 раз выгрузите всё, то поиск не нужен. Если будете периодически выгружать, то при выгрузке за одну и ту же дату в приемнике создастся несколько одинаковых документов.
sergiobargio1; +1 Ответить
5. sergiobargio1 118 31.08.15 15:25 Сейчас в теме
(4) sonne, спасибо. для ПВД всё оставлять как есть? "- в ТЧ КоллекцияОбъектов = ВходящиеДанные.ТаблицаПлатежей; " где прописать?
6. sonne 31.08.15 15:50 Сейчас в теме
(5) sergiobargio1, в ПВД как раз надо прописать ВыгрузитьПоПравилу (сейчас попробую на коленке сляпать).
Ставите курсор на ПКС табличной части, нажимаете "Изменить", в обработчике "Перед выгрузкой" пишите КоллекцияОбъектов = ВходящиеДанные.ТаблицаПлатежей;
ТаблицаПлатежей - это то, как назовете таблицу с платежами в ПВД.
sergiobargio1; +1 Ответить
7. sonne 31.08.15 16:12 Сейчас в теме
Как-то так в ПВД:
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
|    Оплата.Дата КАК Дата,
|    Оплата.Контрагент КАК Контрагент,
|    Оплата.Валюта КАК Валюта,
|    СУММА(Оплата.Сумма) КАК Сумма
|    ИЗ
|    Документ.Оплата КАК Оплата
|    
|    СГРУППИРОВАТЬ ПО
|    Оплата.Дата,
|    Оплата.Контрагент,
|    Оплата.Валюта
|    
|    УПОРЯДОЧИТЬ ПО
|        Дата,
|        Контрагент,
|        Валюта
|    ИТОГИ
|        СУММА(Сумма)
|    ПО
|        Дата,
|        Контрагент,
|        Валюта";

Платежи = Новый ТаблицаЗначений();
Платежи.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
Платежи.Колонки.Добавить("Валюта", Новый ОписаниеТипов("СправочникСсылка.Валюты"));
Платежи.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

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


Если хотите переносить признак Проведен и ПометкаУдаления, то также нужно в запросе группировать и создавать уже несколько документов за одну дату. Или в запросе сделать отбор по Проведенным (врядли остальные нужны).

Понятно, что писать в обработчиках ПКС? Там явно указываем значение из ТЗ ВходящиеДанные, в которую передается таблица ДанныеЗагрузки.
sergiobargio1; +1 Ответить
8. sergiobargio1 118 31.08.15 17:01 Сейчас в теме
(7) sonne, огромное Вам спасибо. К сожалению, параметр "ДатаНачОст" не находит, вместо его поставил "ВыборкаДата.Дата", увы не спасает
Ошибка в обработчике события ПередВыгрузкой (свойства)
ПКО = ОплатыТоваров (Документ: Оплата)
ПКС = 1 (--> Дата)
Объект = 25.08.2015 12:00:00 (Дата)
СвойствоПриемника = Дата (Дата)
Обработчик = ПередВыгрузкойСвойства
ОписаниеОшибки = Значение не является значением объектного типа (Дата)
ПозицияМодуля = (1)
КодСообщения = 55

Ошибка в обработчике события ПередОбработкойПравилаВыгрузки
ПВД = Оплата
Обработчик = ПередОбработкойВыгрузкиДанных
ОписаниеОшибки = Ошибка в обработчике события ПередВыгрузкой (свойства)
ПКО = ОплатыТоваров (Документ: Оплата)
ПКС = 1 (--> Дата)
Объект = 25.08.2015 12:00:00 (Дата)
СвойствоПриемника = Дата (Дата)
Обработчик = ПередВыгрузкойСвойства
ОписаниеОшибки = Значение не является значением объектного типа (Дата)
ПозицияМодуля = (1)
КодСообщения = 55
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1693)
КодСообщения = 31

Ошибка при выгрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1716)}: Ошибка в обработчике события ПередОбработкойПравилаВыгрузки
ПВД = Оплата
Обработчик = ПередОбработкойВыгрузкиДанных
ОписаниеОшибки = Ошибка в обработчике события ПередВыгрузкой (свойства)
ПКО = ОплатыТоваров (Документ: Оплата)
ПКС = 1 (--> Дата)
Объект = 25.08.2015 12:00:00 (Дата)
СвойствоПриемника = Дата (Дата)
Обработчик = ПередВыгрузкойСвойства
ОписаниеОшибки = Значение не является значением объектного типа (Дата)
ПозицияМодуля = (1)
КодСообщения = 55
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1693)
КодСообщения = 31
Показать
9. sonne 31.08.15 17:04 Сейчас в теме
(8) sergiobargio1, можете выложить правила?
Да, дату Вы верно поправили. Скопировала из другого места и не обратила внимание.
10. sergiobargio1 118 31.08.15 17:05 Сейчас в теме
11. sergiobargio1 118 31.08.15 17:10 Сейчас в теме
(9) sonne, очистил для каждого ПКС колонку "Правила конвертации", вышеописанная проблема ушла, однако вылезла другая:
Н
ачало выгрузки: 31.08.2015 16:09:26

Ошибка в обработчике события ПередОбработкойПравилаВыгрузки
ПВД = Оплата
Обработчик = ПередОбработкойВыгрузкиДанных
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7999)
КодСообщения = 31

Ошибка при выгрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1716)}: Ошибка в обработчике события ПередОбработкойПравилаВыгрузки
ПВД = Оплата
Обработчик = ПередОбработкойВыгрузкиДанных
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7999)
КодСообщения = 31
Показать
следующая версия правил прикреплена
12. sonne 31.08.15 17:21 Сейчас в теме
У вас в ПВД и ПКС было указано правило конвертации "ОплатыТоваров". В ПВД это не нужно, т.к. вручную указываем в ВыгрузитьПоПравилу, а в ПКС вообще неправильно. Поэтому выгрузка и ругалась, т.к. Дату не смогла сконвертировать по правилу "ОплатыТоваров". Я везде исправила правила конвертации, для Валюты нужно его создать (создайте и выберете в ПКС валюты).
sergiobargio1; +1 Ответить
13. sergiobargio1 118 31.08.15 17:33 Сейчас в теме
(12) sonne, снова большое спасибо. в мойе попытке было только
|    КОНЕЦПЕРИОДА(Оплата.Дата, ДЕНЬ) КАК Дата,
, ошибку исправил
ПКО для справочника "Валюты" создал, соответственно для него и ПКС и подправил ПКС табличной части "Платежи".
Блин, снова засада:
Начало выгрузки: 31.08.2015 16:33:05

Ошибка в обработчике события ПередОбработкойПравилаВыгрузки
ПВД = Оплата
Обработчик = ПередОбработкойВыгрузкиДанных
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7999)
КодСообщения = 31

Ошибка при выгрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(1716)}: Ошибка в обработчике события ПередОбработкойПравилаВыгрузки
ПВД = Оплата
Обработчик = ПередОбработкойВыгрузкиДанных
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7999)
КодСообщения = 31
Показать
14. sonne 31.08.15 18:04 Сейчас в теме
(13) sergiobargio1, это какой-то косяк в обработке запроса. Уже сегодня плохо соображаю. Попробуйте вставить тестовые сообщения, чтобы понять, где именно ошибка. Ну и запрос проверьте в консоли запросов.
sergiobargio1; +1 Ответить
15. sergiobargio1 118 31.08.15 18:10 Сейчас в теме
(14) sonne, да да, Вы снова правы как раз по шагово внешней обработкой в отладчике смотрю результаты, а в консоле запросов в структуре "Дерева" выгружает замечательно.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот