|   |   | 
| 
 | КД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-му... и т.д.? | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |