Кирилкин Дмитрий | Ведущий разработчик | Торговая сеть Реми

«Scrum - серебряной пули не существует»

В своем докладе я хотел бы осветить практический опыт использования Scrum в команде из 5 разработчиков 1С. Ранее никто из участников команды не сталкивался в своей работе со Scrum. Для всех разработчиков это был новый опыт и новые вызовы. Тезисы: Предпосылки, явившиеся катализатором перехода на использование Scrum. Scrum наши ожидания после ознакомления с методологией. Заманчивые "Делать в два раза больше за половину времени..." Популяризация Scrum в команде, как это было. Владелец продукта и Scrum мастер где их взять или вы работаете во внутреннем отделе разработки. События Scrum (Ежедневные собрания, ретроспектива и обзор спринта). Поход к работе с задачами спринты, эпики, пользовательские истории и оценка задач. Что получилось, а что нет. Программное обеспечение, что и как используем. К чему мы пришли через год после начала работы по Scrum. Что дал нам Scrum. Оправдались ли ожидания.

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

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

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

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

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

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

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

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

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

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

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

 

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

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

См. также

Комментарии
Сортировка: Древо
1. 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 105 25.09.17 10:07 Сейчас в теме
(1) В том то и дело,. что я считаю, нет шаблона у л/с. Хотя кто знает, вот условия: длина произвольная, русские английские буквы, цифры. "-". Встречаются с пробелами. бывают похожие например 111, 111-2, к-111, кк-111-1. ss-ss-111-1. Более того в тексте могут указать номер квартиры, дома что тоже можно принять за л/с.
3. Scottlinch 10 25.09.17 23:33 Сейчас в теме
(2) согласен не очень приятный набор л/с. И с тем учётом что не всегда пробелы стоят до и после л/с дела плохи. А на сколько быстро работает ваш запрос?
4. duhh 105 26.09.17 10:06 Сейчас в теме
(3) На моих данных порядка 20-30 сек. Но главное то, что это ГОРАЗДО быстрей бухгалтера.
5. Scottlinch 10 26.09.17 11:38 Сейчас в теме
(4) 20-30 сек на какое количество платежей?
6. duhh 105 26.09.17 12:25 Сейчас в теме
(5) приблизительно 200 платежей, 7000 лс
7. Scottlinch 10 26.09.17 22:27 Сейчас в теме
ясно у нас 100 000 и 20 000 платежей по времени тоже 1 минуту ищем правда немного другим способом. У Вас очень правильный и интересный способ.
8. user902158 07.06.18 17:07 Сейчас в теме
Добрый день.
Извините за тупой вопрос, я немного не понял куда этот код воткнуть и что должно произойти по нажатию кнопки ?
9. duhh 105 08.06.18 09:21 Сейчас в теме
(8)Воткнуть можно в обработку "КлинтБанк". Идея такая, сначала в обработке загружается файл из банка, а потом по нажатию кнопки по назначениям платежа подбираются плательщики (контрагенты, договоры), далее штатными средствами формируются документы. Можно скачать расширение и подключить к своей конфе.
10. user902158 09.06.18 13:40 Сейчас в теме
Добавил в обработку "Клиент-Банк" Этот код убрал все ошибки, но вот с одной бьюсь уже второй день может кто подскажет где я туплю ?

Вот код ошибки:
ВнешняяОбработка.КлиентБанк.Форма.Форма.Форма(155,3)}: Процедура или функция с указанным именем не определена (ДляРасширения_УточнитьХозяйственнуюОперациюДаннымиВведенными­Пользователем)
<<?>>ДляРасширения_УточнитьХозяйственнуюОперациюДаннымиВведенны­миПользователем(НайденныеСтроки[0], "Контрагент,Договор,ВидОперации") (Проверка: Толстый клиент (обычное приложение))
11. duhh 105 09.06.18 15:27 Сейчас в теме
(10) Два мало, нужно биться как минимум три, а потом если усилия не приведут к результату, добавить эту процедуру

&НаСервере
Процедура ДляРасширения_УточнитьХозяйственнуюОперациюДаннымиВведенными­Пользователем(СтрокаДокументыКИмпорту, ИменаВведенныхДанных)
	
	Если ЗначениеЗаполнено(СтрокаДокументыКИмпорту.Документ) Тогда
		// Если есть документ, то хозяйственная операция не определена,
		// поэтому создадим и заполним её полностью.
		// Это нужно для того, чтобы при загрузке документ перезаполнился
		ВведенныеДанные = Новый Структура("Контрагент,ВидОперации,СчетКонтрагента,Договор,СтатьяДДС");
	Иначе
		ВведенныеДанные = Новый Структура(ИменаВведенныхДанных);
	КонецЕсли;
	ЗаполнитьЗначенияСвойств(ВведенныеДанные, СтрокаДокументыКИмпорту);
	
	// Приведем ВведенныеДанные в соответствие ХозяйственнаяОперация
	Если ВведенныеДанные.Свойство("ВидОперации") Тогда
		ВидОперацииДокумента = ВведенныеДанные.ВидОперации;
		ВведенныеДанные.Удалить("ВидОперации");
		ВведенныеДанные.Вставить("ВидОперацииДокумента", ВидОперацииДокумента);
	КонецЕсли;
	Если ВведенныеДанные.Свойство("Договор") Тогда
		ДоговорДокумента = ВведенныеДанные.Договор;
		ВведенныеДанные.Удалить("Договор");
		ВведенныеДанные.Вставить("ДоговорКонтрагента", ДоговорДокумента);
	КонецЕсли;
	Если ВведенныеДанные.Свойство("СчетКонтрагента") Тогда
		СчетКонтрагентаДокумента = ВведенныеДанные.СчетКонтрагента;
		ВведенныеДанные.Удалить("СчетКонтрагента");
		ВведенныеДанные.Вставить("БанковскийСчетКонтрагента", СчетКонтрагентаДокумента);
	КонецЕсли;
	Если ВведенныеДанные.Свойство("СтатьяДДС") Тогда
		СтатьяДДСДокумента = ВведенныеДанные.СтатьяДДС;
		ВведенныеДанные.Удалить("СтатьяДДС");
		ВведенныеДанные.Вставить("СтатьяДвиженияДенежныхСредств", СтатьяДДСДокумента);
	КонецЕсли;
	
	РаспознанныеДанныеИзБанка = ПолучитьИзВременногоХранилища(АдресХранилищаРаспознанныеДанныеИзБанка);
	
	ХозяйственнаяОперация = ЗагрузкаВыпискиПоБанковскомуСчету.УточнитьХозяйственнуюОперациюДаннымиВведеннымиПользователем(
		ВведенныеДанные,
		СтрокаДокументыКИмпорту.ИдентификаторВыписки,  // Идентифицируют выписку в РаспознанныеДанныеИзБанка
		СтрокаДокументыКИмпорту.ИдентификаторОперации, // Идентифицируют операцию в РаспознанныеДанныеИзБанка
		РаспознанныеДанныеИзБанка,
		НастройкиЗагрузки());
		
	//Палий вернем договор найденный по ЛС	
	ХозяйственнаяОперация.Вставить("ДоговорКонтрагента", СтрокаДокументыКИмпорту.Договор);
	
	АдресХранилищаРаспознанныеДанныеИзБанка = ПоместитьВоВременноеХранилище(РаспознанныеДанныеИзБанка, АдресХранилищаРаспознанныеДанныеИзБанка);
	
	ЗаполнитьСтрокуПоХозяйственнойОперации(РаспознанныеДанныеИзБанка, СтрокаДокументыКИмпорту, ХозяйственнаяОперация);
	
	РазместитьПредупреждение(СтрокаДокументыКИмпорту);
	ПодготовитьОтображениеПредупреждений(СтрокаДокументыКИмпорту, Объект.СоздаватьНенайденныеЭлементы);
	
КонецПроцедуры
Показать
user902158; +1 Ответить
12. user902158 20.06.18 12:58 Сейчас в теме
Появилось время заняться этим вопросом, добавил процедуру, но теперь вот такая ошибка. Я раньше не сталкивался с <wbr> если ставлю скобку как просит то другая ошибка.

{ВнешняяОбработка.КлиентБанк.МодульОбъекта(101,70)}: Ожидается символ '('
Процедура ДляРасширения_УточнитьХозяйственнуюОперациюДаннымиВведенным<­<?>> <wbr>иПользователем(СтрокаДокументыКИмпорту, ИменаВведенныхДанных)экспорт (Проверка: Толстый клиент (обычное приложение))

{ВнешняяОбработка.КлиентБанк.МодульОбъекта(101,71)}: Ожидается имя формального параметра
Процедура ДляРасширения_УточнитьХозяйственнуюОперациюДаннымиВведенным(<<?>><wbr>иПользователем(СтрокаДокументыКИмпорту, ИменаВведенныхДанных)экспорт (Проверка: Толстый клиент (обычное приложение))
Прикрепленные файлы:
13. duhh 105 20.06.18 14:26 Сейчас в теме
14. user902158 20.06.18 16:47 Сейчас в теме
Спасибо за помощь =)
Правда появилась куча других ошибок, но с ними я постараюсь сам разобраться.


{ВнешняяОбработка.КлиентБанк.МодульОбъекта(135,63)}: Переменная не определена (АдресХранилищаРаспознанныеДанныеИзБанка)
РаспознанныеДанныеИзБанка = ПолучитьИзВременногоХранилища(<<?>>АдресХранилищаРаспознанныеДанныеИзБанка); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(137,29)}: Переменная не определена (ЗагрузкаВыпискиПоБанковскомуСчету)
ХозяйственнаяОперация = <<?>>ЗагрузкаВыпискиПоБанковскомуСчету.УточнитьХозяйственнуюОперациюДаннымиВведеннымиПользователем( (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(152,67)}: Переменная не определена (Объект)
ПодготовитьОтображениеПредупреждений(СтрокаДокументыКИмпорту, <<?>>Объект.СоздаватьНенайденныеЭлементы); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(2534,52)}: Переменная не определена (ДокументыКВыгрузке)
Запрос.УстановитьПараметр("ДокументыКВыгрузкеТЗ", <<?>>ДокументыКВыгрузке); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(2540,3)}: Переменная не определена (ДокументыКВыгрузке)
<<?>>ДокументыКВыгрузке[Выборка.НомерСтроки - 1].ЗаявкаНаРасходованиеДенежныхСредств = (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(2742,10)}: Переменная не определена (ДокументыКВыгрузке)
Возврат <<?>>ДокументыКВыгрузке.НайтиСтроки(Отбор); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(142,9)}: Процедура или функция с указанным именем не определена (НастройкиЗагрузки)
<<?>>НастройкиЗагрузки()); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(149,5)}: Процедура или функция с указанным именем не определена (ЗаполнитьСтрокуПоХозяйственнойОперации)
<<?>>ЗаполнитьСтрокуПоХозяйственнойОперации(РаспознанныеДанныеИзБанка, СтрокаДокументыКИмпорту, ХозяйственнаяОперация); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(151,5)}: Процедура или функция с указанным именем не определена (РазместитьПредупреждение)
<<?>>РазместитьПредупреждение(СтрокаДокументыКИмпорту); (Проверка: Толстый клиент (обычное приложение))
{ВнешняяОбработка.КлиентБанк.МодульОбъекта(152,5)}: Процедура или функция с указанным именем не определена (ПодготовитьОтображениеПредупреждений)
<<?>>ПодготовитьОтображениеПредупреждений(СтрокаДокументыКИмпорту, Объект.СоздаватьНенайденныеЭлементы); (Проверка: Толстый клиент (обычное приложение))
Оставьте свое сообщение