Автоматическое разнесение платежей по заказам/счетам на примере УТ 10.3 (алгоритм)

24.12.15

Разработка - Математика и алгоритмы

Для анализа заказов - их выполнения, оплаты - требуется сопоставление поступающих платежей с выставленными счетами или заказами. Вручную - долго, особенно если имеем дело с большим количеством входящих документов. Расскажу, что делаем мы у себя в организации и предлагаем другим.

Рассматривать алгоритм буду на примере Управление торговлей 10.3, механизм можно внедрить практически в любую из типовых конфигураций. Дано:

  • большое количество счетов/заказов 
  • большое количество входящих платежей (оптимистично, да). Это могут быть Платежки, ПКО и прочие приходные документы.

Необходимо автоматически сопоставить платежи с выставленными счетами и указать их в платежных поручениях входящих (или попытаться это сделать).

Начнем с состава метаданных. Для указания такого соответствия в входящих платежных документах существует отдельная табличная часть - РасшифровкаПлатежа, где в строках проставляется, к каким документам этот платеж относится, и делится сумма платежа на составляющие.

На форме таких документов - есть переключатель Без разбиения/Списком - который, по сути, только переключает внешнее представление этой табличной части. В случае выбора варианта Без разбиения - мы работаем только с первой строкой данной табличной части. В случае выбора второго варианта - имеем дело со всей таблицей.

При поступлении платежа по банку, нам доступны для анализа несколько реквизитов. Это - Контрагент, Договор контрагента, Сумма, Назначение платежа (текстовый комментарий при оформлении платежки). Будем их использовать!

Сразу отмечу - можно сделать автоматическое разнесение минимум двумя способами - обработка, которая будет анализировать все поступающие платежи за период, в дальнейшем можно это поместить в регламентное задание. Второй способ - влезем в модуль документов, процедуру ПриЗаписи - способ менее хорош, потому что задействуем изменение конфигурации.

В данной статье рассмотрим второй способ - он проще и нагляднее, как мне кажется, а привести его к первому варианту не составит большого труда.

Итак. Рассмотрим поступление Платежного поручения входящего (ППВ). Обычно их загружают из клиент-банка, реже вводят вручную. Все необходимые нам реквизиты (повторю - это Контрагент, Договор, Сумма, Назначение) вводятся в ППВ. Теперь нам необходимо проанализировать имеющуюся информацию и попытаться найти один или несколько необходимых счетов.

Анализировать предлагаю в процедуре модуля ПередЗаписью - вызывается перед записью и соответственно перед проведением документа и позволит нам заполнить табличную часть РасшифровкаПлатежа.

Для начала проанализируем, может, мы уже указали соответствующий заказ и ничего делать не требуется. Критериев может быть несколько - заполнены ли все строки в РасшифровкеПлатежа, заполнена ли первая строка в этой ТЧ. Как показала практика, достаточно анализа первой строки:

если не ЗначениеЗаполнено(РасшифровкаПлатежа[0].Сделка) тогда

делаем дальше. Для хранения соответствия нам нужна таблица значений, которую мы потом перенесем в ТЧ.

	тзн = новый ТаблицаЗначений;
	тзн.Колонки.Добавить("Счет");
	тзн.Колонки.Добавить("Сумма");
	тзн.Колонки.Добавить("ДатаСчета");

Теперь разбираем Назначение платежа и пытаемся вытащить полезную для нас информацию, которая поможет найти необходимые счета или заказы. Проходим последовательно каждые 10 символов в Назначении и проверяем, не дата ли это. Если дата, то добавляем информацию в нашу новую таблицу значений. Прогоняем два раза - иногда бухгалтеры пишут год в полном формате - "2015", а иногда просто "15". Будем искать фрагменты вида ХХ.ХХ.ХХХХ и ХХ.ХХ.ХХ. В конце проверяем - корректная ли найденная дата. При желании можно самостоятельно оптимизировать код для одного прогона цикла.

		назн = НазначениеПлатежа;
		для к = 1 по стрдлина(назн) - 10 цикл
			ск = СтрЗаменить(сред(назн, к,10),"/",".");
			дт = сред(ск,7,4)+сред(ск,4,2)+лев(ск,2);
			если лев(дт,2) <> "20" тогда
				продолжить;
			конецесли;
			
			ндт = дата(2000,1,2);
			попытка
				ндт = дата(дт);
			исключение
			конецпопытки;
			
			если ндт <> дата(2000,1,2) и ндт <= дата+24*60*60 тогда
				новстр = тзн.Добавить();
				новстр.датасчета = ндт;
			конецесли;
		конеццикла;
		
		
		для к = 1 по стрдлина(назн) - 10 цикл
			ск = СтрЗаменить(сред(назн, к,8),"/",".");
			дт = "20"+сред(ск,7,2)+сред(ск,4,2)+лев(ск,2);
			
			ндт = дата(2000,1,2);
			попытка
				ндт = дата(дт);
			исключение
			конецпопытки;
			
			если ндт <> дата(2000,1,2) и ндт <= дата+24*60*60 тогда
				новстр = тзн.Добавить();
				новстр.датасчета = ндт;
			конецесли;
		конеццикла;

 Даты, когда выставлены счета, мы нашли. Теперь проанализируем, есть ли в базе такие счета, и совпадёт ли их сумма с суммой платежа. Если совпадет - бинго! - мы заполнили расшифровку платежа

		нашли = ложь;
		для каждого стр из тзн цикл
			сч = Документы.СчетНаОплатуПокупателю.Выбрать(НачалоДня(стр.ДатаСчета), КонецДня(стр.ДатаСчета), новый структура("Контрагент", Контрагент));
			если сч.Следующий() тогда
				стр.счет = сч.ссылка;
				стр.сумма = сч.СуммаДокумента;
			конецесли;
			сч = Документы.ЗаказПокупателя.Выбрать(НачалоДня(стр.ДатаСчета), КонецДня(стр.ДатаСчета), новый структура("Контрагент", Контрагент));
			если сч.Следующий() тогда
				стр.счет = сч.ссылка;
				стр.сумма = сч.СуммаДокумента;
			конецесли;
		конеццикла;
		
		если СуммаДокумента = тзн.итог("Сумма") тогда
			расшифровкаплатежа.очистить();
			для каждого стр из тзн цикл
				новстр = РасшифровкаПлатежа.Добавить();
				новстр.ДоговорКонтрагента = ДоговорКонтрагента;
				новстр.КратностьВзаиморасчетов = 1;
				новстр.КурсВзаиморасчетов = 1;
				новстр.СуммаВзаиморасчетов = стр.сумма;
				новстр.СуммаПлатежа = стр.сумма;
				новстр.сделка = стр.счет;
			конеццикла;
		конецесли;

Таким образом, как показывает практика, мы сможем заполнить около 80% входящих платежек и как минимум освободим много времени у нашего бухгалтера. Договор при поиске мы не используем, в случае неправильного указания в клиент-банке подходящего договора, мы не сможем найти необходимые счета. Можно вывести предупреждение о разных договорах в найденных счетах и в самом платежном поручении.

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

 Список платежных поручений

В качестве дополнения - можно научить определять программу месяц в дате по названию - январь, февраль... но на практике такое случается достаточно редко, не увидел необходимости.

Всем спасибо за внимание! Будут предложения по алгоритму - с удовольствием выслушаю :) 

См. также

Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Автоматизация учета ЕГАИС в 1С для оптовой торговли, производства и импорта. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

828 руб.

15.12.2015    171808    840    368    

404

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 1C:Бухгалтерия 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Забудьте о ручном вводе: загружайте документы из Excel в 1С за секунды! Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С.

6000 5100 руб.

09.11.2016    238805    1086    906    

1022

SALE! 10%

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

55778 50200 руб.

24.04.2015    196254    155    244    

284

Управление взаимоотношениями с клиентами (CRM) Оптовая торговля Розничная торговля Пользователь Платформа 1С v8.3 Оперативный учет Управляемые формы 1С:Управление торговлей 10 1С:Розница 2 Россия Управленческий учет Платные (руб)

Подсистема призвана упростить и автоматизировать процесс расчета и начисления бонусов покупателей. Бонусная система работает с конфигурациями 1С:УТ 10.3, 1С:Розница. Механизм реализован в начале 2013г. и работает до сих пор с постоянными совершенствованиями.

30000 руб.

02.11.2015    113176    102    88    

185

Оптовая торговля Производство готовой продукции (работ, услуг) Обмен с ГосИС Программист Бухгалтер Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Оптовая торговля, дистрибуция, логистика Пищевая промышленность Россия Бухгалтерский учет Платные (руб)

Автоматический обмен данными с системой ФГИС Меркурий из 1С через ВетИС API: загрузка данных по хозяйствующим субъектам, предприятиям; типов, групп, видов, наименований продукции, сопоставление данных и запись их в базу данных; создание на основании расходных документов транспортных партий, отправка на сервер, печать полученных ветеринарных свидетельств, запрос остатков складского журнала, проведение инвентаризаций, оформление производственных партий.

11500 руб.

08.12.2017    105252    238    110    

147
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. insurgut 208 24.12.15 11:47 Сейчас в теме
Плохая затея за назначение платежа цепляться конечно. Не всегда оно заполняется. В разрезе контрагента/договора достаточно по фифо разносить оплаты - конечно же ведение взаиморасчетов по договору в целом должно быть. Для этого достаточно вызывать стандартный алгоритм разнесения платежа с указанной в платежке суммой и признаком не превышать его (алгоритм кнопки Заполнить при редактировании платежа списком).

P.S. Ведение взаиморасчетов по заказам - зло. В подавляющем большинстве случаев менеджеры даже не понимают для чего это надо.
2. ik-mercury 7 24.12.15 12:08 Сейчас в теме
(1) insurgut, зло, да. Поэтому мы, лично, ведем все взаиморасчеты по договору в целом. а такое разнесение используем в дальнейшем, чтоб клиенту оперативно напомнить что у него не оплачен такой то счет, на такие то товары/услуги, а не просто сказать сумму задолженности.
7. VoffkaIT 02.08.18 10:55 Сейчас в теме
(2) Здравствуйте. А можете сказать куда точно нужно вставить ниженаписанное?
\
3. popenko 24.12.15 17:46 Сейчас в теме
а у нас за правильность взаиморасчетов отвечает бухгалтер- и ведет по счетам и автор молодец (без юмора). и потом если платеж клиент "потерял" очень легко находим
4. V.Nikonov 121 30.12.15 17:24 Сейчас в теме
При ведении учета ПоЗаказам - легко анализируются ситуации с отсрочкой платежа (в ЗаказеПокупателя есть реквизит СрокОплаты). Для Договоров по Договору... можно использовать Дату документа долга и отсрочку в договоре.
На основе прогнозируемой ДатыОплаты можно строить Лист получения денег... Сортировать Заказы по очередности оплаты... и т.д. в т.ч. распределять не только по Заказам но и по Договорам.
Однако решение - распределять ли сумму по Заказам или НЕ распределять должен принимать человек индивидуально по каждому поступлению денег! Для Банка удобно подправить 1СКлиентБанк (сделать внешней обработкой).
5. user902158 26.06.18 15:11 Сейчас в теме
Добрый день.
Как писали выше добавил данный код в Модуль ПередЗаписью


Вылетает ошибка "Ошибка при вызове метода контекста (Выбрать) "

Ниже прикрепил скриншот с ошибкой, прошу помочь в решении проблемы.
За ранее благодарен за помощь.
Прикрепленные файлы:
6. VoffkaIT 02.08.18 09:13 Сейчас в теме
(5) Здравствуйте! Решили проблему? Куда нужно вставить?
8. VoffkaIT 02.08.18 11:10 Сейчас в теме
(5) Ау, помогите, куда нужно вставить этот код?
9. VoffkaIT 02.08.18 14:08 Сейчас в теме
{Документ.ПлатежноеПоручениеВходящее.МодульОбъекта(470,1)}: Ожидается ключевое слово 'КонецЕсли' ('EndIf') - что сделать ? ХЕЛП
10. vikb11 24.08.21 15:45 Сейчас в теме
(9) добавить его в самом конце!
Оставьте свое сообщение