Автоматическая загрузка выписок Сбербанк-бизнес онлайн с помощью 1С:ДиректБанк

Обмен - Обмен с интернет-банком

На примере Управление нашей фирмой, редакция 1.6 (1.6.13.48) и Сбербанк Бизнес Онлайн с использованием СМС авторизаций. Простой способ автоматизировать рутинную работу по загрузке выписок с помощью 1С:ДиректБанк, без снятия с поддержки и изменения метаданных. Способ подходит в том числе и для базовой версии. 

Принцип работы 1С:ДиректБанк: 
Запрашиваем выписку, авторизовываемся, подтверждаем авторизацию СМС паролем и получаем выписку. Все хорошо работает, но для того что бы спустя время повторно получить выписку, приходится опять проходить авторизацию.
Само подключение подключение к 1С:ДиректБанк - не рассматриваем, так как в интернете полно инструкций, да и встроенная обработка по подключению полностью автоматизирована.

О способе: 
Эмпирически было замечено, что сбербанк после авторизации для получения выписки инициирует vpn соединение и завершает сессию при отсутствии активности спустя некоторого времени. Так что мы будем использовать эту особенность для многократного получения выписок, по сути постоянно генерируем активность в сессии не давай ей закрыться.
В общем этот способ хоть и костыль, но позволяет нам оперативно видеть движения по расчетному счету и минимизировать человеческий фактор.

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

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

Добавленный или измененный код обернут в "////", большая часть изменений связана с отключением вывода предупреждений и прочих окон. Можете по этому принципе доработать любую типовую конфигурацию. 

1. Добавляем новое расширением, называем как хотим и снимаем оба флажка в списке расширений.

2. Добавляем в расширение форму "Обработка.КлиентБанк.ФормаЗагрузка"

3. В расширяемой форме, добавляем новый реквизит "Таймер", тип Число. Установка Таймера - будет отключать все. Для удобства включаем у реквизита "Таймер" флаг "Сохранения", что бы значение таймера сохранялось.

4. Добавляем в удобное для вас место на форме, я добавил между кнопками запросить выписку и настройки. (скриншот 1cv8c_2018-03-14_17-26-28.png)

5. Вставляем код в модуль расширяемой формы  "Обработка.КлиентБанк.ФормаЗагрузка"

 
 //  Эту процедура инициирует создание и если настроено, проведение документов на основе загруженной выписки. 
// в этой процедур мы отключаем все окна, предупреждения и прочие открываемые формы
&Вместо("ЗагрузитьВыполнить")
&НаКлиенте
Процедура hands_center_ЗагрузитьВыполнить(Команда)
    
    ПослеЗагрузкиВыписокВ1С = Истина;
    
    Если НЕ ПроверитьЗаполнениеРеквизитовФормы() Тогда
        
        Возврат;
        
    КонецЕсли;
    
    Если Объект.Загрузка.Количество() > 0 Тогда
        
        ЕстьОтмеченныеСтроки = Ложь;
        Для Каждого ТекущаяСтрока Из Объект.Загрузка Цикл
            Если ТекущаяСтрока.Загружать Тогда
                ЕстьОтмеченныеСтроки = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        Если Не ЕстьОтмеченныеСтроки Тогда
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = НСтр("ru = 'Не отмечено ни одной строки! Выписки не будут загружены. Нужно установить отметку в загружаемых строках и нажать кнопку еще раз.'");
            Сообщение.Поле = "Объект.Загрузка[0].Загружать";
            Сообщение.Сообщить();
            Возврат;
        КонецЕсли;
        
        ТаблицаРезультата.Очистить();
        
        Состояние(
            НСтр("ru='Выполняется загрузка выписки из файла в 1С...'"),
            ,
            НСтр("ru='Пожалуйста, подождите'"),
            БиблиотекаКартинок.ЗагрузкаДанных32
        );
        
        СтруктураДанныхЗагрузки = ЗагрузитьВыполнитьНаСервере();
        
        Если СтруктураДанныхЗагрузки.Свойство("ТекстПредупреждения") И НЕ ПустаяСтрока(СтруктураДанныхЗагрузки.ТекстПредупреждения) Тогда
            ПоказатьПредупреждение(Неопределено, СтруктураДанныхЗагрузки.ТекстПредупреждения);
        КонецЕсли;
        
        ПараметрыЗавершения = Новый Структура("ЕстьПредупржедения, ОбработаноСтрок, ВсегоСтрок, СообщенияПользователю", 
        СтруктураДанныхЗагрузки.ЕстьПредупржедения, СтруктураДанныхЗагрузки.ОбработаноСтрок, СтруктураДанныхЗагрузки.ВсегоСтрок, СтруктураДанныхЗагрузки.СообщенияПользователю);
        
        ////Добавляем дополнительное условие вывода предупреждений, пусть только когда отключена автозагрузка
        Если Таймер > 0 Тогда
            возврат
        КонецЕсли;
        ////    
        #Если ВебКлиент Тогда
            
            ЛеваяЧастьПредупреждения = "Загрузка платежных документов завершена";
            ПраваяЧастьПредупреждения = НСтр("ru = 'Обработано строк: '")+ПараметрыЗавершения.ОбработаноСтрок+НСтр("ru = '. Всего строк: '")+ПараметрыЗавершения.ВсегоСтрок+".";
            ТекстПредупреждения = ЛеваяЧастьПредупреждения + Символы.ПС + Символы.ПС + ПраваяЧастьПредупреждения;
            ПоказатьПредупреждение(Неопределено, ТекстПредупреждения);
            
            РезультатЗавершения = Неопределено; // Новый Структура("ПоказатьПротокол", Истина);
            ЗагрузкаПлатежныхДокументовЗавершение(РезультатЗавершения, ПараметрыЗавершения);
            
        #Иначе
            
            ОписаниеОповещенияЗагрузкиПлатежныхДокументов = Новый ОписаниеОповещения("ЗагрузкаПлатежныхДокументовЗавершение", ЭтотОбъект, ПараметрыЗавершения);
            ОткрытьФорму("Обработка.КлиентБанк.Форма.ФормаЗагрузкаДокументовЗавершена",
            ПараметрыЗавершения,
            ,,,,ОписаниеОповещенияЗагрузкиПлатежныхДокументов, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
            
        #КонецЕсли
        
    Иначе
        ////Добавляем дополнительное условие вывода предупреждений, пусть только когда отключена автозагрузка
        Если Таймер > 0 Тогда
            возврат
        КонецЕсли;
        ////    
        ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Список документов для загрузки пуст.'"));
        
    КонецЕсли;
    
КонецПроцедуры // ЗагрузитьВыполнить()


//// Эта процедура выполняется после получения загруженных выписок
//// Вносим внее изменения для того что отключить все всплывающие окна и предупреждения, когда у нас включен таймер

&Вместо("ПрочитатьЭлектронныеВыпискиБанка")
&НаКлиенте
Процедура hands_center_ПрочитатьЭлектронныеВыпискиБанка()
    
    СтекОповещений = Новый Массив;
    ТекстПредупреждения = "";
    
    ИмпортТекстДляРазбора = "";
    Для каждого ЭлементСписка Из ВыпискиБанка Цикл
        ТекстВыписки = ПрочитатьЭлектроннуюВыпискуБанкаНаСервере(ЭлементСписка.Значение, СтекОповещений);
        ИмпортТекстДляРазбора = ИмпортТекстДляРазбора + Символы.ПС + ТекстВыписки;
    КонецЦикла;
    
    Если Не ЗначениеЗаполнено(ИмпортТекстДляРазбора) Тогда
        ТекстСообщения = НСтр("ru = 'Файл загрузки не содержит данных!'");
        УправлениеНебольшойФирмойКлиент.СообщитьОбОшибке(ЭтаФорма, ТекстСообщения);
        Возврат;
    КонецЕсли;
    
    СтрокаСообщения = ЗаполнитьДокументыНаИмпорт(ИмпортТекстДляРазбора);
    Если ЗначениеЗаполнено(СтрокаСообщения) Тогда
        ТекстПредупреждения = ТекстПредупреждения + ?(ЗначениеЗаполнено(ТекстПредупреждения), Символы.ПС, "") + СтрокаСообщения;
    КонецЕсли;
    
    Для каждого Сообщение Из СтекОповещений Цикл
        УправлениеНебольшойФирмойКлиент.СообщитьОбОшибке(ЭтаФорма, Сообщение.Текст);
    КонецЦикла;
    
    //// Если у нас установлен Таймер повторного запроса выписки
    Если Таймер > 0  тогда
        ЗагрузитьВыполнить(Неопределено); //// запускаем обработку документов выписки
        ПодключитьОбработчикОжидания("hands_center_ЗапроситьЭлектроннуюВыпискуБанка", Таймер, Истина); //// Устанавливаем Таймер на повторную загрузку выписки.
        возврат;
    КонецЕсли;
    //// 
    
    Если ЗначениеЗаполнено(ТекстПредупреждения) Тогда
        ПоказатьПредупреждение(Неопределено, ТекстПредупреждения);
    КонецЕсли;
    
    
КонецПроцедуры

//// "нажимаем" кнопку "Запросить выписку" 
&НаКлиенте
Процедура hands_center_ЗапроситьЭлектроннуюВыпискуБанка() экспорт
    ЗапроситьЭлектроннуюВыпискуБанка(Неопределено);    
КонецПроцедуры

 

6. Добавляем в расширение "ОбщийМодуль.ОбменСБанкамиСлужебныйКлиент"

7. Вставляем в модуль код, вносимые изменения выделены

 
 //// Подменяем стандартную процедуру выполняемую после авторизации клиент-банка

&Вместо("ПослеФормированияИОтправкиЗапросовВыпискиСбербанк")
Процедура хц_ПослеФормированияИОтправкиЗапросовВыпискиСбербанк(Результат, ДополнительныеПараметры) Экспорт
    
    ПараметрыЖурналирования = ОбменСБанкамиСлужебныйВызовСервера.ПараметрыЖурналирования(
        ДополнительныеПараметры.НастройкаОбмена);
        
    Если ПараметрыЖурналирования.ИспользоватьЖурналирование Тогда
        СохранитьЖурналВФайл(ДополнительныеПараметры.НастройкаОбмена, ПараметрыЖурналирования.КаталогДляЖурналирования);
    КонецЕсли;
    
    Если Результат = Неопределено Тогда // задание было отменено пользователем
        Возврат;
    КонецЕсли;
    
    Если Результат.Статус = "Ошибка" Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.КраткоеПредставлениеОшибки);
    Иначе // выполнено
        РезультатОперации = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
        
        
        Если РезультатОперации.ГотовыеВыписки.Количество() 
            //// Добавляем дополнительное условия, для вывода вопроса о повторной загрузке выписки
            и ДополнительныеПараметры.Владелец.Таймер = 0 
            ////
            Тогда 
            ДополнительныеПараметры.Вставить("ГотовыеВыписки", РезультатОперации.ГотовыеВыписки);
            ОписаниеОповещенияОЗавершении = Новый ОписаниеОповещения(
                "ПолучитьВыпискуСбербанкаПослеВопросаОбИхНаличии", ЭтотОбъект, ДополнительныеПараметры);
            ТекстВопроса = НСтр("ru = 'В базе уже есть выписки банка за указанный период.
                                    |Загрузить выписки из базы или получить новые из банка?'");
            Кнопки = Новый СписокЗначений;
            Кнопки.Добавить(Истина, НСтр("ru = 'Загрузить из базы'"));
            Кнопки.Добавить(Ложь, НСтр("ru = 'Получить из банка'"));
            Заголовок = НСтр("ru = 'Получение выписки'");
            ПоказатьВопрос(ОписаниеОповещенияОЗавершении, ТекстВопроса, Кнопки, , Истина, Заголовок);
            
        //// Если уже есть загруженные выписки, но включен таймер сразу переходим к получению новой выписки
        ИначеЕсли РезультатОперации.ГотовыеВыписки.Количество() 
            и ДополнительныеПараметры.Владелец.Таймер > 0 Тогда
               ПолучитьВыпискуСбербанкаПослеВопросаОбИхНаличии(Ложь, ДополнительныеПараметры);
        ////               
        ИначеЕсли РезультатОперации.МассивТикетов.Количество() Тогда // запросы были отправлены в банк и получены тикеты
            ВладелецФормы = ДополнительныеПараметры.Владелец;
            ПараметрыФормы = Новый Структура("МассивСообщенийОбмена, НастройкаОбмена, ГотовыеВыписки, ДатаНачала, ДатаОкончания,
                                            |ПринудительноеПолучениеВыписки, НомерСчета");
            ЗаполнитьЗначенияСвойств(ПараметрыФормы, ДополнительныеПараметры);
            ПараметрыФормы.Вставить("ВидОперации", "ПолучениеВыписки");
            ПараметрыФормы.Вставить("МассивТикетов", РезультатОперации.МассивТикетов);
            ПараметрыФормы.Вставить("МассивСообщенийОбмена", РезультатОперации.МассивСообщенийОбмена);
            ПараметрыФормы.Вставить("ГотовыеВыписки", Новый Массив);
            ОткрытьФорму("Обработка.ОбменСБанками.Форма.ЗапросВБанк", ПараметрыФормы, ВладелецФормы);
        ИначеЕсли РезультатОперации.ИспользуетсяТокен Тогда
            ДополнительныеПараметры.Вставить("ГотовыеВыписки", Новый Массив);
            ДополнительныеПараметры.Вставить("МассивСообщенийОбмена", РезультатОперации.МассивСообщенийОбмена);
            ОбработчикПослеПодписания = Новый ОписаниеОповещения(
                "ОтправитьЗапросВыпискиПослеПодписанияСбербанк", ЭтотОбъект, ДополнительныеПараметры);
            ПодписатьЭДСбербанк(
                ОбработчикПослеПодписания, ДополнительныеПараметры.НастройкаОбмена, РезультатОперации.МассивСообщенийОбмена);
        Иначе //отправка по логину, требуется установка сессии.
            ДополнительныеПараметры.Вставить("МассивСообщенийОбмена", РезультатОперации.МассивСообщенийОбмена);
            Обработчик = Новый ОписаниеОповещения(
                "ПолучитьВыпискиПослеБазовойАутентификацииСбербанк", ЭтотОбъект, ДополнительныеПараметры);
            ВыполнитьБазовуюАутентификациюСбербанк(Обработчик, ДополнительныеПараметры.РеквизитыНастройкиОбмена.ИмяВнешнегоМодуля,
                ДополнительныеПараметры.НастройкаОбмена, ДополнительныеПараметры.НастройкаОбмена);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

 

Для себя я установил таймер в 600 секунд. Прошел день, все работает!

Скачать файлы

Наименование Файл Версия Размер
Автоматическая загрузка выписок Сбербанк-бизнес онлайн с помощью 1С:ДиректБанк:
.cfe 80,96Kb
15.03.18
4
.cfe 0.001 80,96Kb 4 Скачать

См. также

Комментарии
1. Олеся Пономарева (Proplus74) 20.04.18 21:48 Сейчас в теме
можно как-то запустить без программирования?
2. Сергей Коробочкин (handscenter) 2 23.04.18 09:24 Сейчас в теме
расширение прикреплено, но я его не проверял на последней версии УНФ
Оставьте свое сообщение