Добрый день!
Я тут немного занялся автоматизацией импорта банковских выписок в 1С (1С:Предприятие 7.70.027, конфа - БухУч для Украины 7.70.318).
В общем, обработку-переходничок для своего банка дописал (немного нестандартный формат данных был).
Немного повозился с ClientBank.ert и всё заработало.
Контрагенты подтягиваются, а если нет в базе, создаются. Проводки в 97% случаев верные получаются на выходе.
И, вроде бы, все отлично, но я слишком ленив, чтобы к каждой строчке выписки в графе "Заказ" выбирать нужный договор из списка.
Так что начал парсер внутри ClientBank.ert...
Большинство договоров имеют номер документа типа ***/СД, от этого и оттолкнулся для начала.
Вот код (первый вариант):
//ОТБОР ЗАКАЗОВ - ПАРСЕР
ВхСтр = тВыписка.Содержание;
// проверяем, не вписал ли бухгалтер английскую буковку "С";-)
Если Найти(Врег(ВхСтр),Врег("/СД"))>0 Тогда
СодержНачСимвДог=Найти(Врег(ВхСтр),Врег("/СД"))
Иначе
СодержНачСимвДог=Найти(Врег(ВхСтр),Врег("/CД"))
КонецЕсли;
Сообщить("");
Сообщить(ВхСтр);
Если СодержНачСимвДог = 0 Тогда
СодержДог= "";
Сообщить("Увы, договор в содержании платежа не найден. Хотя, может, его там и нет просто");
Иначе
СодержДог = СокрЛП(СтрЗаменить(Сред(ВхСтр,СодержНачСимвДог-3,6),"№",""));
Сообщить("ЕСТЬ! Найден договор: "+СодержДог);
КонецЕсли;
ВхСтр=СтрЗаменить(ВхСтр," ",РазделительСтрок);
Для пц=1 По СтрКоличествоСтрок(ВхСтр) Цикл
ТекСтр=СтрПолучитьСтроку(ВхСтр,пц);
ТекДата=Дата(ТекСтр);
Если (ПустоеЗначение(ТекДата)<>1) Тогда
Сообщить("Нашли дату: "+ТекДата);
СодержДатаДог=ТекДата;
ДокЗкз = СоздатьОбъект("Документ.Договор");
Если (ДокЗкз.НайтиПоНомеру(СодержДог,СодержДатаДог) = 1) Тогда
Сообщить(ДокЗкз.ПолучитьАтрибут("Контрагент"));
Сообщить(тВыписка.Контрагент);
Если СокрЛП(ДокЗкз.ПолучитьАтрибут("Контрагент")) = СокрЛП(тВыписка.Контрагент) Тогда
Док.Заказ = ДокЗкз.ТекущийДокумент();
сообщить(Док.Заказ);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//ОТБОР ЗАКАЗОВ - ПАРСЕР
А что если:
1. Смотреть в задолженность в разрезе договоров, если задолженность только по 1-му договору - то подставлять только его независимо от того что написано в назначении.
2. Предоплату искать по Вашему алгоритму по вхождению "попередня", "предоплата" в строке без пробелов с поиском по номеру договора;
3. Попробовать вычислить "просроченную" задолженность по договорам, ведь может быть 1 платеж по нескольким и распределить сумму по ним.
В любом случае, оплата может быть и согласно счета, и как пример "за медикаменти та вироби медичного призначення" без указания № договора или счета, и еще как угодно, залезет 1 строчкой в выписку, а разделить нужно на несколько.
Мои бухи все правят ручками, привыкли наверное, подобного не просили (а может просили, только им когда-то вежливо отказали)
Redneck @ 22.07.16, 11:59 http://pro1c.org.ua/index.php?act=findpost&pid=114735: 1
Sharzem @ 22.07.16, 12:47 http://pro1c.org.ua/index.php?act=findpost&pid=114738,
Большое спасибо за совет. Я уже "перелопатил" с нуля почти алгоритм.
По сути, теперь отошел от необходимости искать отдельно даты и номера договоров.
Удаляю все пробелы в назначении платежа и в получившейся строке перебираю все договора с контрагентом (НомДог и ДатаДог) в ОБРАТНОМ порядке.
Результаты пока очень порадовали. Примерно 9 из 10 цепляет отлично.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua