Имя: Пароль:
1C
1С v8
КД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-му... и т.д.?
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.