Клиент-банк, поиск плательщиков по назначению платежа

Программирование - Практика программирования

Решение задачи рассмотрим на примере загрузки и разнесения банковской выписки по договорам и контрагентам из текста назначения платежа.

Условия задачи: В назначении платежа в произвольном месте есть номер лицевого счета, Задача состоит в том чтобы найти номер и по нему определить плательщика и его договор.

  1. Назначение платежа - произвольный текст..
  2. Лицевые счета - Справочник связанный через регистр сведений с договорами контрагентов. Наименование - номер лицевого счета.

Решение: Неизвестно  ГДЕ  в тексте назначения платежа располагается номер лицевого счета, но известно ЧТО имено может быть номером лицевого счета, это одно из наименований справочника Лицевые счета, Т.е. решение задачи сводиться к поиску вхождения номера в текст назначения платежа. Для этого можно использовать перебор, а можно запрос из двух таблиц с условием связи ПОДОБНО, первая таблица - Номера лицевых счетов, вторая - Назначения платежа.  

 Пример с использованием запроса в конфигурации 1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК, редакция 3.0 

&НаСервере
Процедура ДляКнопкиРасширенияОбработкиКлиентБанкНаСервере()
	
    //Таблица с номерами ЛС
    //Убираем лишние пробелы в наименовании ЛС и получаем длину номера ЛС.
    //Номера ЛС уникальны, но возможна ситуация когда более короткий ЛС может 
    //встретиться в более длинном. В  такой ситуации запрос свяжет назначение с несколькими ЛС,
    //правильным считаем тот у которого длина больше

	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	КВП_ЛицевыеСчета.Наименование КАК НаименованиеБезПробелов,
	|	КВП_ЛицевыеСчета.Ссылка КАК ЛицевойСчет,
	|	0 КАК ДлинаНаменования
	|ИЗ
	|	Справочник.КВП_ЛицевыеСчета КАК КВП_ЛицевыеСчета";    
	
	ТаблицаЛСБезПобелов = Запрос.Выполнить().Выгрузить();
	
	Для Каждого Строка Из ТаблицаЛСБезПобелов Цикл
		Строка.НаименованиеБезПробелов = СокрЛП(Строка.НаименованиеБезПробелов);
		Строка.ДлинаНаменования        = СтрДлина(Строка.НаименованиеБезПробелов);
	КонецЦикла;	

	
    // Таблица Назначения платежа
	ТаблицаВыписки = ДокументыКИмпорту.Выгрузить(,"СуммаПоступило,НазначениеПлатежа,ИдентификаторОперации");
	
	//Сам запрос поиска номеров ЛС в назначениях платежа	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ТаблицаВыписки.СуммаПоступило,
	|	ТаблицаВыписки.НазначениеПлатежа,
	|	ВЫРАЗИТЬ(ТаблицаВыписки.ИдентификаторОперации КАК СТРОКА(6)) КАК ИдентификаторОперации
	|ПОМЕСТИТЬ ВТ_Выписка
	|ИЗ
	|	&ТаблицаВыписки КАК ТаблицаВыписки
	|ГДЕ
	|	ТаблицаВыписки.СуммаПоступило > 0
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТаблицаЛСБезПобелов.ЛицевойСчет,
	|	ТаблицаЛСБезПобелов.НаименованиеБезПробелов,
	|	ТаблицаЛСБезПобелов.ДлинаНаменования
	|ПОМЕСТИТЬ ВТ_ТаблицаЛСБезПобелов
	|ИЗ
	|	&ТаблицаЛСБезПобелов КАК ТаблицаЛСБезПобелов
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ДополнительныеСведения.Объект
	|ПОМЕСТИТЬ ВТ_КонтрагентыЗапретОбменаССайтом
	|ИЗ
	|	РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
	|ГДЕ
	|	ДополнительныеСведения.Свойство = &СвойствоЗапретОбменаСсайтом
	|	И ДополнительныеСведения.Значение = ИСТИНА
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	УПЖКХ_СведенияДляВзаиморасчетовПоЛССрезПоследних.Договор,
	|	УПЖКХ_СведенияДляВзаиморасчетовПоЛССрезПоследних.Контрагент,
	|	УПЖКХ_СведенияДляВзаиморасчетовПоЛССрезПоследних.ЛицевойСчет,
	|	ВТ_ТаблицаЛСБезПобелов.НаименованиеБезПробелов,
	|	ВТ_ТаблицаЛСБезПобелов.ДлинаНаменования
	|ПОМЕСТИТЬ ВТ_ЛС
	|ИЗ
	|	РегистрСведений.УПЖКХ_СведенияДляВзаиморасчетовПоЛС.СрезПоследних(
	|			,
	|			НЕ Контрагент В
	|					(ВЫБРАТЬ
	|						ВТ_КонтрагентыЗапретОбменаССайтом.Объект
	|					ИЗ
	|						ВТ_КонтрагентыЗапретОбменаССайтом КАК ВТ_КонтрагентыЗапретОбменаССайтом)) КАК УПЖКХ_СведенияДляВзаиморасчетовПоЛССрезПоследних
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТаблицаЛСБезПобелов КАК ВТ_ТаблицаЛСБезПобелов
	|		ПО УПЖКХ_СведенияДляВзаиморасчетовПоЛССрезПоследних.ЛицевойСчет = ВТ_ТаблицаЛСБезПобелов.ЛицевойСчет
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_Выписка.ИдентификаторОперации,
	|	ВТ_Выписка.НазначениеПлатежа,
	|	ВТ_ЛС.Договор,
	|	ВТ_ЛС.Контрагент,
	|	ВТ_ЛС.НаименованиеБезПробелов,
	|	ВТ_ЛС.ЛицевойСчет,
	|	ВТ_ЛС.ДлинаНаменования
	|ПОМЕСТИТЬ ВТ_РезультатСопостовления
	|ИЗ
	|	ВТ_Выписка КАК ВТ_Выписка
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЛС КАК ВТ_ЛС
	|		ПО (ВТ_Выписка.НазначениеПлатежа ПОДОБНО ""%"" + ВТ_ЛС.НаименованиеБезПробелов + ""%"")
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_РезультатСопостовления.ИдентификаторОперации,
	|	МАКСИМУМ(ВТ_РезультатСопостовления.ДлинаНаменования) КАК ДлинаНаменования
	|ПОМЕСТИТЬ ВТ_НужныеЛС
	|ИЗ
	|	ВТ_РезультатСопостовления КАК ВТ_РезультатСопостовления
	|
	|СГРУППИРОВАТЬ ПО
	|	ВТ_РезультатСопостовления.ИдентификаторОперации
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_НужныеЛС.ИдентификаторОперации,
	|	ВТ_РезультатСопостовления.НазначениеПлатежа,
	|	ВТ_РезультатСопостовления.Договор,
	|	ВТ_РезультатСопостовления.Контрагент,
	|	ВТ_РезультатСопостовления.НаименованиеБезПробелов,
	|	ВТ_РезультатСопостовления.ЛицевойСчет,
	|	ВТ_РезультатСопостовления.ДлинаНаменования
	|ИЗ
	|	ВТ_НужныеЛС КАК ВТ_НужныеЛС
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_РезультатСопостовления КАК ВТ_РезультатСопостовления
	|		ПО ВТ_НужныеЛС.ИдентификаторОперации = ВТ_РезультатСопостовления.ИдентификаторОперации
	|			И ВТ_НужныеЛС.ДлинаНаменования = ВТ_РезультатСопостовления.ДлинаНаменования";    
	
	ПВХМенеджер                 = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения;
	СвойствоЗапретОбменаСсайтом = ПВХМенеджер.НайтиПоНаименованию("Запретить обмен с сайтом (Контрагенты)");
	Запрос.УстановитьПараметр("СвойствоЗапретОбменаСсайтом", СвойствоЗапретОбменаСсайтом);
	Запрос.УстановитьПараметр("ТаблицаВыписки", ТаблицаВыписки);
	Запрос.УстановитьПараметр("ТаблицаЛСБезПобелов", ТаблицаЛСБезПобелов);

	ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
	
	Для каждого Строка Из ТаблицаРезультат Цикл
		
		Отбор = Новый Структура;
		Отбор.Вставить("ИдентификаторОперации", СокрЛП(Строка.ИдентификаторОперации));
		НайденныеСтроки = ДокументыКИмпорту.НайтиСтроки(Отбор);
		Если НайденныеСтроки.Количество() > 0 Тогда
			НайденныеСтроки[0].Контрагент  = Строка.Контрагент;
			НайденныеСтроки[0].Договор     = Строка.Договор;
			НайденныеСтроки[0].ВидОперации = Перечисления.ВидыОперацийПоступлениеДенежныхСредств.ОплатаПокупателя;
		КонецЕсли;
		
		//Скопировал штатную процедуру т.к. в штатной подбирается договор, а нам этого не нужно
		ДляРасширения_УточнитьХозяйственнуюОперациюДаннымиВведеннымиПользователем(НайденныеСтроки[0], "Контрагент,Договор,ВидОперации")
		
	КонецЦикла;	
	
	
КонецПроцедуры

 

Скачать файлы

Наименование Файл Версия Размер
Расширение для конфигурации  1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК, редакция 3.0.
.cfe 60,37Kb
29.08.17
0
.cfe 60,37Kb Скачать

См. также

Комментарии
1. Scott Linch (Scottlinch) 10 24.09.17 21:33 Сейчас в теме
А почему нельзя было воспользоваться регулярными выражениями? Ну скажем из вашего примера подошло бы что то "\s(\d{2}-\d{1,3}-\d{1,3}(-)?(\d{1})?)\s|\s(\d{2}-\d{1,3})\s". Разумеется я не знаю какие в принципе у Вас еще бывают л/с, но готов поспорить могу и к ним ключик подобрать =)
2. Александр Палий (duhh) 89 25.09.17 10:07 Сейчас в теме
(1) В том то и дело,. что я считаю, нет шаблона у л/с. Хотя кто знает, вот условия: длина произвольная, русские английские буквы, цифры. "-". Встречаются с пробелами. бывают похожие например 111, 111-2, к-111, кк-111-1. ss-ss-111-1. Более того в тексте могут указать номер квартиры, дома что тоже можно принять за л/с.
3. Scott Linch (Scottlinch) 10 25.09.17 23:33 Сейчас в теме
(2) согласен не очень приятный набор л/с. И с тем учётом что не всегда пробелы стоят до и после л/с дела плохи. А на сколько быстро работает ваш запрос?
4. Александр Палий (duhh) 89 26.09.17 10:06 Сейчас в теме
(3) На моих данных порядка 20-30 сек. Но главное то, что это ГОРАЗДО быстрей бухгалтера.
5. Scott Linch (Scottlinch) 10 26.09.17 11:38 Сейчас в теме
(4) 20-30 сек на какое количество платежей?
6. Александр Палий (duhh) 89 26.09.17 12:25 Сейчас в теме
(5) приблизительно 200 платежей, 7000 лс
7. Scott Linch (Scottlinch) 10 26.09.17 22:27 Сейчас в теме
ясно у нас 100 000 и 20 000 платежей по времени тоже 1 минуту ищем правда немного другим способом. У Вас очень правильный и интересный способ.
Оставьте свое сообщение