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


Позволяет грузить выписки из Сбербанка онлайн в автоматическом режиме.
Требуется один раз авторизация по СМС при начале работы системы.

Идея взята из этой публикации Загрузка выписок в УНФ  и адаптирована под УТ 11 

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

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

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

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

 

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

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

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

4. Добавляем в удобное для вас место на форме. (смотри скриншот )

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


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

// Делаем отметку счетов для загрузки
Для каждого Счет Из Объект.БанковскиеСчета Цикл
Если Счет.Загружается Тогда
Продолжить;
КонецЕсли;
Если Счет.ПрямойОбмен Тогда
Счет.Пометка = Истина;
КонецЕсли;
КонецЦикла;
//Программно нажимаем кнопку запросить выписку
ИмяНужнойКоманды = "ЗагрузитьДокументы";
// Тут просто имя команды как в конфигураторе.
НужнаяКоманда = ЭтаФорма.Команды.Найти(ИмяНужнойКоманды); // Находим команду на форме
ЗагрузитьДокументы(НужнаяКоманда);
КонецПроцедуры


&НаКлиенте
&После ("ЗавершитьЗагрузку")
Процедура РоботСбербанк_После_ЗавершитьЗагрузку()

// Если у нас установлен Таймер повторного запроса выписки
Если Таймер > 0  тогда
ПодключитьОбработчикОжидания("РоботСбербанк_ЗапроситьЭлектроннуюВыпискуБанка", Таймер, Истина); // Устанавливаем Таймер на повторную загрузку выписки.
возврат;
КонецЕсли;

КонецПроцедуры

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

7. Вставляем в модуль код, чтобы убрать не нужный интерактивный вопрос.

&Вместо ("ПослеФормированияИОтправкиЗапросовВыпискиСбербанк")

// Асинхронный обработчик, вызываемый из ОбменСБанкамиКлиент.ПолучитьВыпискуБанка
//
// Параметры:
//  Результат - Структура - см. описание в ДлительныеОперацииКлиент.ОжидатьЗавершение
//  ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения.
//
Процедура РоботСбербанк_ПослеФормированияИОтправкиЗапросовВыпискиСбербанк(Результат, ДополнительныеПараметры) Экспорт

ПараметрыЖурналирования = ОбменСБанкамиСлужебныйВызовСервера.ПараметрыЖурналирования(
ДополнительныеПараметры.НастройкаОбмена);

Если ПараметрыЖурналирования.ИспользоватьЖурналирование Тогда
СохранитьЖурналВФайл(ДополнительныеПараметры.НастройкаОбмена, ПараметрыЖурналирования.КаталогДляЖурналирования);
КонецЕсли;

Если Результат = Неопределено Тогда // задание было отменено пользователем
Возврат;
КонецЕсли;

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

КонецЕсли;

КонецПроцедуры

Тестировалось на версии УТ 11.4.8.92

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *