Вид операций в банковской выписке
Попросили меня на днях подсказать, как программа при загрузке банковских выписок определяет вид операции ‘КомиссияБанка’. Я сказал: дайте мне 10 минут и я все выясню! Но только спустя пару часов я смогу разобраться в этом вопросе. Даже поиск в интернете не выдал мне нужного ответа.
Как оказалось – механизм определения видов операций при загрузке банковской выписки это черный ящик, в котором не так-то просто разобраться.
И так, давай рассмотрим где же все таки хранятся эти срытые от всего мира механизмы. Имеем:
- Конфигурацию: ‘Бухгалтерия предприятия, редакция 3.0 БИТ.ФИНАНС 3.1’;
- Задачу: как программа определяет по данным из банковских выписок вид операции ‘КомиссияБанка’?
Бесконечная отладка и замеры производительности в конечном итоге вывели меня на функцию ‘ХозяйственнаяОперация‘ в общем модуле ‘ЗагрузкаВыпискиПоБанковскомуСчету‘:

И в этой функции есть вызов не менее интересной функции ‘ВыполнитьПравилоОпределенияХозяйственнойОперации‘, в которой собственно и происходит все самое интересное:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
&НаКлиенте Функция ВыполнитьПравилоОпределенияХозяйственнойОперации(Параметры, Правило, ПроверитьПрименимостьПравила) Параметры.Правило = Правило; Параметры.ПроверитьПрименимостьПравила = ПроверитьПрименимостьПравила; Параметры.ПротоколыВыбораСсылок.Очистить(); Если Правило.ПоступилоСписано = "Поступило" Тогда РезультатОпределенияХозяйственнойОперации = ХозяйственнаяОперацияПоступило(Параметры); Иначе РезультатОпределенияХозяйственнойОперации = ХозяйственнаяОперацияСписано(Параметры); КонецЕсли; Если РезультатОпределенияХозяйственнойОперации.Определена Тогда УстановитьПоказателиРасчетов(РезультатОпределенияХозяйственнойОперации.ХозяйственнаяОперация, Параметры); УстановитьПоказателиНДС(РезультатОпределенияХозяйственнойОперации.ХозяйственнаяОперация, Параметры); УстановитьБанковскийСчетКонтрагента(РезультатОпределенияХозяйственнойОперации.ХозяйственнаяОперация, Параметры); Если Не РезультатОпределенияХозяйственнойОперации.ХозяйственнаяОперация.Свойство("СтатьяДвиженияДенежныхСредств") Тогда УстановитьСтатьюДвиженияДенежныхСредств(РезультатОпределенияХозяйственнойОперации.ХозяйственнаяОперация, Параметры); КонецЕсли; // Для ссылок на новые объекты, установленных в ХозяйственнаяОперация, дозаполним из выписки значения реквизитов ЗаполнитьРеквизитыНовыхОбъектов( Параметры.УчастникиОпераций, РезультатОпределенияХозяйственнойОперации.ХозяйственнаяОперация, Параметры.Операция, Параметры.ИсточникиСсылок, Параметры.ВладелецСчета, Параметры.КешОбщихПараметров.РеквизитыНовыхОбъектовИнформационнойБазы); КонецЕсли; Возврат РезультатОпределенияХозяйственнойОперации; КонецФункции |
Здесь же стоит обратить внимание на две функции ‘ХозяйственнаяОперацияПоступило‘ и ‘ХозяйственнаяОперацияСписано‘, в которых собственно и происходит определение вида операции по параметрам платежа:

Эти функции со вспомогательными методами описаны в соответствующих областях ‘Списано’ и ‘Поступило’:
Вот описание этих функций:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
&НаКлиенте Функция ХозяйственнаяОперацияСписано(Параметры) // Эти правила должны быть объявлены в ЗаполнитьПредопределенныеПравилаОпределенияХозяйственныхОпераций() Если Параметры.Правило.Имя = "Налог" Тогда Возврат ХозяйственнаяОперацияНалог(Параметры); ИначеЕсли Параметры.Правило.Имя = "СнятиеНаличных" Тогда Возврат ХозяйственнаяОперацияСнятиеНаличных(Параметры); ИначеЕсли Параметры.Правило.Имя = "КомиссияБанка" Тогда Возврат ХозяйственнаяОперацияКомиссияБанка(Параметры); ИначеЕсли Параметры.Правило.Имя = "ВыводПредпринимателемЛичныхСредств" Тогда Возврат ХозяйственнаяОперацияВыводПредпринимателемЛичныхСредств(Параметры); ИначеЕсли Параметры.Правило.Имя = "ПереводНаДругойСчет" Тогда Возврат ХозяйственнаяОперацияПереводМеждуСобственнымиСчетами(Параметры); ИначеЕсли Параметры.Правило.Имя = "ЗаработнаяПлата" Или Параметры.Правило.Имя = "ЗаработнаяПлатаПоВедомости" Тогда Возврат ХозяйственнаяОперацияЗаработнаяПлата(Параметры); ИначеЕсли Параметры.Правило.Имя = "ОплатаИзвестномуПоставщику" Тогда Возврат ХозяйственнаяОперацияПоВидуДоговора(Параметры); ИначеЕсли Параметры.Правило.Имя = "ПрочиеВыплатыКонтрагентам" Тогда Возврат ХозяйственнаяОперацияПоВидуДоговора(Параметры); ИначеЕсли Параметры.Правило.Имя = "ВозвратПокупателю" Тогда Возврат ХозяйственнаяОперацияПоВидуДоговора(Параметры); ИначеЕсли Параметры.Правило.Имя = "ДругиеПлатежиГосОрганам" Тогда Возврат ХозяйственнаяОперацияДругиеПлатежиГосОрганам(Параметры); ИначеЕсли Параметры.Правило.Имя = "ОплатаНовомуПолучателюПрочихВыплат" Тогда Возврат ХозяйственнаяОперацияОплатаНовомуПолучателюПрочихВыплат(Параметры); ИначеЕсли Параметры.Правило.Имя = "ОплатаНовомуПоставщику" Тогда Возврат ХозяйственнаяОперацияОплатаНовомуПоставщику(Параметры); Иначе Возврат НовыйРезультатОпределенияХозяйственнойОперации(); КонецЕсли; КонецФункции Функция ХозяйственнаяОперацияПоступило(Параметры) // Эти правила должны быть объявлены в ЗаполнитьПредопределенныеПравилаОпределенияХозяйственныхОпераций() Если Параметры.Правило.Имя = "ПоступлениеНаличныхВБанк" Тогда Возврат ХозяйственнаяОперацияПоступлениеНаличныхВБанк(Параметры); ИначеЕсли Параметры.Правило.Имя = "ВыручкаРозничнойТорговлиЧерезПосредника" Тогда Возврат ХозяйственнаяОперацияВыручкаРозничнойТорговлиЧерезПосредника(Параметры); ИначеЕсли Параметры.Правило.Имя = "ВнесениеПредпринимателемЛичныхСредств" Тогда Возврат ХозяйственнаяОперацияВнесениеПредпринимателемЛичныхСредств(Параметры); ИначеЕсли Параметры.Правило.Имя = "ПереводССобственногоСчета" Тогда Возврат ХозяйственнаяОперацияПереводМеждуСобственнымиСчетами(Параметры); ИначеЕсли Параметры.Правило.Имя = "ОплатаОтИзвестногоПокупателя" Тогда Возврат ХозяйственнаяОперацияПоВидуДоговора(Параметры); ИначеЕсли Параметры.Правило.Имя = "ПрочиеПоступленияОтКонтрагентов" Тогда Возврат ХозяйственнаяОперацияПоВидуДоговора(Параметры); ИначеЕсли Параметры.Правило.Имя = "ВозвратОтПоставщика" Тогда Возврат ХозяйственнаяОперацияПоВидуДоговора(Параметры); ИначеЕсли Параметры.Правило.Имя = "ОплатаОтНовогоПокупателя" Тогда Возврат ХозяйственнаяОперацияОплатаОтНовогоПокупателя(Параметры); Иначе Возврат НовыйРезультатОпределенияХозяйственнойОперации(); КонецЕсли; КонецФункции |
Ну и собственно ответ на сам вопрос про ‘КомиссиюБанка’:

В этих трех функциях ‘ЭтоСчетДоходовБанка‘, ‘ЭтоСчетРасчетовСБанком‘, ‘ЭтоБанковскийОрдер‘ общего модуля [БанковскиеПравила] и происходит определение данного вида операции по переданным параметрам:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
&НаКлиенте Функция ЭтоСчетДоходовБанка(БалансовыйСчет) Экспорт Возврат БалансовыйСчет = "70601" // Доходы (банка) Или БалансовыйСчет = "61301" // Доходы (банка) будущих периодов по кредитным операциям Или БалансовыйСчет = "61304"; // Доходы (банка) будущих периодов по другим операциям КонецФункции Функция ЭтоСчетРасчетовСБанком(БалансовыйСчет) Экспорт Возврат БалансовыйСчет = "47423"; // Требования по прочим операциям - "отражаются требования кредитной организации" КонецФункции Функция ЭтоБанковскийОрдер(ШифрОперации) Экспорт Возврат ШифрОперации = 17; // 17 - Списано, зачислено по банковскому ордеру КонецФункции |
Надеюсь данная информацию кому-нибудь пригодится, так как в интернете я не нашел ни одного полезного совета о том где смотреть или хотя бы где копать. Алгоритм этот я думаю в разных конфигурациях от 1с должен быть одинаков, ну или с небольшими изменениями в зависимости от версии, релиза и т.д.
Зная теперь где находится этот черный ящик, можно без труда с помощью отладки посмотреть алгоритмы для описанных видов операций.