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