Автоматическое разнесение платежей по заказам/счетам на примере УТ 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С:Предприятие 8 1C:Бухгалтерия Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

5000 руб.

18.03.2019    121877    80    115    

202

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

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

15.12.2015    182426    1231    biz-intel    374    

416

Оптовая торговля Розничная торговля НДС 22% 1С 8.3 1С:Управление торговлей 10 Россия Платные (руб)

Пакет обновлений и продолжения поддержки Управление торговлей, редакция 10.3.- обновление которое предоставляет пользователям новые функции, исправления ошибок и т.д.

14640 руб.

19.12.2025    6591    66    40    

63

SALE! 30%

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

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

8000 7200 руб.

09.11.2016    272417    1203    957    

1114

Взаиморасчеты Бухгалтер Пользователь 1С:Предприятие 8 1С:Управление нашей фирмой 3.0 Россия Бухгалтерский учет НДС Платные (руб)

Расширение позволяет использовать отдельную нумерацию с префиксом "А" для счетов-фактур на аванс в конфигурации Управление Нашей Фирмой

5084 руб.

03.10.2025    3613    61    4    

60

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

Полнофункциональное расширение для формирования и ведения учета перевозочных документов всех видов (ТН, ТТН, ЭТрН). Печать документов или отправка через ЭПД (Электронный перевозочный документооборот). Поддержка регистрации нескольких перевозок на одну финансовую реализацию (в виде УПД, например), а также одной перевозки на основании нескольких финансовых реализаций. Формирование всех сопроводительных документов из одной отгрузки. Формирование реестра грузосопроводительных документов, доверенности менеджеров для указания ответственных лиц (руководитель, главный бухгалтер, кладовщик) организации для пользователей ИБ. Гибкая настройка функциональности под потребности организации.

3399 руб.

18.04.2017    54048    291    43    

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

P.S. Ведение взаиморасчетов по заказам - зло. В подавляющем большинстве случаев менеджеры даже не понимают для чего это надо.
2. ik-mercury 8 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 125 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) добавить его в самом конце!
Для отправки сообщения требуется регистрация/авторизация