|
КД2: Выгрузка Табличная часть в несколько Документов | ☑ | ||
---|---|---|---|---|
0
Mikhail Volkov
05.09.19
✎
12:35
|
Нужно из банковской Выписки Альфа-Авто из строк по эквайрингу сформировать документы Оплата от покупателя платежной картой для УПП/КА1. Понимаю, что для начала нужно создать структуру ВходящиеДанные, и затем заполнить данными из нужных строк Выписки. Затем: ВыгрузитьПоПравилу(,,ВходящиеДанные,,"ИмяПКО_СтрокаВыписки_ОплатаОтПокупателяПлатежнойКартой"); Но где это прописать, в каком обработчике?
|
|||
1
Йохохо
05.09.19
✎
12:52
|
в ПередВыгрузкой ПКО наверное
|
|||
2
azt-yur
05.09.19
✎
13:00
|
(1) Лучше в ПВД
|
|||
3
d4rkmesa
05.09.19
✎
13:14
|
(0) Фильтр в ПВД ПередВыгрузкой (для определения наличия строк по эквайрингу), в ПередОбработкой или ПередВыгрузкой ПКГС Состав->РасшифровкаПлатежа можно что-то прописать, чтобы выгружались только нужные строки.
|
|||
4
Mikhail Volkov
05.09.19
✎
13:32
|
(1) В какое ПКО? ПКО СтрокаВыписки_ОплатаОтПокупателяПлатежнойКартой еще не писал, нет документа СтрокаВыписки, Источник пустой?
(2) ПВД - привила выгрузки данных, каких, какому ПКО соответствует? В какой обработчик? |
|||
5
Йохохо
05.09.19
✎
13:38
|
(4) ПКО "Выписки Альфа-Авто из строк по эквайрингу" конечно
|
|||
6
Mikhail Volkov
05.09.19
✎
13:47
|
(3) По поводу фильтра для определения наличия строк по эквайрингу:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | ВыпискаСостав.Ссылка, | ВыпискаСостав.СтатьяДДС, | ВыпискаСостав.Контрагент, | ВыпискаСостав.ДоговорВзаиморасчетов, | ВыпискаСостав.Сделка, | ВыпискаСостав.СуммаПриход, | ВыпискаСостав.СуммаРасход, | ВыпискаСостав.СтавкаНДС, | ВыпискаСостав.СуммаНДС, | ВыпискаСостав.ПлатежноеПоручениеОснование, | ВыпискаСостав.НазначениеПлатежа |ИЗ | Документ.Выписка.Состав КАК ВыпискаСостав |ГДЕ | ВыпискаСостав.Ссылка.Дата МЕЖДУ &НачДата И &КонДата | И ВыпискаСостав.Ссылка.Организация = &Организация | И ВыпискаСостав.Ссылка.Проведен"; Запрос.УстановитьПараметр("НачДата", ДатаНачала); Запрос.УстановитьПараметр("КонДата", ДатаОкончания); Запрос.УстановитьПараметр("Организация", Параметры.Организация); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Найти(Выборка.НазначениеПлатежа, "Эквайринг") = 0 Или Выборка.СтатьяДДС = Справочники.СтатьиДДС.Эквайринг Тогда Продолжить; КонецЕсли; ВходящиеДанные = Новый Структура; ВходящиеДанные.Вставить("СтатьяДДС", Выборка.СтатьяДДС); ВходящиеДанные.Вставить("Контрагент", Выборка.Контрагент); ВходящиеДанные.Вставить("ДоговорВзаиморасчетов", Выборка.ДоговорВзаиморасчетов); ВходящиеДанные.Вставить("Сделка", Выборка.Сделка); ВходящиеДанные.Вставить("Сумма", Выборка.СуммаПриход + Выборка.СуммаРасход); ВходящиеДанные.Вставить("СтавкаНДС", Выборка.СтавкаНДС); ВходящиеДанные.Вставить("СуммаНДС", Выборка.СуммаНДС); ВходящиеДанные.Вставить("Номер", мвДоработки.ВыделитьНомерПП(Выборка.ПлатежноеПоручениеОснование)); ВходящиеДанные.Вставить("НазначениеПлатежа", Выборка.НазначениеПлатежа); ВходящиеДанные.Вставить("Дата", Выборка.Ссылка.Дата); ВходящиеДанные.Вставить("Автор", Выборка.Ссылка.Автор); ВходящиеДанные.Вставить("Организация", Выборка.Ссылка.Организация); ВходящиеДанные.Вставить("ПодразделениеКомпании", Выборка.Ссылка.ПодразделениеКомпании); ВходящиеДанные.Вставить("Документ", СокрЛП(Выборка.Ссылка); Если ВходящиеДанные.Количество() > 0 Тогда ВыгрузитьПоПравилу(,,ВходящиеДанные,,"ИмяПКО_СтрокаВыписки_ОплатаОтПокупателяПлатежнойКартой"); КонецЕсли; КонецЦикла; Но не знаю куда вставить... (5) Источник - Выписка, приемник - ОплатаОтПокупателяПлатежнойКартой? А не чего что не 1 в 1, а во многие? Никогда не приходилось такое делать. Пример бы посмотреть... |
|||
7
Йохохо
05.09.19
✎
13:50
|
(6) пример в (6)
КонецРекурсии |
|||
8
kabanoff
05.09.19
✎
14:04
|
(0) Для конвертации строки ТЧ в документ нужно создать ПКО. Например, "СтрокаВыписки". Источник пустой, получатель - твой документ.
В нем создаешь нужное количество ПКС. В каждом из них источник будет пустой, а приемник будет реквизитом документа-приемника. В обработчике ПередВыгрузкой каждого ПКС пишешь: Значение = Источник.ИмяРеквизита; где ИмяРеквизита - выгружаемый реквизит. Выгрузку каждой строки в документ делаешь в ПВД. Тип выборки данных - произвольный запрос. В обработчике ПередВыгрузкой пишешь запрос, который выбирает данные из ТЧ, а затем в цикле пишешь: ВыгрузитьПоПравилу(Выборка,,,, "СтрокаВыписки"); где Выборка - выборка из результата запроса. Т.е. Выборка и будет выступать источником данных для ПКО "СтрокаВыписки". Соответственно, в ней должны быть описаны те реквизиты, которые нужно выгрузить в приемник. С исходящими и входящими данными я бы не заморачивался - это потом сложнее сопровождать. Как-то так. |
|||
9
kabanoff
05.09.19
✎
14:05
|
И не забудь в ПКО поставить галку "Не запоминать выгруженные объекты".
|
|||
10
Mikhail Volkov
05.09.19
✎
14:11
|
(8) Хорошо, осмыслю, попробую... Спс.
|
|||
11
Mikhail Volkov
05.09.19
✎
15:23
|
(8) > В нем создаешь нужное количество ПКС. В каждом из них источник будет пустой, а приемник будет реквизитом документа-приемника. В обработчике ПередВыгрузкой каждого ПКС пишешь: Значение = Источник.ИмяРеквизита;
В этих ПКС нужно ставить галочку "Получить значение из входящих данных"? |
|||
12
Mikhail Volkov
05.09.19
✎
17:45
|
(11) Вроде нет.
|
|||
13
Mikhail Volkov
06.09.19
✎
12:03
|
(8) Вроде все получилось! Не все с Датой что-то ни так...
Пока документы Оплата от покупателя платежной картой в УПП/КА1 вводят вручную, и заполняют их частично: не заполняют реквизиты ДокументРасчетовСКонтрагентом и ПризнакСпособаРасчета (полная оплата или частично). Потому что этих документов пока нет в УПП/КА1. Они появится после обмена с Альфа-Авто, который выполняется не чаще раза в неделю. В общем-то и задумано дополнить обмен по строкам Выписки ради до заполнения этих реквизитов. Переходим на КА2.4, а там из-за этой не до заполненности возникают ошибки типа: Превышена сумма зачета аванса Эквайринговая операция ИП-00000299 от 18.07.2019 10:00:00 на 26 766 RUB Превышена сумма зачета аванса Эквайринговая операция ИП-00000353 от 14.08.2019 8:19:39 на 11 560 RUB Дату/время конвертированных документов Оплата от покупателя платежной картой ставлю по Выписке. И если в приемной базе он найден, то пытаюсь Дату/время оставить старую. Для этого в обработчике ПКО_СтрокаВыпискиЭквайринг_ПослеЗагрузкиОбъекта прописал: БылаДата = ""; Если ОбъектНайден Тогда БылаДата = " было: " + Объект.Дата; Объект.Дата = Объект.Ссылка.Дата; Если ЗначениеЗаполнено(Объект.Ссылка.Ответственный) Тогда Объект.Ответственный = Объект.Ссылка.Ответственный; КонецЕсли; КонецЕсли; Если Параметры.Комментировать И Не Отказ Тогда Сообщить(?(ОбъектНайден, "Обновл", "Загруж") + "ен: " + СокрЛП(Объект) + БылаДата + " " + СокрЛП(Объект.Контрагент) + " на сумму: " + Объект.СуммаДокумента + " " + СокрЛП(Объект.ВалютаДокумента), СтатусСообщения.Информация); КонецЕсли; В результате получаю: Обновлен: Оплата от покупателя платежной картой ИП000000393 от 04.09.2019 9:46:39 было: 04.09.2019 9:46:39 Плохих Н.Ю. на сумму: 3 520 RUB Ошибка при записи документа ИмяПКО = СтрокаВыпискиЭквайринг ТипОбъекта = Оплата от покупателя платежной картой Объект = Оплата от покупателя платежной картой ИП000000393 от 04.09.2019 9:46:39 ОписаниеОшибки = Ошибка при вызове метода контекста (Записать): Значение "ИП000000393" поля "Номер" не уникально ПозицияМодуля = Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7517) КодСообщения = 25 Не пойму в чем дело, может не тот обработчик, где-то раньше Дату/время менять? |
|||
14
Mikhail Volkov
06.09.19
✎
14:43
|
Пока прекратил попытки вернуть прежнюю Дату/время документов, пусть у всех документов за день будет одно время Выписки. Но Ошибка при записи документа осталась!? Если бы это был новый документ, тогда понятно. А тут обновление документа, ОбъектНайден = Истина! При чем тут Значение поля "Номер" не уникально?
|
|||
15
Mikhail Volkov
06.09.19
✎
15:56
|
При чем не все документы Оплата от покупателя платежной картой пишутся с ошибкой: если в Выписка содержит только одну строку СтрокаВыпискиЭквайринг, то получаемый из нее документ обновляется нормально. А если их несколько, то пишутся все с Ошибкой при записи документа. Точнее даже не пишутся, а дают эту ошибку, пишется только последний (дублем), но не проводится.
|
|||
16
Mikhail Volkov
06.09.19
✎
20:17
|
Согласно документации: ОбъектНайден - Булево. Если значение параметра равно Ложь, то объект не идентифицирован, то есть не найден в информационной базе.
А если Истина, то значит ли что объект идентифицирован? Или кроме Номера еще Дата документа должна совпадать? Почему Объект.Ссылка.Дата не равна дате/времени документа в базе, а равна Объект.Дата загружаемого? |
|||
17
Mikhail Volkov
07.09.19
✎
10:15
|
+ Еще из информации по обработчику При загрузке:
Объект - Произвольный. Загружаемый, модифицируемый объект, созданный по ссылке или найденный в информационной базе. Если способ идентификации объекта в файле не указан (т.е. отсутствует узел "Ссылка"), то параметр содержит значение Неопределено. В этом случае в обработчике возможна произвольная инициализация загружаемого объекта, в противном случае, объект будет создан автоматически. Как указать способ идентификации объекта в файле? Никогда не указывал... |
|||
18
Mikhail Volkov
07.09.19
✎
10:25
|
Ссылка вроде есть: Не Объект.Ссылка.Пустая() = Истина, но информация в ней та же самая, что в Объект: Объект.Ссылка.Дата = Объект.Дата; Объект.Ссылка.Ответственный = Объект.Ответственный; Почему?
|
|||
19
hhhh
07.09.19
✎
11:02
|
выкинуть дату из полей поиска. Чтобы горело нежирьненько
|
|||
20
Mikhail Volkov
07.09.19
✎
11:23
|
(19) Пробовал, ничего не изменилось. Дата в полях поиска рассматривается не как Дата, а как Период - в общем случае Год даты v8: КД: Поля поиска
С датой ладно, но почему когда ОбъектНайден, объект не идентифицирован, пишется как новый? И Объект.Ссылка.Ответственный = Объект.Ответственный? Ответственный передаю, если в базе документ не найден, и создается новый. А если ОбъектНайден, то пусть Ответственный остается какой был. |
|||
21
welwel
07.09.19
✎
14:12
|
Отладчиком пробовали смотреть? В кд2 достаточно понятный код.
|
|||
22
Mikhail Volkov
08.09.19
✎
08:15
|
(21) Не пойму где смотреть отладчиком... КД2 формирует только файл правил выгрузки, получается надо смотреть УниверсальныйОбменДаннымиXML при загрузке. Почему когда ОбъектНайден, не пустая Объект.Ссылка в ней оказывается не найденный Объект базы, а загружаемый Объект из файла?
|
|||
23
welwel
08.09.19
✎
08:36
|
(22) в УниверсальныйОбменДаннымиXML есть Режим отладки обработчиков загрузки. Либо можно непосредственно в УниверсальныйОбменДаннымиXML, например, посмотреть НайтиОбъектПоСсылке, не проваливаясь в обработчик
|
|||
24
Mikhail Volkov
08.09.19
✎
09:27
|
(23) Да, есть галочка "Режим отладки обработчиков загрузки", и кнопка "Настройка отладки загрузки..." - открывает форму "Форма настройки отладки обработчиков". В ней нажал кнопку "Сформировать модуль отладки выгрузки", сформировался модуль отладки с процедурами, например, Конвертация_ПослеЗагрузкиОбъекта()... Никогда этим не пользовался, где посмотреть НайтиОбъектПоСсылке? Или хотя бы ссылку посмотреть как этим пользоваться...
|
|||
25
Mikhail Volkov
08.09.19
✎
17:21
|
Разобрался: снял галочку "Искать объект приемника по внутреннему идентификатору объекта источника". Обычно ее ставлю, чтобы была доступна галочка "Продолжить поиск по полям поиска...". А ее необязательно ставить, все равно ищет, если в ПКС галочки поиска стоят...
|
|||
26
d4rkmesa
08.09.19
✎
20:00
|
(6) Если любопытно все еще, могу кинуть правила АА5-БП3, но они там довольно кастомизированы, метаданные в вашей АА в любом случае несколько другие будут.
|
|||
27
Mikhail Volkov
08.09.19
✎
20:36
|
(26) Вы тоже строки выписки Альфа-Авто в Оплата от покупателя платежной картой выгружаете? Если по нормальному работать, то из Чеков на оплату по плат. картам надо. Просто у нас так исторически сложилось...
|
|||
28
Mikhail Volkov
10.09.19
✎
17:19
|
А где задатся НомерВариантаПоиска? В основном у меня поиск по номеру и дате документа. Но Номер может не указан, пустой в Источнике, тогда поиск по полям: Организация, Контрагент, СуммаДокумента, Дата. Прописал:
Если НомерВариантаПоиска = 1 Тогда СтрокаИменСвойствПоиска = "Номер, Дата"; Иначе СтрокаИменСвойствПоиска = "Организация, Контрагент, СуммаДокумента, Дата"; КонецЕсли; не ищет... Может условие НомерВариантаПоиска = 1 заменить на Не ПустаяСтрока(СвойстваПоиска["Номер"]), или как правильно? |
|||
29
Mikhail Volkov
10.09.19
✎
18:28
|
Вот так заработало:
Если Не ПустаяСтрока(СвойстваПоиска["Номер"]) Тогда СтрокаИменСвойствПоиска = "Номер, Дата"; Иначе СтрокаИменСвойствПоиска = "Организация, Контрагент, СуммаДокумента"; КонецЕсли; Но без Дата (не стоит галочка: "Поиск по дате на равенство") поиск рискован!? Может найтись документ оплаты от этого же клиента, на ту же Сумму, но раньше (может в прошлом году). Интересно, в каком направлении идет поиск? Если с конца, то ладно... |
|||
30
d4rkmesa
10.09.19
✎
18:52
|
(27) Ну да, чеков тогда у заказчика вроде не было.
(29) Думаю, проще написать свой запрос поиска в том же обработчике, если по (28) не ищет. |
|||
31
Mikhail Volkov
10.09.19
✎
19:12
|
(30) Это (29) в ПКО_СтрокаВыпискиЭквайринг_ПоследовательностьПолейПоиска. А как написать свой запрос поиска? Любой для примера, с поиском по дате в пределах дня (без времени)?
|
|||
32
d4rkmesa
10.09.19
✎
19:21
|
(31) Примерно так в обработчике ...ПоследовательностьПолейПоиска :
Если НомерВариантаПоиска = 1 Тогда СтрокаИменСвойствПоиска = "Дата,Организация,Контрагент,ДоговорКонтрагента,СуммаДокумента"; ИначеЕсли НомерВариантаПоиска = 2 Тогда СтрокаИменСвойствПоиска = "Дата,Организация,Контрагент,СуммаДокумента"; ИначеЕсли НомерВариантаПоиска = 3 Тогда //Дата могла измениться, поэтому повторяем поиск подходящих документов в пределах дня ТекКонтрагент = СвойстваПоиска.Получить("Контрагент"); ТекДата = СвойстваПоиска.Получить("Дата"); Если ЗначениеЗаполнено(ТекКонтрагент) И ЗначениеЗаполнено(ТекДата) Тогда ЗапросПоискРеализации = Новый Запрос; ЗапросПоискРеализации.Текст = "ВЫБРАТЬ |РеализацияТоваров.Ссылка | ИЗ |Документ.РеализацияТоваровУслуг КАК РеализацияТоваров | ГДЕ | НАЧАЛОПЕРИОДА(РеализацияТоваров.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) | И РеализацияТоваров.Контрагент = &Контрагент | И РеализацияТоваров.Организация = &Организация | И РеализацияТоваров.СуммаДокумента = &СуммаДокумента"; ЗапросПоискРеализации.УстановитьПараметр("Дата", ТекДата); ЗапросПоискРеализации.УстановитьПараметр("Организация", СвойстваПоиска.Получить("Организация")); ЗапросПоискРеализации.УстановитьПараметр("Контрагент", ТекКонтрагент); ЗапросПоискРеализации.УстановитьПараметр("СуммаДокумента", СвойстваПоиска.Получить("СуммаДокумента")); Выборка = ЗапросПоискРеализации.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда СсылкаНаОбъект = Выборка.Ссылка; КонецЕсли; КонецЕсли; КонецЕсли; |
|||
33
Mikhail Volkov
10.09.19
✎
20:54
|
(32) Вместо СтрокаИменСвойствПоиска находим СсылкаНаОбъект?
|
|||
34
Mikhail Volkov
11.09.19
✎
10:45
|
Сделал так:
Если ПустаяСтрока(СвойстваПоиска["Номер"]) Тогда // СтрокаИменСвойствПоиска = "Организация, Контрагент, СуммаДокумента"; //+МВ еще бы Дата без времени Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | ОплатаОтПокупателяПлатежнойКартой.Ссылка |ИЗ | Документ.ОплатаОтПокупателяПлатежнойКартой КАК ОплатаОтПокупателяПлатежнойКартой |ГДЕ | ОплатаОтПокупателяПлатежнойКартой.Дата МЕЖДУ &НачДата И &КонДата | И ОплатаОтПокупателяПлатежнойКартой.Организация = &Организация | И ОплатаОтПокупателяПлатежнойКартой.Контрагент = &Контрагент | И ОплатаОтПокупателяПлатежнойКартой.СуммаДокумента = &СуммаДокумента"; Запрос.УстановитьПараметр("НачДата", НачалоДня(СвойстваПоиска.Получить("Дата"))); Запрос.УстановитьПараметр("КонДата", КонецДня(СвойстваПоиска.Получить("Дата"))); Запрос.УстановитьПараметр("Организация", СвойстваПоиска.Получить("Организация")); Запрос.УстановитьПараметр("Контрагент", СвойстваПоиска.Получить("Контрагент")); Запрос.УстановитьПараметр("СуммаДокумента", СвойстваПоиска.Получить("СуммаДокумента")); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда СсылкаНаОбъект = Выборка.Ссылка; КонецЕсли; Иначе СтрокаИменСвойствПоиска = "Номер, Дата"; КонецЕсли; Вроде работает. Спс. В вашем примере используется НомерВариантаПоиска. А где он задается? Или не задается, а если по 1-му варианту ничего не найдено, ищет по 2-му, по 3-му... и т.д.? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |