Автоматическая загрузка банковских выписок в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) — один из самых востребованных механизмов для автоматизации ежедневной рутины бухгалтера. Программа самостоятельно анализирует входящий файл из Клиент-Банка (в формате .txt или через систему прямого обмена DirectBank) и автоматически сопоставляет каждую строку с нужным видом операции: «Поступление от покупателя», «Комиссия банка», «Оплата поставщику» и так далее.
Однако для разработчиков и системных интеграторов алгоритм этого сопоставления часто кажется «черным ящиком». При попытке отладить процесс и поймать точку останова в конфигураторе многие сталкиваются с тем, что отладчик просто игнорирует код загрузки, хотя сама выписка успешно импортируется в информационную базу. В этой статье мы подробно разберем, где именно в программном коде скрыта логика распознавания хозяйственных операций, по каким критериям система принимает решение и как правильно настроить отладчик 1С для перехвата этого процесса.
Давайте проанализируем структуру общих модулей конфигурации БП 3.0, отвечающих за импорт банковских документов. Вся ключевая бизнес-логика сосредоточена в двух основных модулях:
ЗагрузкаВыпискиПоБанковскомуСчету. Это «сердце» механизма импорта. Именно здесь происходят чтение файла, разбор текстовых или XML-структур и последующее создание документов.БанковскиеПравила. Данный модуль выступает в роли вспомогательного аналитического центра. Он содержит жестко зашитые таблицы соответствий, алгоритмы разбора расчетных счетов контрагентов и специфические признаки платежей.Разберем по шагам ключевые функции общего модуля ЗагрузкаВыпискиПоБанковскомуСчету, которые участвуют в жизненном цикле загрузки:
СоздатьДокументы() — главная процедура, инициирующая чтение текстового файла выгрузки Клиент-Банка и запускающая конвейер обработки строк.ЗагрузитьСписокDirectBank() — аналогичная стартовая точка, но использующаяся при интеграции по технологии DirectBank, когда данные приходят от банка напрямую в формате XML.ХозяйственнаяОперация() — ключевая функция, внутри которой определяется тип операции для каждого платежа. Внутри этой функции система инициализирует структуру ПравилаОпределенияХозяйственныхОпераций и последовательно сопоставляет данные транзакции с заложенными правилами.#Область РаспознаваниеХозяйственныхОпераций — раздел модуля, в котором сгруппированы все вспомогательные функции анализа. Именно здесь программа пытается «догадаться», к какому виду учета относится платеж, если стандартные правила не дали однозначного ответа.Поскольку в выгружаемых банками файлах отсутствует прямое указание на реквизит «Вид операции» в терминах 1С, система вынуждена вычислять его на лету. Для этого алгоритм анализирует три ключевых параметра платежа:
В банковских реестрах каждому типу платежного поручения соответствует определенный двузначный код. Система считывает этот код из файла и использует его как первичный ориентир:
01 (платежное поручение) — по умолчанию интерпретируется программой как стандартные расчеты: «Оплата поставщику» (при списании со счета) или «Оплата от покупателя» (при поступлении средств).03 (чек) — автоматически классифицируется алгоритмом как операция «Снятие наличных».17 (банковский ордер) — чаще всего сигнализирует системе о внутренних транзакциях кредитной организации, что приводит к автоматическому выбору вида операции «Комиссия банка».Этот метод является одним из наиболее надежных и точных критериев для алгоритма 1С. Программа детально анализирует структуру расчетного счета получателя или отправителя платежа. Например:
20202 (касса кредитных организаций) или 20208 (денежные средства в банкоматах), система безошибочно устанавливает вид операции «Инкассация» или «Взнос наличными».ХозяйственнаяОперацияВыручкаРозничнойТорговлиЧерезПосредника().Если первые два шага не дали точного ответа, система переходит к интеллектуальному разбору назначения платежа и сопоставлению контрагентов по ИНН/КПП:
Часто разработчики сталкиваются с проблемой: точка останова установлена в общем модуле ЗагрузкаВыпискиПоБанковскомуСчету в области РаспознаваниеХозяйственныхОпераций, база файловая, отладка запущена, но при нажатии кнопки «Загрузить» программа выполняет импорт без остановки на контрольных точках.
Выясним причину такого поведения среды разработки. Дело в том, что в современных версиях 1С:Бухгалтерия 3.0, разработанных на базе Библиотеки Стандартных Подсистем (БСП), все тяжелые и длительные процессы выполняются асинхронно в фоновом режиме. Для этого вызываются механизмы БСП вида ДлительныеОперации.ВыполнитьВФоне() или многопоточные функции ДлительныеОперации.ВыполнитьФункциюВНесколькоПотоков().
Когда вы запускаете загрузку выписки, основной сеанс пользователя («Тонкий клиент» или «Толстый клиент») лишь визуально отображает шкалу прогресса, в то время как непосредственный импорт и разбор файла выполняются в отдельном, изолированном фоновом процессе на сервере (даже на файловой базе этот процесс эмулируется платформой в фоновом задании). Стандартный сеанс отладки по умолчанию не подключен к этому фоновому процессу, поэтому точки останова игнорируются.
Чтобы заставить отладчик останавливаться внутри процедур распознавания хоз. операций, выполним следующие действия по шагам:
Нам необходимо явно указать отладчику 1С, что он должен перехватывать новые процессы, создаваемые платформой в фоне:
Для файловой базы данных этого шага достаточно. Запустите отладку (клавиша F5). Теперь при инициации импорта выписки платформа автоматически подключит отладчик к созданному фоновому заданию, и выполнение программы прервется на вашей точке останова.
Для клиент-серверного варианта работы базы данных убедитесь, что на сервере приложений 1С:Предприятие запущен режим отладки. В строке запуска службы сервера обязательно должен присутствовать ключ -debug. Без этого ключа сервер не будет транслировать отладочную информацию, и подключить фоновые задания не удастся.
Давайте посмотрим на упрощенный пример того, как мы можем программно перехватить или проанализировать правила, по которым система сопоставляет платежи. Мы можем установить точку останова в функции ХозяйственнаяОперация() общего модуля ЗагрузкаВыпискиПоБанковскомуСчету и проанализировать структуру входящих данных с помощью Табло или Вычисления выражений:
// Пример структуры данных, анализируемой при определении операции
СтруктураПлатежа = Новый Структура;
СтруктураПлатежа.Вставить("ВидОплаты", "17"); // Банковский ордер
СтруктураПлатежа.Вставить("НазначениеПлатежа", "Комиссия за расчетно-кассовое обслуживание по тарифу");
СтруктураПлатежа.Вставить("СчетКонтрагента", "40702810000000001234");
СтруктураПлатежа.Вставить("КонтрагентИНН", "7701234567");
// Система обращается к правилам определения:
ВидОперации = ОпределитьОперациюПоПравилам(СтруктураПлатежа);
Если вам требуется внести изменения в логику автоматического определения (например, ваша организация использует специфические балансовые счета или ключевые слова в назначении платежа), рекомендуется использовать механизм Дополнительных отчетов и обработок или расширения конфигурации, чтобы не снимать типовую конфигурацию с поддержки. Через механизм подписок на события или переопределяемые модули БСП вы сможете скорректировать заполненный вид операции непосредственно перед записью созданного документа в базу данных. Для контроля результатов таких изменений и выявления расхождений в проводках между доработанной и эталонной базами применяется программа автоматической сверки бухгалтерских проводок.