Автоматическое разнесение платежей по заказам/счетам на примере УТ 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% входящих платежек и как минимум освободим много времени у нашего бухгалтера. Договор при поиске мы не используем, в случае неправильного указания в клиент-банке подходящего договора, мы не сможем найти необходимые счета. Можно вывести предупреждение о разных договорах в найденных счетах и в самом платежном поручении.

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

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

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

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

См. также

SALE! 20%

Автоматический заказ поставщику в 1С: загрузка прайсов и анализ цен поставщиков для УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2

Бюджетирование и планирование Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

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

28500 22800 руб.

21.04.2017    90161    105    39    

190

ЕГАИС++. Опт, производство, импорт

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

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 руб.

15.12.2015    165949    679    362    

385

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

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

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

104000 руб.

18.03.2019    110319    34    114    

178

Обмен с системой Меркурий через Web + Ветис.API для любых конфигураций (универсальная конфигурация Хамелеон Меркурий)

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

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий(тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

104000 руб.

08.11.2017    120853    296    138    

392

Простое ценообразование (установка цен номенклатуры) для 1С 8.3 (УТ 11 / ERP 2 / КА 2 / Розница 2) + (УТ 10.3 / УПП / КА 1 / Розница 1)

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

Есть проблемы с расчетом и установкой цен на товары? Универсальная подсистема для ценообразования в 1С поможет навести порядок с ценами! Механизм позволяет задавать произвольные правила расчета колонок цен для разных групп товаров и легко их изменять. Может автоматически (по расписанию) обновлять цены в 1С и выполнять проверку наличия и корректности цен на все товары.

30000 руб.

13.11.2017    77898    40    11    

46
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. insurgut 207 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 120 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) добавить его в самом конце!
Оставьте свое сообщение